2017-01-30 5 views
0

Ich bin neu zu cmake und ich möchte das folgende Verhalten erreichen. Ich habe ein Unterverzeichnis programs mit mehreren unabhängigen Programmen. Für jedes Programm möchte ich verschiedene Ziele hinzufügen (z. B. analysieren oder testen), die mit einem Präfix benannt sind. Dies sollte mir erlauben, sie wie make prog1-analyze oder make prog2-test auszuführen.Mehrere Ziele für jede Anwendung

Darüber hinaus möchte ich auch alle Ziele des gleichen Typs (z. B. das test Ziel) auf einmal (z. B. über make test) ausführen.

Um dies zu tun, habe ich die folgende Verzeichnisstruktur mit zwei CMakeLists.txt Dateien.

CMakeLists.txt 
programs 
    |-- prog1.c 
    |-- prog2.c 
    |-- CMakeLists.txt 

Die Top-Level-Datei enthält eine Makrodefinition add_application, während die programs/CMakeLists.txt für jedes Programm dieses Makro aufruft. Aber wie schreibe ich das Makro so, dass ich mehrere Ziele und ein globales Ziel für alle Ziele des gleichen Typs habe?

macro(add_application NAME SOURCE_FILES) 
endmacro() 
+1

Nicht ganz die Antwort, die Sie suchen, aber Sie sollten * wirklich * den Befehl 'add_test()' und 'ctest' betrachten. Aus architektonischer Sicht sollten Sie keine ausführbaren Dateien testen. Diese 'prog1.c' und' prog2.c' sollten dünne Wrapper für Funktionen sein, die in einer Bibliothek implementiert sind. (Befehlszeilenoptionen analysieren, erforderliche Parameter einrichten, Bibliotheksfunktion aufrufen.) Bibliotheksfunktionen können einfach mit einer dedizierten * test * -Dexe getestet werden. (Was, du hast es erraten, du würdest mit 'add_test()' hinzufügen und kannst 'ctest' durchlaufen.) – DevSolar

Antwort

0

In add_application() Makro Körper können Sie pro Anwendung Ziele wie gewohnt hinzufügen, deren Namen mit der Verwendung von Makroparameter Name zu konstruieren.

Wie für globale Ziel, können Sie es einmal außerhalb des Makros erstellen. Innerhalb Makro Körper kann rufen Sie einfach add_dependencies() für machen die globalen Ziel abhängig von pro Anwendung ein:

CMakeLists.txt:

add_custom_target(analize) # Create global target 

macro(add_application NAME SOURCE_FILES) 
    ... # Create application target itself 
    add_custom_target(${NAME}-analize ...) # Create per-application target 
    add_dependencies(analize ${NAME}-analize) # Dependency between global and per-application targets. 
endmacro() 

Beispiel "analize" Ziel verwendet weil "test" Ziel ist reserviert von CTest. Es ist besser, es nicht für andere Zwecke zu verwenden.

Verwandte Themen