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

时间:2018-09-24 16:41:52

标签: c++ cmake conan

我有以下设置:

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

conan命令在CMake之前运行,生成conanbuildinfo.cmake。其中包含要在以后的编译中使用的包含路径等。如果我更改了conanfile,我想再次触发conan,并从生成的忍者版本中重新运行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运行脚本

1 个答案:

答案 0 :(得分:1)

execute_process为什么不起作用?

在我看来,如果您使用execute_process不是 add_custom_command)来运行conan / reconfigure.py的任何CMake逻辑之前,这应该可行取决于其输出,结合将该命令的输入文件添加到CMAKE_CONFIGURE_DEPENDS

尝试运行之前 CMake无法正常工作……但是无论如何,您都不需要这样做。我认为您的问题是您正在尝试解决错误的问题。相反,将其视为:a)您想在CMake执行期间运行 ,并且b)如果您的“ conanfile”发生更改,您想重新运行 CMake 。重新运行CMake将重新运行柯南。