Um die Komponententests in einem meiner Projekte auszuführen, habe ich einen benutzerdefinierten Befehl, der die ausführbare Datei, die Bibliotheken und andere zugehörige Dateien an einen anderen Ort kopiert, damit sie mit einem bestimmten Setup ausgeführt werden können, anstatt sie dort auszuführen Sie sind gebaut. Unter Linux ist das ziemlich einfach. Aber unter Windows habe ich einen kleinen Haken gefunden, weil cmake den Konfigurationsnamen an die output-Verzeichnisse anhängt (was ich generell mag, aber es vermasselt, was ich in diesem Fall mache). Es erschwert die Ermittlung der Pfade zu den generierten Bibliotheken oder ausführbaren Dateien. Zum Beispiel, wenn ich einen benutzerdefinierten Befehl hatte, der die ausführbare Datei einfach in ein anderes Verzeichnis kopiert hat
%Vor% es wird unter Windows ersticken, weil die ausführbare Datei nicht wirklich in CMAKE_RUNTIME_OUTPUT_DIRECTORY
ist. Abhängig vom Konfigurationstyp ist es entweder in ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release
oder ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug
. Unter Linux könnte das durch die Verwendung von CMAKE_BUILD_TYPE
und Hinzufügen zum Pfad trivial behoben werden, aber das funktioniert nicht mit Windows, da unter Windows cmake mehrere Konfigurationen statt nur einer generiert. Also, was ich gerne tun könnte, ist etwas wie
und einige cmake-Befehle sehen das möglich (z. B. target_link_libraries
), aber soweit ich das beurteilen kann, bietet add_custom_target
diese Fähigkeit nicht. Also, die Frage ist, wie würde ich das tun? Wie kann ich einen benutzerdefinierten Befehl konfigurationsspezifisch für Windows machen?
Dies ist ein Fall für die Generatorausdrücke, die zur Verwendung mit add_custom_command
bereitgestellt werden. .
In Ihrem Fall möchten Sie den vollständigen Pfad zu Ihrer kompilierten Exe und den Dateinamen, der an Ihr Zielverzeichnis angehängt werden soll. Dies sind $<TARGET_FILE:unitTests>
bzw. $<TARGET_FILE_NAME:unitTests>
.
Ihr vollständiger Befehl wäre:
%Vor%Es könnte mit Hilfe der nächsten "Generator-Ausdrücke" (CMake 2.8.10) gelöst werden:
$<0:...>
= leere Zeichenfolge (ignoriert "...") $<1:...>
= Inhalt von "..." $<CONFIG:cfg>
= '1' wenn config "cfg", sonst '0' Sie können sie kombinieren, um das gewünschte Verhalten zu erreichen (Pseudocode):
if debug then ${DEBUG_EXE_PATH} elseif release then ${RELEASE_EXE_PATH}
was übersetzt:
$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>
So wird Ihre Zeichenfolge aussehen:
%Vor%Details: CMake: add_custom_command
Tags und Links cmake