2012-03-09 16 views
36

¿Cómo puedo pasar una macro al preprocesador? Por ejemplo, si quiero compilar una parte de mi código, porque un usuario quiere compilar prueba de unidad, Me gustaría hacer esto:CMake: Cómo pasar las macros del preprocesador

#ifdef _COMPILE_UNIT_TESTS_ 
    BLA BLA 
#endif //_COMPILE_UNIT_TESTS_ 

ahora tengo que pasar este valor a partir de CMake para el preprocesador. Establecer una variable no funciona, entonces, ¿cómo puedo lograr esto?

+1

No se puede pasar una macro al compilador, las macros son evaluadas por el precompilador antes de que lleguen al compilador. –

+1

¡Lo siento por ser inexacto! Me refiero a MACROS pasado para hacer una compilación condicional. – Killrazor

Respuesta

44

add_definitions(-DCOMPILE_UNIT_TESTS) (cf. CMake's doc) o modificar una de las variables de la bandera (CMAKE_CXX_FLAGS, o CMAKE_CXX_FLAGS_<configuration>) o conjunto COMPILE_FLAGS variable sobre el objetivo.

Además, los identificadores que comienzan con un guión bajo seguido de una letra mayúscula se reservan para la implementación. Identificadores que contienen doble guion bajo, también. Entonces no los uses.

+8

También se puede hacer desde la línea de comando a la 'cmake .. -DCOMPILE_UNIT_TESTS' – dantswain

+8

@dantswain: Eso establece la variable de caché CMake. –

+4

Para agregar una definición solo a objetivos específicos, use [COMPILE_DEFINITIONS] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_dir:COMPILE_DEFINITIONS). Por ejemplo: 'set_target_properties (target1 target2 PROPERTIES COMPILE_DEFINITIONS" COMPILE_UNIT_TESTS ")' – Lesque

15

Si usted tiene una gran cantidad de variables del preprocesador para configurar, puede utilizar configure_file:

Crear un archivo de configuración, por ejemplo. config.h.in con

#cmakedefine _COMPILE_UNIT_TESTS_ 
#cmakedefine OTHER_CONSTANT 
... 

entonces en su CMakeLists.txt:

set(_COMPILE_UNIT_TESTS_ ON CACHE BOOL "Compile unit tests") # Configurable by user 
set(OTHER_CONSTANT OFF) # Not configurable by user 
configure_file(config.h.in config.h) 

en el directorio de construcción, se genera config.h:

#define _COMPILE_UNIT_TESTS_ 
/* #undef OTHER_CONSTANT */ 

Como sugiere robotik, se debe añadir algo así como include_directories(${CMAKE_CURRENT_BINARY_DIR}) a su CMakeLists.txt para #include "config.h" para trabajar en C++.

+1

@ robotik sugiere que necesita 'include_directories ($ {PROJECT_BINARY_DIR})' o de lo contrario CMake no lo encontrará para encontrar el 'config.h' generado. – drs

Cuestiones relacionadas