リリースビルドのみのポストビルドステップ
-
06-07-2019 - |
質問
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()
と書くことができると思うなら、失望を免れることをお勧めします。