CMake add_custom_target abhängig vom gesamten Projekt, das erstellt wird

8

Ich möchte ein Testziel hinzufügen, das vom gesamten erfolgreich erstellten Projekt abhängig ist, ohne Abhängigkeiten für alle Bibliotheken oder ausführbaren Dateien neu festzulegen.

Ich würde dies in make schreiben als:

%Vor%

test.sh verwendet implizit foo und bar und möchte, dass sie auf dem neuesten Stand sind.

So würde ich dies in cmake angeben.

%Vor%

Dies funktioniert jedoch nicht, da es kein vollständiges Ziel gibt.

Gibt es eine Möglichkeit, dies zu spezifizieren? Oder gibt es eine Variable, die auf alle Ziele erweitert wird, die ich erstellen möchte?

    
Russell Gallop 16.06.2011, 12:52
quelle

3 Antworten

9

Ab Version 2.8 bietet CMake keine Variable, die eine Liste aller Ziele enthält. Das Beste, was Sie tun können, ist, die integrierten Befehle add_library und add_executable mit benutzerdefinierten Makros zu überschreiben, die die eingebauten Makros aufrufen und alle definierten Ziele in einer Variablen verfolgen.

Sie können sogar dieselben Namen für Ihre benutzerdefinierten Makros verwenden. Auf diese Weise müssen Sie nicht alle bestehenden Aufrufe add_library und add_executable ändern. Den ursprünglichen integrierten Befehlen wird ein Unterstrich vorangestellt, wenn Sie einen davon überschreiben:

%Vor%

Beachten Sie auch, dass Sie mit der Option DEPENDS keine Zielabhängigkeit zu einem benutzerdefinierten Ziel hinzufügen können. DEPENDS verweist möglicherweise nur auf vorhandene Dateien oder Dateien, die mit add_custom_command(...) im selben Verzeichnis erstellt wurden. Um eine Zielabhängigkeit hinzuzufügen, verwenden Sie stattdessen den Befehl add_dependencies .

    
sakra 16.06.2011, 19:36
quelle
4

Ich habe nicht genug Reputation, um Sakra zu antworten ...

Ein Problem mit dieser Lösung ist, dass wenn Sie ein Unterverzeichnis verwenden, die Änderungen, die Sie an der Variable _allTargets im Unterverzeichnis vornehmen, nicht an den übergeordneten Bereich weitergegeben werden.

Digging mehr, Liste (append ...) kann nicht in diesem Fall verwendet werden:

  

Ähnlich wie der SET-Befehl erstellt der LIST-Befehl eine neue Variable   Werte im aktuellen Bereich, auch wenn die Liste selbst tatsächlich ist   in einem übergeordneten Bereich definiert. Um die Ergebnisse dieser zu verbreiten   Operationen nach oben, verwenden Sie SET mit PARENT_SCOPE, SET mit CACHE   INTERN, oder andere Mittel der Wertverbreitung.

Ссылка :

  

Wenn PARENT_SCOPE vorhanden ist, wird die Variable im Bereich festgelegt   über dem aktuellen Umfang. Jedes neue Verzeichnis oder jede neue Funktion erstellt ein   neuer Umfang Dieser Befehl setzt den Wert einer Variablen in die   übergeordnetes Verzeichnis oder aufrufende Funktion (je nachdem, was für die   Fall zur Hand).

(Hinweis für mich selbst: Ein Makro ist nicht eine Funktion)

Ich sehe keine allgemeine Lösung (z. B. unabhängig von der Verwendung von add_subdirectory), wenn PARENT_SCOPE verwendet wird. Hier scheint es jedoch eine Lösung mit CACHE INTERNAL zu geben.

Zitieren von: Ссылка

%Vor%     
Antonio 19.06.2013 00:03
quelle
0

Sie können CTest verwenden:

%Vor%

Cmake erzeugt Makefile mit neuem Ziel test , siehe auch: Dokumentation für den Befehl add_test .

Aber Sie müssen Ihr Projekt kompilieren, bevor Sie Tests ausführen:

%Vor%

Sie können auch das Ziel Experimentell , Nächtlich oder Kontinuierlich verwenden. Diese Ziele kompilieren das Projekt und führen alle Tests aus, aber sie versuchen auch, Testergebnisse zu senden (Sie können es mit CTestConfig.cmake konfigurieren).

    
Alexey 18.06.2011 04:46
quelle

Tags und Links