CMake: Как передать макросы препроцессора
Как передать макрос препроцессору? Например, если я хочу скомпилировать часть моего кода, потому что пользователь хочет скомпилировать unit test, я бы сделал следующее:
#ifdef _COMPILE_UNIT_TESTS_
BLA BLA
#endif //_COMPILE_UNIT_TESTS_
Теперь мне нужно передать это значение из CMake в препроцессор. Установка переменной не работает, так как я могу это сделать?
Ответы
Ответ 1
add_definitions(-DCOMPILE_UNIT_TESTS)
(см. Документ CMake) или измените одну из переменных флага (CMAKE_CXX_FLAGS
или CMAKE_CXX_FLAGS_<configuration>
) или установите переменную COMPILE_FLAGS
на цель.
Кроме того, идентификаторы, начинающиеся с символа подчеркивания, за которым следует буква верхнего регистра, зарезервированы для реализации. Идентификаторы, содержащие двойной символ подчеркивания. Поэтому не используйте их.
Ответ 2
Если у вас есть много препроцессорных переменных для настройки, вы можете использовать configure_file:
Создайте файл конфигурации, например. config.h.in
с помощью
#cmakedefine _COMPILE_UNIT_TESTS_
#cmakedefine OTHER_CONSTANT
...
то в вашем 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)
в каталоге сборки генерируется config.h
:
#define _COMPILE_UNIT_TESTS_
/* #undef OTHER_CONSTANT */
Как было предложено robotik, вы должны добавить что-то вроде include_directories(${CMAKE_CURRENT_BINARY_DIR})
к CMakeLists.txt
для #include "config.h"
для работы на С++.