Я переношу проект makefile в CMake. Человек, который написал makefile в первый раз, сделал модуль для записи определенных значений в include файле.
Там находится главный файл config.h, который включает config_in.h. Файл config.h содержит примерно следующее:
#ifndef USE_FEATURE_A
#define USE_FEATURE_A 0
#endif
#ifndef USE_FEATURE_B
#define USE_FEATURE_B 0
#endif
В make файле есть поддельная цель вроде with_feature_a
, которая записывает в config_in.h
#define USE_FEATURE_A 1
Таким образом, кто-то может напечатать
make with_feature_a
make
чтобы получить правильную сборку.
Я хочу реплицировать что-то вроде этого, используя эту базу кода, но используя CMake. Я попробовал пару подходов, предложенных в сети, но я не получил его работать.
set_target_properties(with_feature_a PROPERTIES COMPILE_DEFINITIONS
"WITH_FEATURE_A=1"
)
Это не работает, потому что если я запустил
make with_feature_a
Я не вижу with_feature_a
в командной строке препроцессора.
Вторая попытка, которую я сделал, - записать файл напрямую с содержимым, установленным на все, что захочу, но я не понял, как подключить команду file()
к моей цели.
Я поместил это в свой CMakeLists.txt
file(WRITE
local/config_in.h
"#define WITH_FEATURE_A 1"
)
но это не выполняется каждый раз, и я не знаю, как установить его в одну цель.
Любая помощь приветствуется. Спасибо, что прочитали все это. Извините за длинную историю:)
ОБНОВЛЕНИЕ
Решение, предоставленное здесь, является большим улучшением на пути к решению. Проблема в том, что это не позволяет рекурсивные определения. Я показываю пример:
в CMakeLists.txt Я разместил:
if (WITH_FEATURE_A)
MESSAGE(STATUS "WITH_FEATURE_A")
add_definitions(-DUSE_FEATURE_A=1)
add_definitions(-DWITH_FEABURE_B=1)
endif()
if (WITH_FEABURE_B)
MESSAGE(STATUS "WITH_FEATURE_B")
add_definitions(-DUSE_FEATURE_D=1)
endif()
if (WITH_FEABURE_C)
MESSAGE(STATUS "WITH_FEATURE_C")
add_definitions(-DUSE_FEATURE_D=1)
endif()
if (WITH_FEABURE_D)
MESSAGE(STATUS "WITH_FEATURE_D")
endif()
в этом случае, если я исполняю cmake с -DWITH_FEATURE_A = 1, мне бы хотелось увидеть на выходе:
WITH_FEATURE_A
WITH_FEATURE_B
WITH_FEATURE_D
на самом деле этот код печатает только
WITH_FEATURE_A