Russian Qt Forum
Ноябрь 23, 2024, 20:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: qbs DEFINES +=  (Прочитано 11334 раз)
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« : Июль 30, 2015, 10:25 »

Хочется простого: что бы в зависимости от свойств qbs Product'а добавлялись дефайны, по аналогии с qmake'овским "DEFINES +=".

пример: если установлено свойство def3 добавить деафайн DEF3
Вот одна из моих попыток:
Код
Javascript
import qbs
 
CppApplication {
   type: "application" // To suppress bundle generation on Mac
   consoleApplication: true
   property bool def3: true
 
   cpp.staticLibraries: ["stdc++"]
 
   files: "main.cpp"
 
   cpp.defines: ["DEF1", "DEF2"]
 
   Group {     // Properties for the produced executable
       fileTagsFilter: product.type
       qbs.install: true
   }
 
   Properties {
       condition: def3 == true
       cpp.defines: base.concat([ "DEF3" ])
   }
}
 

тестовая программа:
Код
C++ (Qt)
#include <iostream>
 
using namespace std;
 
int main()
{
   cout << "Hello World!" << endl;
#ifdef DEF1
   cout << "def1" << endl;
#endif
 
#ifdef DEF2
   cout << "def2" << endl;
#endif
 
#ifdef DEF3
   cout << "def3" << endl;
#endif
 
   return 0;
}
 
Но вместо ожидаемого результата (определены дефайны DEF1, DEF2 и DEF3) получается что дефайн DEF3 замещает предыдущие значения дефайнов.
Хелп.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Июль 30, 2015, 10:45 »

Придумал костыль, но что то мне кажется, что это реальный костыль.
Код
Javascript
import qbs
 
CppApplication {
   type: "application" // To suppress bundle generation on Mac
   consoleApplication: true
   property bool def3: true
   cpp.staticLibraries: ["stdc++"]
 
   files: "main.cpp"
 
   cpp.defines: {
       var defines = ["DEF1", "DEF2"];
       if (def3) {
           defines = defines.concat(["DEF3"]);
       }
       return defines;
   }
 
   Group {     // Properties for the produced executable
       fileTagsFilter: product.type
       qbs.install: true
   }
 
}
 
Всё еще жду "православного" решения.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Июль 30, 2015, 11:05 »

Как люди не извращаются, лишь бы CMake не юзать. )))
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Июль 30, 2015, 11:22 »

Код:
    Properties {
        condition: def3 == true
        cpp.defines: outer.concat([ "DEF3" ])
    }
Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #4 : Июль 30, 2015, 11:30 »

Код:
    Properties {
        condition: def3 == true
        cpp.defines: outer.concat([ "DEF3" ])
    }
Вот же магия, спасибо! Я почему то вместо outer пытался base использовать...
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #5 : Июль 30, 2015, 12:13 »

Неполная магия Грустный

Код
Javascript
import qbs
 
CppApplication {
   type: "application" // To suppress bundle generation on Mac
   consoleApplication: true
   property bool def3: true
   property bool def4: true
   cpp.staticLibraries: ["stdc++"]
 
   files: ["main.cpp"]
 
   cpp.defines:  ["DEF1", "DEF2"]
 
   Properties {
       condition: def3 == true
       cpp.defines: outer.concat([ "DEF3" ])
   }
 
   Properties {
       condition: def4 == true
       cpp.defines: outer.concat([ "DEF4" ])
   }
 
   Group {     // Properties for the produced executable
       fileTagsFilter: product.type
       qbs.install: true
   }
 
}
 
Добавляется только один из дефайнов Грустный
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Июль 30, 2015, 12:21 »

Значит есть какие-то ограничения или особенности.. Нашел тест в сорцах QBS:

Код:
    Product {
        name: "ambiguous_properties"
        Depends { id: cpp; name: "dummy" }
        cpp.defines: ["ONE"]
        Properties {
            condition: true
            cpp.defines: outer.concat(["TWO"])
        }
        Properties {
            condition: false
            cpp.defines: outer.concat(["IMPOSSIBLE"])
        }
        Properties {    // will be ignored
            condition: true
            cpp.defines: outer.concat(["THREE"])
        }
    }

В общем, разбирайся сам (или в тестах самого QBS-а,в его сорцах или в сорцах QtCreator) Улыбающийся .
Может это баг - а может нет... я никогда не использовал такой хитрый набор пропертей с дефайнами.


UPD: Все правильно, нужно вводить свое дополнительное проперти типа:

Код:

       property baseDefines: ["DEF1", "DEF2"]

        Properties {
            condition: true
            cpp.defines: baseDefines.concat(["DEF3"])
        }

        Properties {
            condition: true
            cpp.defines: baseDefines.concat(["DEF4"])
        }

        cpp.defines: baseDefines


Наверно так будет работать, хотя хз..
« Последнее редактирование: Июль 30, 2015, 12:28 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Июль 30, 2015, 13:14 »

Фиг. Properties затирает пердыдущее значение cpp.defines.
Сделал пока по своему первому варианту, может потом что еще придумаю.

с qmake подобное совсем просто делалось:

Цитировать
CONFIG += MODULE1 MODULE2 MODULE3

MODULE1 {
    DEFINES += MODULE1
    HEADERS += module1.h
    SOURCES+= module1.cpp
}

MODULE2 {
    DEFINES += MODULE2
    HEADERS += module2.h
    SOURCES+= module2.cpp
}

MODULE3 {
    DEFINES += MODULE3
    HEADERS += module3.h
    SOURCES+= module3.cpp
}
Хочется чего-то подобного...
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Август 01, 2015, 13:19 »

Properties не затирает, он работает как if () else if () else, где else - то, что объявлено вне Пропертей.
Группы же работают как if () if () if()
В доке это написано, кстати:)
« Последнее редактирование: Август 01, 2015, 13:21 от Авварон » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Август 01, 2015, 13:22 »

Properties не затирает, он работает как if () else if () else, где else - то, что объявлено вне Пропертей.
Группы же работают как if () if () if()
В доке это написано, кстати:)

Как люди не извращаются, лишь бы CMake не юзать. )))
cmake не нужен
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #10 : Август 02, 2015, 12:47 »

Группы же работают как if () if () if()
да, только с группами не работает (или работает не так, как ожидается) такой код:
Код
Javascript
Group {
       condition: def3 == true
       cpp.defines: outer.concat([ "DEF3" ])
   }
 
К глобальным дефайнам DEF3 не добавляется Грустный
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Август 02, 2015, 15:31 »

Потому что проперти, заданные в группе, применяются только к файлам в этой группе:) Это тоже написано в доке (хотя сам узнал буквально вчера)
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #12 : Август 02, 2015, 21:00 »

Потому что проперти, заданные в группе, применяются только к файлам в этой группе:) Это тоже написано в доке (хотя сам узнал буквально вчера)
А есть ли решение моей задачи путём, отличным от этого?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Август 02, 2015, 21:19 »

Решения короче, думаю, нет. Собственно, жс для того в qml и есть, чтобы делать сложные ф-ии.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Август 02, 2015, 21:25 »

Кстати, проскипал ваш пост с вашей задачей. Сделайте продукты статик-либы, в к-ых экспортируйте ваши дефайны и делайте Depends с кондишном от этих продуктов.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.183 секунд. Запросов: 23.