2011-12-19 20 views
20

Intento establecer una macro de preprocesador en la línea de comando de CMake. He intentado:¿Cómo definir una macro de preprocesador C++ a través de la línea de comando con CMake?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

pero tampoco es definido cuando compilo ni puedo encontrar el nombre MY_MACRO en los archivos generados por CMake en absoluto, excepto por CMakeCache.txt donde está presente en la forma:

MY_MACRO:UNINITIALIZED=1 

¿Cómo puedo hacerlo?

+1

Si ya resolvió esto, estaría interesado en la solución –

+1

@TimMeyer: No. Aparentemente es imposible. – ybungalobill

+0

@ybungalobill: No puede inyectar macros desde la línea de comandos, solo puede modificar las macros existentes que están definidas en CMakeLists.txt. Además, * set params = -D MY_MACRO = 1 * debe ser * set params = -DMY_MACRO = 1 * – NeoH4x0r

Respuesta

6

Prueba esto: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+3

La mitad funciona de hecho. Sobrescribe el valor de 'CMAKE_CXX_FLAGS'. He intentado '-D CMAKE_CXX_FLAGS ="/DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} "' pero '$ {CMAKE_CXX_FLAGS}' no se ha expandido. ¿Alguien sabe cómo arreglar esto? – ybungalobill

+0

Las cadenas de comillas dobles en la línea de comando se expandirán por bash. Como no tiene una variable de entorno llamada CMAKE_CXX_FLAGS, bash la expande a "", incluso antes de que cmake la vea. Use comillas simples en su lugar. – Tolli

+0

@Tolli que tampoco parece funcionar. Evita que bash expanda la variable, pero cmake tampoco la expande. Pasa el valor literal '/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}' directamente al compilador. – pavon

-5

A menos que tenga una buena razón para no , se debe utilizar ADD_DEFINITIONS(<name>=<value>[, ...]).

Sólo tiene que añadir la siguiente línea a su CMakeLists.txt:

ADD_DEFINITIONS("MY_MACRO=1") 

CMake se hará cargo de la sintaxis de los interruptores (ya sea -D<name>=<value>, o /D<name>=<value>).

+13

la modificación de CMakeLists.txt no cuenta como una solución de línea de comandos. Y sí, tengo una buena razón para no hacer esto. Tengo que automatizar el proceso de compilación, y * no debería * cambiar las fuentes. – ybungalobill

+0

Disculpa por el espacio; Quería agregar una solución de línea de comandos, pero no era exactamente lo que estabas buscando. Sin embargo, hacerlo desde la línea de comando solo hará que tu día sea miserable, créeme. – hiobs

+0

A veces, la línea de comandos es más útil que una aplicación de interfaz gráfica y, a veces, no. Realmente no creo que pueda decir que esto hará que su día sea miserable, ya que realmente depende de la situación, la habilidad del usuario y las preferencias personales. – NeoH4x0r

14

Una buena alternativa sería definir una opción cmake:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

Seguido por una condición:

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

A continuación, puede convertir esa opción ON/OFF a través de línea de comandos con cmake utilizando el -D bandera. Ejemplo:

cmake -DDEFINE_MACRO=OFF .. 

Para asegurarse de que el compilador está recibiendo la derecha definición, puede llamar a hacer en modo detallado y comprobar si la macro está definida o no:

make VERBOSE=1 

Ésta es una buena solución también porque make recompilará su código cuando cambie cualquiera de las opciones de cmake.

+2

Esto requiere modificaciones de CMakeLists, por lo que no es una solución (-1). – ybungalobill

Cuestiones relacionadas