Подтвердить что ты не робот

CMake: Как передать макросы препроцессора

Как передать макрос препроцессору? Например, если я хочу скомпилировать часть моего кода, потому что пользователь хочет скомпилировать unit test, я бы сделал следующее:

#ifdef _COMPILE_UNIT_TESTS_
    BLA BLA
#endif //_COMPILE_UNIT_TESTS_

Теперь мне нужно передать это значение из CMake в препроцессор. Установка переменной не работает, так как я могу это сделать?

4b9b3361

Ответ 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" для работы на С++.