質問

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

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

役に立ちましたか?

解決

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の質問は、<=>がVS 2005+でも機能することを示唆しているようです。

他のヒント

私は同様の何かに出くわしました。DLLファイルを宛先ディレクトリにコピーしたいのですが、リリースビルドのみです。たくさんの髪を引き裂いた後、私はいくつかのジェネレーター式($<...>もの)を使用して、なんとか動作させることができました。 7年後、あなたの問題を解決するのにそれほど多くはありませんが(あなたの適切なレベルを賞賛しますが)、この同じ問題を抱えている次の人の頭髪を救い、Googleでこの質問を見つけるために:

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()と書くことができると思うなら、失望を免れることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top