8

CMakeのビルド後のコマンドをセットアップしようとしています。これは、CMakeのドキュメントに記載されているようにADD_CUSTOM_COMMANDディレクティブを使用して実行しました。ただし、実行可能ファイルのリリースビルドを作成する場合にのみ、ビルド後を実行します。

これをどのように達成しますか?

4

3 に答える 3

9

DLLファイルを宛先ディレクトリにコピーしたいのですが、リリースビルド専用です。たくさんの髪の毛が破れた後、私はいくつかのジェネレータ式($<...>モノ)を使用してそれを機能させることができました。私は7年後にあなたの問題を解決するためにそれをここに置いています(私はあなたの適切さのレベルを賞賛しますが)が、これと同じ問題を抱えてグーグルでこの質問を見つける次の人の頭蓋の毛を救うために:

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($<CONFIG:Release>) ... endif()、失望を免れることをお勧めします。

于 2017-09-27T04:49:17.550 に答える
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ベースのビルドの場合、このSOの質問CMAKE_BUILD_TYPEは、 VS2005以降でも機能することを示唆しているようです。

于 2009-10-25T15:50:24.720 に答える
1

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()
于 2020-12-26T12:15:04.613 に答える