Как определить макрос препроцессора С++ через командную строку с помощью CMake?
Я пытаюсь установить макрос препроцессора в командной строке CMake. Я пробовал:
set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project
но он не определяется при компиляции и не может найти имя MY_MACRO
в файлах, сгенерированных CMake, кроме CMakeCache.txt
, где он присутствует в форме:
MY_MACRO:UNINITIALIZED=1
Как я могу это сделать?
Ответы
Ответ 1
Мотивация вопроса заключалась в пакетном сборке сторонних библиотек, поэтому я хотел избежать модификации CMakeLists. Спустя годы, хотя мне это больше не нужно, я понял, что это легко достижимо с помощью внешних средств для CMake:
-
Вызывать CMake как обычно, без специальных флагов.
-
С MSVC: компилятор считывает переменную среды CL
чтобы получить дополнительные аргументы командной строки. Так
set CL=/DMY_MACRO=1 %CL%
затем вызовите MSBuild для выполнения своей работы.
-
С другими наборами инструментов: это может быть выполнимо путем установки переменных среды CFLAGS
или CXXFLAGS
перед вызовом make
, но я не проверял это.
Ответ 2
Хорошей альтернативой может быть определение опции cmake:
OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default
Следующее условие:
IF(DEFINE_MACRO)
ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)
Затем вы можете включить эту опцию ON/OFF через командную строку с помощью cmake, используя флаг -D
. Пример:
cmake -DDEFINE_MACRO=OFF ..
Чтобы убедиться, что компилятор получает правильное определение, вы можете вызвать make в подробном режиме и проверить, задан ли макрос:
make VERBOSE=1
Это хорошее решение также потому, что make
будет перекомпилировать ваш код при изменении любого из параметров cmake.
Ответ 3
Попробуйте следующее: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1
Ответ 4
Если у вас нет веской причины не, вы должны использовать ADD_DEFINITIONS(<name>=<value>[, ...])
.
Просто добавьте следующую строку в ваш CMakeLists.txt:
ADD_DEFINITIONS("MY_MACRO=1")
CMake позаботится о синтаксисе коммутаторов (будь то -D<name>=<value>
или /D<name>=<value>
).