如何从目标触发 CMake 重新配置?

How to trigger CMake reconfiguration from a target?

本文关键字:新配置 配置 CMake 目标      更新时间:2023-10-16

我有以下设置:

- build/
- conanbuildinfo.cmake   (generated)
- conanfile.py
- CMakeLists.txt

conan命令在 CMake 之前运行,生成 conanbuildinfo.cmake。这包含稍后编译期间要使用的包含路径等。如果我更改 conanfile,我想再次触发柯南并从生成的忍者版本中重新运行 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(而不是add_custom_command(在任何依赖于其输出的 CMake 逻辑之前运行 conan/reconfigure.py,并结合将该命令的输入文件添加到CMAKE_CONFIGURE_DEPENDS中,这应该有效

尝试在 CMake之前运行某些东西是行不通的......但无论如何,你不需要这样做。我认为你的问题是你试图解决错误的问题。相反,将其视为 a( 您希望在 CMake 的执行期间运行某些内容,以及 b( 如果您想在"conanfile"发生变化时重新运行CMake。重新运行 CMake 将重新运行柯南。