2012-03-09 12 views
36

Jak mogę przekazać makro do preprocesora? Na przykład, jeśli chcę skompilować jakąś część mojego kodu, ponieważ użytkownik chce skompilować testów jednostkowych, chciałbym to zrobić:CMake: Jak przekazywać makra preprocesora

#ifdef _COMPILE_UNIT_TESTS_ 
    BLA BLA 
#endif //_COMPILE_UNIT_TESTS_ 

Teraz trzeba przekazać tę wartość od CMake do preprocesora. Ustawienie zmiennej nie działa, więc jak mogę to zrobić?

+1

Nie można przekazać makra do kompilatora, makra są oceniane przez prekompilator, zanim dotrą do kompilatora. –

+1

Przepraszamy za niedokładność! Odnoszę się do MAKROS przekazanych do kompilacji warunkowej. – Killrazor

Odpowiedz

44

add_definitions(-DCOMPILE_UNIT_TESTS) (por CMake's doc) lub zmodyfikować jeden zmiennych flag (CMAKE_CXX_FLAGS lub CMAKE_CXX_FLAGS_<configuration>) lub ustawione COMPILE_FLAGS zmienną na tarczy.

Ponadto identyfikatory, które zaczynają się od podkreślenia poprzedzonego wielką literą, są zarezerwowane dla implementacji. Identyfikatory zawierające również podwójne podkreślenie. Więc nie używaj ich.

+8

Można również wykonać z wiersza poleceń a la 'cmake .. -DCOMPILE_UNIT_TESTS' – dantswain

+8

@dantswain: To ustawia zmienną cache CMake. –

+4

Aby dodać definicję tylko do określonych celów, użyj polecenia [KOMPASUJ_DEFINICJE] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_dir:COMPILE_DEFINITIONS). Na przykład: 'set_target_properties (target1 cel2 2 WŁAŚCIWOŚCI KOMPILACJA_DEFINICJE" COMPILE_UNIT_TESTS ")' – Lesque

15

Jeśli masz dużo zmiennych preprocesora skonfigurować, można użyć configure_file:

Utwórz plik konfiguracyjny, np. config.h.in z

#cmakedefine _COMPILE_UNIT_TESTS_ 
#cmakedefine OTHER_CONSTANT 
... 

Następnie w 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) 

w katalogu build, config.h jest generowany:

#define _COMPILE_UNIT_TESTS_ 
/* #undef OTHER_CONSTANT */ 

Jak sugeruje robotik, należy dodać coś takiego include_directories(${CMAKE_CURRENT_BINARY_DIR}) do twojej CMakeLists.txt dla #include "config.h" do pracy w C++.

+1

@ robotik sugeruje, że potrzebujesz 'include_directories ($ {PROJECT_BINARY_DIR})' albo też CMake nie będzie w stanie znaleźć wygenerowanego 'config.h'. – drs

Powiązane problemy