2012-03-09 21 views
36

Come posso passare una macro al preprocessore? Ad esempio, se voglio compilare una certa parte del mio codice, perché un utente vuole per compilare test di unità, vorrei fare questo:CMake: come passare le macro del preprocessore

#ifdef _COMPILE_UNIT_TESTS_ 
    BLA BLA 
#endif //_COMPILE_UNIT_TESTS_ 

Ora ho bisogno di passare questo valore da CMake al preprocessore. L'impostazione di una variabile non funziona, quindi come posso ottenerlo?

+1

Non è possibile passare una macro al compilatore, le macro vengono valutate dal precompilatore prima che raggiungano il compilatore. –

+1

Ci scusiamo per essere inesatti! Mi riferisco ai MACRO passati per creare compilazioni condizionali. – Killrazor

risposta

44

add_definitions(-DCOMPILE_UNIT_TESTS) (cfr CMake's doc) o modificare una delle variabili bandiera (CMAKE_CXX_FLAGS, o CMAKE_CXX_FLAGS_<configuration>) o impostato COMPILE_FLAGS variabile sul bersaglio.

Inoltre, gli identificatori che iniziano con un trattino basso seguito da una lettera maiuscola sono riservati per l'implementazione. Identificatori che contengono anche il doppio trattino basso. Quindi non li usano.

+8

Può anche essere eseguito dalla riga di comando a la 'cmake .. -DCOMPILE_UNIT_TESTS' – dantswain

+8

@dantswain: imposta la variabile di cache CMake. –

+4

Per aggiungere una definizione solo a destinazioni specifiche, utilizzare [COMPILE_DEFINITIONS] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_dir:COMPILE_DEFINITIONS). Ad esempio: 'set_target_properties (target1 target2 PROPERTIES COMPILE_DEFINITIONS" COMPILE_UNIT_TESTS ")' – Lesque

15

Se si dispone di un sacco di variabili preprocessore da configurare, è possibile utilizzare configure_file:

Creare un file di configurazione, ad esempio. config.h.in con

#cmakedefine _COMPILE_UNIT_TESTS_ 
#cmakedefine OTHER_CONSTANT 
... 

poi nella vostra 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) 

nella directory di compilazione, viene generato config.h:

#define _COMPILE_UNIT_TESTS_ 
/* #undef OTHER_CONSTANT */ 

Come suggerito da robotik, si dovrebbe aggiungere qualcosa di simile include_directories(${CMAKE_CURRENT_BINARY_DIR}) al tuo CMakeLists.txt per #include "config.h" per lavorare in C++.

+1

@ robotik suggerisce che hai bisogno di 'include_directories ($ {PROJECT_BINARY_DIR})' altrimenti CMake non riuscirà a trovare il 'config.h' generato. – drs

Problemi correlati