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

Как создать С#define для определенной цели с помощью CMake?

Сейчас я чувствую себя немного глупо. После недавнего преобразования нескольких небольших проектов для использования CMake я решил также избавиться от нескольких файлов "Platform_Config.h". Эти файлы содержат несколько предпроцессорных директив, таких как #define USE_NEW_CACHE и контрольная компиляция.

Как бы я "конвертировал" эти параметры, которые нужно контролировать с помощью CMake? В идеале, используя эти "кеш-переменные", пользователь может легко редактировать.

4b9b3361

Ответ 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 здесь.