我正在将 makefile 项目迁移到 CMake。第一次编写 makefile 的人已经完成了一个模块,用于在包含文件中写入某些值。
有一个包含 config_in.h 的主 config.h 文件。config.h 文件包含如下内容:
#ifndef USE_FEATURE_A
#define USE_FEATURE_A 0
#endif
#ifndef USE_FEATURE_B
#define USE_FEATURE_B 0
#endif
在makefile中有一个像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()
在这种情况下,如果我使用 -DWITH_FEATURE_A=1 执行 cmake,我很想在输出中看到:
WITH_FEATURE_A
WITH_FEATURE_B
WITH_FEATURE_D
实际上这段代码只是打印
WITH_FEATURE_A