7 Stimmen

Post-Build-Schritt nur für Release-Build

Ich versuche, einen Post-Build-Befehl für CMake einzurichten, was ich mit der ADD_CUSTOM_COMMAND-Direktive wie in der CMake-Dokumentation angegeben getan habe. Ich möchte jedoch, dass der Post-Build-Befehl nur ausgeführt wird, wenn ich einen Release-Build meiner ausführbaren Datei erstelle.

Wie kann man das erreichen?

9voto

tobi_s Punkte 1074

Ich bin auf etwas Ähnliches gestoßen, als ich eine DLL-Datei in ein Zielverzeichnis kopieren wollte, allerdings nur für Release-Builds. Nach vielem Hin und Her habe ich es mit ein paar Generatorausdrücken zum Laufen gebracht (die $<...> Dinger). Ich schreibe das hier sieben Jahre später nicht so sehr, um Ihr Problem zu lösen (obwohl ich Ihr Maß an Sachkenntnis bewundere), sondern um die Schädelhaare der nächsten Person zu retten, die das gleiche Problem hat und diese Frage bei Google findet:

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})

Der Trick besteht darin, eine echo vor dem Befehl, der andernfalls ausgegeben werden würde. Auf diese Weise wird der Befehl nicht ausgeführt, auch wenn ein wenig Rauschen ausgegeben wird. Man könnte den Rest der Befehlszeile in eine Reihe von Generatorausdrücken einschließen, um die Ausgabe zu verkürzen, allerdings auf Kosten einer völlig unlesbaren cmake-Datei. Andererseits scheint es keine Möglichkeit zu geben, die Kopie portabel zu unterdrücken, ohne eine Ausgabe zu erzeugen. Schließlich, wenn Sie denken, dass es einen einfachen Ausweg gibt und Sie einfach schreiben können if($<CONFIG:Release>) ... endif() Ich rate Ihnen, sich diese Enttäuschung zu ersparen.

1 Stimmen

Nur für die Statistik. Ich habe es getestet und es funktioniert. Sie sind ein Lebensretter!

2voto

richq Punkte 53842

Für Makefile-basierte Generatoren können Sie die CMAKE_BUILD_TYPE und auf ihren Wert einwirken:

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()

Für Visual Studio-basierte Builds, diese SO-Frage scheint darauf hinzudeuten, dass CMAKE_BUILD_TYPE funktioniert auch mit VS 2005+.

4 Stimmen

-1: CMAKE_BUILD_TYPE wird nur zur Laufzeit definiert. Diese Antwort ist falsch.

2 Stimmen

@Gili: für Einzelkonfigurationsgeneratoren (Makefile-Generator) ist sie zum Zeitpunkt der Generierung verfügbar.

2voto

Eine weitere Möglichkeit zur Überprüfung der Konfiguration in Visual Studio ist die Verwendung seiner Makros:

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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X