Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Kurles от Июль 30, 2015, 10:25



Название: qbs DEFINES +=
Отправлено: Kurles от Июль 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 замещает предыдущие значения дефайнов.
Хелп.


Название: Re: qbs DEFINES +=
Отправлено: Kurles от Июль 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
   }
 
}
 
Всё еще жду "православного" решения.


Название: Re: qbs DEFINES +=
Отправлено: Пантер от Июль 30, 2015, 11:05
Как люди не извращаются, лишь бы CMake не юзать. )))


Название: Re: qbs DEFINES +=
Отправлено: kuzulis от Июль 30, 2015, 11:22
Код:
    Properties {
        condition: def3 == true
        cpp.defines: outer.concat([ "DEF3" ])
    }


Название: Re: qbs DEFINES +=
Отправлено: Kurles от Июль 30, 2015, 11:30
Код:
    Properties {
        condition: def3 == true
        cpp.defines: outer.concat([ "DEF3" ])
    }
Вот же магия, спасибо! Я почему то вместо outer пытался base использовать...


Название: Re: qbs DEFINES +=
Отправлено: Kurles от Июль 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
   }
 
}
 
Добавляется только один из дефайнов :(


Название: Re: qbs DEFINES +=
Отправлено: kuzulis от Июль 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


Наверно так будет работать, хотя хз..


Название: Re: qbs DEFINES +=
Отправлено: Kurles от Июль 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
}
Хочется чего-то подобного...


Название: Re: qbs DEFINES +=
Отправлено: Авварон от Август 01, 2015, 13:19
Properties не затирает, он работает как if () else if () else, где else - то, что объявлено вне Пропертей.
Группы же работают как if () if () if()
В доке это написано, кстати:)


Название: Re: qbs DEFINES +=
Отправлено: Авварон от Август 01, 2015, 13:22
Properties не затирает, он работает как if () else if () else, где else - то, что объявлено вне Пропертей.
Группы же работают как if () if () if()
В доке это написано, кстати:)

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


Название: Re: qbs DEFINES +=
Отправлено: Kurles от Август 02, 2015, 12:47
Группы же работают как if () if () if()
да, только с группами не работает (или работает не так, как ожидается) такой код:
Код
Javascript
Group {
       condition: def3 == true
       cpp.defines: outer.concat([ "DEF3" ])
   }
 
К глобальным дефайнам DEF3 не добавляется :(


Название: Re: qbs DEFINES +=
Отправлено: Авварон от Август 02, 2015, 15:31
Потому что проперти, заданные в группе, применяются только к файлам в этой группе:) Это тоже написано в доке (хотя сам узнал буквально вчера)


Название: Re: qbs DEFINES +=
Отправлено: Kurles от Август 02, 2015, 21:00
Потому что проперти, заданные в группе, применяются только к файлам в этой группе:) Это тоже написано в доке (хотя сам узнал буквально вчера)
А есть ли решение моей задачи путём, отличным от этого (http://www.prog.org.ru/index.php?topic=29130.msg213487#msg213487)?


Название: Re: qbs DEFINES +=
Отправлено: Авварон от Август 02, 2015, 21:19
Решения короче, думаю, нет. Собственно, жс для того в qml и есть, чтобы делать сложные ф-ии.


Название: Re: qbs DEFINES +=
Отправлено: Авварон от Август 02, 2015, 21:25
Кстати, проскипал ваш пост с вашей задачей. Сделайте продукты статик-либы, в к-ых экспортируйте ваши дефайны и делайте Depends с кондишном от этих продуктов.


Название: Re: qbs DEFINES +=
Отправлено: Авварон от Август 02, 2015, 21:31
Напишите в рассылку qbs, кстати, возможно это полезная фича, делать дефайны в группе глобальными