在CMake中的生成步骤后运行命令

在CMake中的生成步骤后运行命令,cmake,Cmake,我有一个命令行工具,应该在CMake创建.sln文件后运行。使用CMake有什么方法可以做到这一点吗 在CMakeLists.txt末尾使用execute_process(COMMAND..)没有帮助,因为这是在配置步骤之后执行的,但是,.sln文件是在生成步骤中创建的 非常感谢 是的,将add_custom_命令与add_custom_目标结合使用可以解决此问题 举个例子,看看我对另一个问题的回答 一种相当可怕的方法是从cmake调用cmake,然后在父脚本之外执行后期生成操作 o

我有一个命令行工具,应该在CMake创建.sln文件后运行。使用CMake有什么方法可以做到这一点吗

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


非常感谢

是的,将add_custom_命令与add_custom_目标结合使用可以解决此问题

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


一种相当可怕的方法是从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编译器检测。

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

另一种方法是按照上面的链接之一编写包装器脚本

cmake ..
DoWhatYouWant.exe

也许我不明白你的意思,但据我所知,使用这些命令,只能在构建期间运行工具。(我使用的是Visual Studio,过程如下:我点击“构建”->CMake在有任何更改时生成新的.sln文件->VS宏询问我是否要重新加载解决方案->我按“是->构建解决方案开始->执行自定义目标。如果现在我的命令修改了解决方案,我必须重新加载,这是我想要避免的。我宁愿在CMake生成过程中修改解决方案文件n阶段。)哦,现在我明白了,您希望在cmake时间内仍然运行您的命令,但是在生成解决方案文件之后。在本例中,我提到的用于在构建时执行程序的命令实际上不是您想要的。我不确定是否有这样一个后代钩子,因为这是cmake时代的最后阶段。我建议你在cmake邮件列表中提问,并更详细地解释你想做什么。AFAIK核心开发人员没有密切关注。当更新到CMakeLists文件后cmake自动重新运行时(例如,如果您拉取或签出),这将中断。