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.