Как определить макрос CMake в терминах другого?

Как определить макрос CMake в терминах другого?

add_definitions(-DMACRO1=1)
add_definitions(-DMACRO2=2)

add_definitions(-DMACRO3=${MACRO1})   # no effect

message( "COMPILE_DEFINITIONS = ${DirDefs}" )

Это вывод, который я хотел бы:

COMPILE_DEFINITIONS = MACRO1=1;MACRO2=2;MACRO3=1

Вот что я получаю:

COMPILE_DEFINITIONS = MACRO1=1;MACRO2=2;MACRO3=

2 ответа

Решение

Призвание add_definitions(-DMACRO1=1) просто добавляет это определение в командную строку вашего компилятора. Его значение эквивалентно #define директива в вашем исходном коде. Он не создает переменную CMake.

Итак, в вашем случае,${MACRO1} приводит к пустой строке, в результате чего

ADD_DEFINITIONS(-DMACRO3=)

Чтобы заставить это работать, используйте SET(...) определить переменную в CMake:

set(MACRO1 1)
add_definitions(-DMACRO1=${MACRO1})
add_definitions(-DMACRO2=2)

add_definitions(-DMACRO3=${MACRO1})

message( "COMPILE_DEFINITIONS = ${DirDefs}" )

Единственное, что приходит мне в голову, это выполнение в командной строке:

$ cmake -DMACRO1=1 -DMACRO2=2 .

С помощью этой команды мы гарантируем, что эти переменные будут существовать при выполнении вашего CMakeLists.txt. Таким образом, вы можете использовать их в этом.

Затем создайте в вашем CMakeLists.txt вспомогательную переменную, чтобы убедиться в правильности значения:

set(_MACRO3 ${MACRO1})
MESSAGE("MACRO3 value = ${_MACRO3}")
ADD_DEFINITIONS(-DMACRO3=${_MACRO3})

Я думаю, что если вы только напишите:

ADD_DEFINITIONS(-DMACRO3=${MACRO1})

Это тоже будет правильно.

Другие вопросы по тегам