Wie machen Sie die Konfiguration von add_custom_command unter Windows?

8

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

%Vor%

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?

    
Jonathan M Davis 21.12.2012, 19:59
quelle

2 Antworten

5

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%     
Fraser 21.12.2012, 23:32
quelle
9

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'
  • ist

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

    
Vladimir Ivanov 06.10.2013 00:14
quelle

Tags und Links