是否可以强制 CMake 每次运行 add_compile_definitions() ?

问题描述

我有一个嵌入式项目(使用使用 CMake 构建项目的 ESP-IDF),其中有一个 props.json 文件,其中包含多个设置(例如“设备类型”)。例如根据"deviceType"的实际值,CMake通过调用execute_process()jq打开并读取props.json,然后定义C预处理器宏,如:DEVICE_TYPE_A使用 add_compile_deFinitions()

问题是,这只会在我修改 CMakeLists.txt 或清理整个项目时运行,但我不想在更改 props.json 时只重新编译我编写的文件(所以,取决于设置)。我想让 CMake 在每次构建项目时读取文件而不清理它。

我做了我的研究,所以我知道有 add_custom_target()add_custom_command() 的行为方式,但是 add_compile_deFinitions() 不能在脚本中调用。有没有解决方案可以实现这一点,还是我应该只使用由 configure_file() 配置的头文件并单独留下 add_compile_deFinitions()

解决方法

这实际上非常简单,您不需要手动重新配置 CMake。只需将以下内容添加到包含您的 CMakeLists.txt 文件的目录中的 props.json

set_property(DIRECTORY . APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS props.json)

这会将 props.json 添加到 CMake 生成的构建在确定是否重新运行 CMake 配置步骤时扫描的文件列表。有关详细信息,请参阅 CMAKE_CONFIGURE_DEPENDS 上的文档。


一般来说,您应该永远需要在第一次配置后手动重新运行 CMake1。如果您这样做了,则表明您尚未传达 CMake 生成正确构建系统所需的所有必要信息。

1 有一个值得注意的例外:已知 Xcode 在自动重新运行 CMake 配置步骤时有问题。