c++ - 如何从目标触发 CMake 重新配置?
问题描述
我有以下设置:
- build/
- conanbuildinfo.cmake (generated)
- conanfile.py
- CMakeLists.txt
在 CMake 之前运行一个conan
命令,生成 conanbuildinfo.cmake。这包含稍后在编译期间使用的包含路径等。如果我更改 conanfile,我想再次触发 conan 并从生成的 ninja build 重新运行 CMake。我有一个可以调用柯南的脚本,它会正确更新所有内容。但是,这发生在运行 CMake 之后,即使更改了 conanbuildinfo,CMake 也不会再次运行。这会导致忍者“看不到”依赖图中的更改,因此它不会重建它必须重建的所有内容。这意味着我必须运行ninja
两次才能更新所有内容。我目前触发重新配置的方式是这样的:
set(DS_CONFIG_INDICATOR ${CMAKE_BINARY_DIR}/ds_configured)
add_custom_command(
DEPENDS ${PROJECT_SOURCE_DIR}/conanfile.py
OUTPUT ${DS_CONFIG_INDICATOR}
COMMAND ${CMAKE_COMMAND} -E env --unset=PYTHONPATH ${PYTHON_BINARY} ${PROJECT_SOURCE_DIR}/scripts/common/reconfigure.py ${DS_CONFIG_INDICATOR} ${PROJECT_SOURCE_DIR}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Checking if reconfigure is needed"
USES_TERMINAL
)
add_custom_target(ConanReconfigure
DEPENDS ${DS_CONFIG_INDICATOR}
)
运行此脚本后有没有办法触发重新配置?
我尝试使用以下内容但没有成功:
- CMAKE_CONFIGURE_DEPENDS
- 从 reconfigure.py 脚本运行 cmake
- 从 reconfigure.py 脚本中触摸主 CMakeLists.txt
- 使用 execute_process 运行脚本
解决方案
为什么没有execute_process
工作?
在我看来,如果您使用execute_process
( not )在依赖于其输出的任何 CMake 逻辑之前add_custom_command
运行 conan/并将该命令的输入文件添加到.reconfigure.py
CMAKE_CONFIGURE_DEPENDS
尝试在 CMake之前运行某些东西是行不通的……但无论如何,你不需要这样做。我认为你的问题是你试图解决错误的问题。相反,将其视为 a) 您想在 CMake 执行期间运行某些东西,并且 b)如果您的“conanfile”发生更改,您希望重新运行CMake 。重新运行 CMake 将重新运行柯南。
推荐阅读
- python - 绘制多个条形图。怎么修?
- java - 为什么查询谷歌云文件返回一个空列表?
- git - 在 git 中 rebase 时如何记录合并冲突解决方案?
- python - 对于 scipy 中的非中心卡方,输入“nc”是如何定义的?
- java - 用@DataJpaTest 注释的测试不是用@Autowired 注释的自动装配字段
- wpf - 为网格背景使用 DrawingBrush 资源
- ruby-on-rails - 在引发错误的方法中调用 RSpec 测试 Rollbar
- ios - 表格视图中的行不会扩展它的宽度并且是堆叠的 Swift
- eclipse-cdt - Eclipse CDT 将 #ifndef 下的错误部分代码变灰
- r - 读取 csv 文件,其中一个变量的值针对 R 中的每个观察值扩展为多行