【问题标题】:Post build step only for release build发布构建步骤仅用于发布构建
【发布时间】:2009-10-25 04:30:48
【问题描述】:

我正在尝试为 CMake 设置一个构建后命令,我使用 CMake 文档中所述的 ADD_CUSTOM_COMMAND 指令完成了该命令。不过,我想做的是,只有在创建可执行文件的发布版本时才运行后期构建。

如何做到这一点?

【问题讨论】:

    标签: cmake post-build-event


    【解决方案1】:

    我遇到了类似的情况,想将 DLL 文件复制到目标目录,但仅用于发布版本。经过大量撕裂的头发后,我设法使用一些生成器表达式($<...> thingies)让它工作。七年后我把它放在这里并不是为了解决你的问题(尽管我很佩服你的针对性水平),而是为了节省下一个人遇到同样问题并在谷歌上找到这个问题的头骨:

    set(no_copy $<NOT:$<CONFIG:Release>>) # An abbreviation to make the example easier to read.
    add_custom_command(TARGET myDLL POST_BUILD
        COMMAND "${CMAKE_COMMAND}" -E
        # do nothing for non-Release build
        $<${no_copy}:echo>
        # output text to make clear that the copy command is not actually issued
        $<${no_copy}:"copy omitted for non-release build, command would have been ">
        # the actual copy command, which is overridden by the "echo" above
        # in the case of a non-release build
        copy_if_different $<TARGET_FILE:myDLL> ${DIR_FOR_DLL})
    

    诀窍是在本来会发出的命令前面写一个echo。这样,即使输出了一点噪音,命令也不会执行。可以将命令行的其余部分包含在许多生成器表达式中,以缩短输出,但代价是完全不可读的 cmake 文件。另一方面,似乎没有办法在不产生任何输出的情况下以便携方式抑制复制。最后,如果你认为有一个简单的方法,你可以写if($&lt;CONFIG:Release&gt;) ... endif(),我建议你不要失望。

    【讨论】:

    • 仅用于统计。我已经对其进行了测试,并且可以正常工作。你是救生员!
    【解决方案2】:

    对于基于 Makefile 的生成器,您可以检查 CMAKE_BUILD_TYPE 变量并根据其值进行操作:

    if(CMAKE_BUILD_TYPE STREQUAL Debug)
        message(STATUS "Do debug stuff")
    elseif(CMAKE_BUILD_TYPE STREQUAL Release)
        message(STATUS "Do release stuff")
    elseif(CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
        message(STATUS "Do release with debug info stuff")
    elseif(CMAKE_BUILD_TYPE STREQUAL MinSizeRel)
        message(STATUS "Do minimal size release stuff")
    endif()
    

    对于基于 Visual Studio 的构建,this SO question 似乎表明CMAKE_BUILD_TYPE 也适用于 VS 2005+。

    【讨论】:

    • -1:CMAKE_BUILD_TYPE 仅在运行时定义。这个答案是错误的。
    • @Gili:对于单个配置生成器(Makefile 生成器),它在生成时可用。
    【解决方案3】:

    在 Visual Studio 中检查配置的另一种方法是使用其宏:

    if(MSVC)
        add_custom_command(TARGET myDLL POST_BUILD
            COMMAND cmd.exe /c if "$(Configuration)" == "Release" "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:myDLL>" "${DIR_FOR_DLL}")
    endif()
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多