2012-04-03 17 views
8

He transferido recientemente mi proyecto Qt de qmake a CMake. Mi programa principal contiene un valor que depende de una directiva #define.Cómo construir un programa con 2 valores diferentes de una variable en CMake

Quiero especificar que se defina la directiva externamente a través de CMake y compilar 3 versiones con nombres diferentes del mismo ejecutable.

¿Cómo debo hacerlo?

He visto set_target_properties pero esto solo funciona para bibliotecas y no para archivos ejecutables.

Por ejemplo, yo quiero que el siguiente programa,

int main() 
{ 

    cout << BUILDTYPE << endl; 
} 

es compilado en 3 sabores diferentes (3 ejecutables) basado en el BUILDTYPE "define" Por ejemplo en mi CMakeLists.txt quiero especificar

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

pero esta no es la sintaxis correcta. ¿Alguna pista? y obtengo 3 ejecutables que imprime

Respuesta

9

¿Está seguro de que set_target_properties no funciona? ¿Qué tal este:

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

o:

set_target_properties(myAppV1 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=1") 

En mi máquina funciona:

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

¡Gracias! tengo que mover los set_target_properties después de la add_executable y utilizarlo en la segunda versión que escribió add_executable (main.cpp myAppv1) set_target_properties (myAppV1 ​​PROPIEDADES COMPILE_DEFINITIONS "buildtype = 1") pero no de esta manera add_executable (myAppv1 main.cpp) set_target_properties (myAppV1 ​​PROPERTIES COMPILE_DEFINITIONS "-DBUILDTYPE = 1") – linello

0

Otra forma podría ser:

mkdir two directory 
buildflavor1 
buildflavor2 

En el primer sub ejecución de directorio:

cmake -DFLAVOR=OPTION1 .. 

en la segunda pasada:

run cmake -DFLAVOR=OPTION2 .. 

por lo que dos ejecutables con el mismo nombre con diferente bandera de compilación con función propia es .o y así sucesivamente.

Cuestiones relacionadas