【问题标题】:How to trigger CMake reconfiguration from a target?如何从目标触发 CMake 重新配置?
【发布时间】:2018-09-25 03:03:01
【问题描述】:

我有以下设置:

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

conan 命令在 CMake 之前运行,生成 conanbuildinfo.cmake。这包含稍后在编译期间使用的包含路径等。如果我更改 conanfile,我想再次触发 conan 并从生成的 ninja 构建中重新运行 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 运行脚本

【问题讨论】:

    标签: c++ cmake conan


    【解决方案1】:

    为什么execute_process 不起作用?

    在我看来,如果您使用 execute_process (not add_custom_command) 在依赖其输出的任何 CMake 逻辑之前运行 conan/reconfigure.py,这应该可以工作,结合将该命令的输入文件添加到CMAKE_CONFIGURE_DEPENDS

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

    【讨论】:

    • execute_process 仅在 cmake 运行时执行,因此它不会运行,例如如果 CMakeLists 没有更改。这是典型的场景。 conanfile 更改(例如由于 git pull),开发人员重新运行 ninja 并期望更新和重建所有必要的东西。我会尝试将 CMAKE_CONFIGURE_DEPENDS 与 execute_process 结合起来,因为我上次没有想到这一点。
    • 所以我试了一下,确实,关键是要在 CMAKE_CONFIGURE_DEPENDS 列表中列出 ${DS_CONFIG_INDICATOR}(而不是我之前认为的 conanfile.py)。我仍然使用add_custom_command,因为我需要USES_TERMINAL,而这不适用于execute_process
    • 我不确定这是否可行;使用add_custom_command,CMake 将运行完成(大概在生成的文件中使用“旧”值?)。如果您需要 USES_TERMINAL 以便在 CMake 时使用 stdin,嗯...这听起来像是一个功能请求。否则,我不确定你为什么认为你需要USES_TERMINAL
    • 它确实有效,不,我不需要它来输入。我正在运行一个程序,该程序需要具有区域设置的真实终端才能运行,并且没有USES_TERMINAL cmake 以一种奇怪的方式运行它,导致它崩溃。
    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多