微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否可以强制 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 配置步骤时有问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。