Как создать С#define для определенной цели с помощью CMake?
Сейчас я чувствую себя немного глупо. После недавнего преобразования нескольких небольших проектов для использования CMake я решил также избавиться от нескольких файлов "Platform_Config.h". Эти файлы содержат несколько предпроцессорных директив, таких как #define USE_NEW_CACHE
и контрольная компиляция.
Как бы я "конвертировал" эти параметры, которые нужно контролировать с помощью CMake? В идеале, используя эти "кеш-переменные", пользователь может легко редактировать.
Ответы
Ответ 1
Есть два варианта. Вы можете использовать метод add_definitions для передачи в качестве флагов компилятора: например. где-то в ваших проектах cmakelists.txt:
add_definitions( -DUSE_NEW_CACHE )
CMake будет убедиться, что префикс -D преобразуется в правый флаг для вашего компилятора (/D для msvc и -D для gcc).
Кроме того, проверьте configure_file. Это сложнее, но может быть лучше подходит для вашего оригинального подхода с помощью файла Platform_Config.
Вы можете создать входной файл, похожий на ваш оригинальный Platform_Config.h, и добавить к нему строки #cmakedefine.
Позвоните в Platform_Config.h.in:
// In Platform_Config.h.in
#cmakedefine USE_NEW_CACHE
// end of Platform_Config.h.in
При запуске
configure_file( ${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h )
он будет генерировать новый файл Platform_Config в вашем файле build-dir. Эти переменные в cmake, которые также являются cmakedefine, будут присутствовать в сгенерированном файле, другие будут закомментированы или не определены.
Конечно, вы должны убедиться, что фактический, сгенерированный файл правильно найден, когда он включен в ваши исходные файлы.
Ответ 2
команда опции может предоставить то, что вы ищете.
используйте его с свойством COMPILE DEFINITIONS на цель, и я думаю, что вы закончили.
Чтобы установить свойство на цель, используйте целевые свойства набора команд
option(DEBUGPRINTS "Prints a lot of debug prints")
target(myProgram ...)
if(DEBUGPRINTS)
set_target_properties(myProgram PROPERTIES COMPILE_DEFINITIONS "DEBUGPRINTS=1")
endif()
изменить:
Опция, которую я написал в примере, отображается как флажок в графическом интерфейсе CMake.
Ответ 3
Если вы хотите установить значение для каждой цели: с 2.8.11 вы можете использовать target_compile_definitions
.
В более ранних версиях вы, вероятно, не хотите использовать set_target_properties
как есть, так как он перезаписывает любые определения, которые вы задали ранее. Сначала вызовите get_target_property
, а затем слейте предыдущие значения. См. add_target_definitions
здесь.