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

Is it possible to force CMake to run add_compile_definitions() each time?

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

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

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

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

set_property(DIRECTORY . APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS props.json)

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


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

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