2015-06-05 11 views
7

Also habe ich ein Metaprojekt eingerichtet, was bedeutet, dass ich ein Verzeichnis (das Stammverzeichnis) habe, das mehrere Unterverzeichnisse enthält, von denen jedes ein Cmake-Projekt ist (mit gültigen cmakelists). Die cmakelists im Stammverzeichnis importieren die Unterprojekte mit dem Befehl cmake add_subdirectory.Wie vermeidet man Namenskonflikte in CMake-Unterprojekten?

Jedes Teilprojekt definiert seine eigenen Ziele (Bibliotheken und ausführbare Dateien) sowie Ziele "check", die die Testsuite für dieses Projekt und "docs" ausführt, die doxygen ausführt.

Mein Problem ist, dass CMake nicht versteht, dass die Ziele check und docs für jedes Projekt lokal sind, und beschwert sich daher über Namenskonflikte.

Also meine Frage ist, gibt es eine Möglichkeit, cmake zu verstehen, dass diese Ziele lokal zu jedem Projekt sind?

Antwort

1

CMake lässt doppelte Zielnamen nicht zu. Der Grund liegt in der docs for policy CMP0002 vorgesehen: CMake Code und auf Make-Tool Befehlszeilen

  • Eindeutige Namen eindeutig sowohl in Bezug genommen werden kann.
  • Logische Namen werden von Xcode- und VS IDE-Generatoren verwendet, um aussagekräftige Projektnamen für die Ziele zu erstellen.

Ihr versuchen könnte CMP0002-OLD (done über cmake_policy(SET CMP0002 OLD)) Einstellung, die zumindest der CMake Fehler loswerden würde, aber ich würde dagegen empfehlen - es wird sicherlich nicht für MSVC/Xcode zu arbeiten. Die einzige Option, die ich bei der Handcodierung eindeutiger Namen sehen kann, wäre eine CMake-Funktion, die einen eindeutigen Namen pro "Check" -Ziel erzeugt - zum Beispiel könnte sie den Namen des Ziels, das geprüft wird, anhängen, Namen wie check_my_lib_one, check_my_exe_one usw.

Diese Funktion liefert auch eine Liste aller registrierten check_<Target> Instanzen sammeln verwendet werden könnten, und sie zu einem einzigen Ziel hinzufügen check genannt, die jede untergeordnete check_<Target> aufrufen würde, so make check läuft, läuft sie alle .

+0

Nun, ich war auf der Suche nach etwas wie eine "Namespace pro Projekt" Art der Lösung, aber das scheint nicht in cmake existieren, also werde ich Ihre Lösung verwenden, danke! –

+0

@ Abstract-Sky technisch können Sie eine Namespace-Konvention selbst verwenden. Zum Beispiel Voranstellen aller Projektziele durch den Projektnamen. – ibizaman

+0

@ibizaman Das ist, was ich getan habe, mit einem Makro, um das Hinzufügen des Präfixes zu automatisieren. –

Verwandte Themen