2012-04-03 9 views
8

Niedawno przeportowałem mój projekt Qt z qmake na CMake. Mój program główny zawiera wartość zależną od dyrektywy #define.Jak zbudować program z 2 różnymi wartościami zmiennej w CMake

Chcę określić, że zdefiniuj dyrektywę zewnętrznie poprzez CMake i zbuduj 3 różnie nazwane wersje tego samego pliku wykonywalnego.

Jak mam to zrobić?

Widziałem set_target_properties, ale działa to tylko dla bibliotek, a nie dla plików wykonywalnych.

Na przykład chcę, że następujący program

int main() 
{ 

    cout << BUILDTYPE << endl; 
} 

to skompilowane w 3 różnych smakach (3 wykonywalne) na podstawie BUILDTYPE "define" na przykład w moim CMakeLists.txt chcę określić

add_executable(myAppV1 -DBUILDTYPE=1) 
add_executable(myAppV2 -DBUILDTYPE=2) 
add_executable(myAppV3 -DBUILDTYPE=3) 

, ale nie jest to poprawna składnia. Podpowiedź? i otrzymuję 3 pliki wykonywalne, które drukują:

Odpowiedz

9

Czy jesteś pewien, że set_target_properties nie działa? Jak o tym jednym:

set_target_properties(myAppV1 PROPERTIES COMPILE_FLAGS "-DBUILDTYPE=1") 

czyli

set_target_properties(myAppV1 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=1") 

Na moim komputerze nie działa:

add_executable(myAppV1 main.cpp) 
add_executable(myAppV2 main.cpp) 
set_target_properties(myAppV1 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=1") 
set_target_properties(myAppV2 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=2") 
+0

Dziękujemy! muszę przenieść set_target_properties po add_executable i używać go w drugiej wersji, którą napisał add_executable (myAppv1 main.cpp) set_target_properties (myAppV1 ​​PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE = 1") ale nie w ten sposób add_executable (myAppv1 main.cpp) set_target_properties (myAppV1 ​​PROPERTIES COMPILE_DEFINITIONS "-DBUILDTYPE = 1") – linello

0

Innym sposobem może być:

mkdir two directory 
buildflavor1 
buildflavor2 

W pierwszym akapicie uruchomienie katalogu:

cmake -DFLAVOR=OPTION1 .. 

w drugim biegu:

run cmake -DFLAVOR=OPTION2 .. 

Więc dwa wykonywalny o takiej samej nazwie z innej kompilacji z flagą jest własna funkcja .o i tak dalej.

Powiązane problemy