【问题标题】:Run Command after generation step in CMake在 CMake 中生成步骤后运行命令
【发布时间】:2011-08-17 10:40:15
【问题描述】:

我有一个命令行工具,应该在 CMake 创建我的 .sln 文件后运行。有没有办法使用 CMake 做到这一点?

在 CMakeLists.txt 末尾使用 execute_process(COMMAND ..) 没有帮助,因为这是在配置步骤之后执行的,但是,.sln 文件是在生成步骤中创建的。

非常感谢!

【问题讨论】:

    标签: cmake


    【解决方案1】:

    一个相当可怕的方法是通过从 cmake 调用 cmake 并在离开父脚本的过程中执行生成后的东西。

    option(RECURSIVE_GENERATE "Recursive call to cmake" OFF)
    
    if(NOT RECURSIVE_GENERATE)
        message(STATUS "Recursive generate started")
        execute_process(COMMAND ${CMAKE_COMMAND}
            -G "${CMAKE_GENERATOR}"
            -T "${CMAKE_GENERATOR_TOOLSET}"
            -A "${CMAKE_GENERATOR_PLATFORM}" 
            -DRECURSIVE_GENERATE:BOOL=ON 
            ${CMAKE_SOURCE_DIR})
        message(STATUS "Recursive generate done")
    
        # your post-generate steps here
    
        # exit without doing anything else, since it already happened
        return()
    endif()
    
    # The rest of the script is only processed by the executed cmake, as it 
    # sees RECURSIVE_GENERATE true
    
    # all your normal configuration, targets, etc go here
    

    如果您需要使用各种命令行选项组合(如“-DTHIS -DTHAT”)调用 cmake,此方法效果不佳,但对于许多项目来说可能是可以接受的。它适用于持久缓存的变量,包括最初生成时的所有 cmake 编译器检测。

    【讨论】:

      【解决方案2】:

      从以下链接来看,似乎没有这样的命令来指定在 CMake 生成 .sln 文件后执行。

      另一种方法是编写一个包装脚本,如上述链接之一所述。

      cmake ..
      DoWhatYouWant.exe
      

      【讨论】:

      • 更新到 CMakeLists 文件后 cmake 自动重新运行时会中断(例如,如果您拉取或结帐)。
      【解决方案3】:

      是的,与 add_custom_target 配对的 add_custom_command 涵盖了这一点

      例如,看看我对另一个问题的回答

      【讨论】:

      • 也许我不明白你的意思,但据我所知,使用这些命令只能在构建期间运行工具。 (我正在使用 Visual Studio,过程如下:我点击“构建”-> 如果有任何更改,CMake 会生成新的 .sln 文件 -> VS 宏询问我是否要重新加载解决方案 ->我按是->构建解决方案开始->执行自定义目标。如果现在我的命令修改了解决方案,我必须再次重新加载我想避免的。我宁愿在 CMake 的生成阶段修改解决方案文件。)
      • 哦,现在我明白了,你想在 cmake-time 内运行你的命令,但是在生成解决方案文件之后。在这种情况下,我提到的用于在构建时执行程序的命令确实不是您想要的。我不确定是否有这样的后生成挂钩,因为这是 cmake-time 的最后阶段。
      • 我建议您在 cmake 邮件列表中提出您的问题,并更详细地解释您要做什么。 AFAIK 核心开发人员并不太密切关注。
      猜你喜欢
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2010-11-29
      • 2017-09-10
      • 2017-08-06
      • 1970-01-01
      相关资源
      最近更新 更多