Ich habe ein Projekt A, das eine statische Bibliothek als Ziel exportiert:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Jetzt möchte ich Projekt A als externes Projekt aus Projekt B verwenden und die erstellten Ziele einbeziehen:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Das Problem ist, dass die Include-Datei noch nicht vorhanden ist, wenn CMakeLists von Projekt B ausgeführt wird.
Gibt es eine Möglichkeit, das Include vom zu erstellenden externen Projekt abhängig zu machen?
Update : Ich habe ein kurzes CMake by Example-Tutorial geschrieben, das auf diesem und anderen häufig auftretenden Problemen basiert.
quelle
ExternalProject_Add
nur so verhaltenadd_subdirectory
und alle Ziele bloßstellen würden. Die oben beschriebene Lösung ist wahrscheinlich immer noch die sauberste.ExternalProject
. Ist es Konsistenz oder kanonischer oder etwas anderes? Ich bin sicher, ich vermisse hier etwas Grundlegendes.Dieser Beitrag hat eine vernünftige Antwort:
CMakeLists.txt.in
::CMakeLists.txt
::Es scheint jedoch ziemlich hackig. Ich möchte eine alternative Lösung vorschlagen - verwenden Sie Git-Submodule.
Dann
MyProject/dependencies/gtest/CMakeList.txt
können Sie in etwas tun wie:Ich habe das noch nicht ausgiebig ausprobiert, aber es scheint sauberer zu sein.
Bearbeiten: Dieser Ansatz hat einen Nachteil: Das Unterverzeichnis führt möglicherweise
install()
Befehle aus, die Sie nicht möchten. Dieser Beitrag hat einen Ansatz, um sie zu deaktivieren, aber er war fehlerhaft und hat bei mir nicht funktioniert.Bearbeiten 2: Wenn Sie verwenden
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
, bedeutet dies, dass dieinstall()
Befehle im Unterverzeichnis standardmäßig nicht verwendet werden.quelle
GIT_TAG
beim Klonen immer ein bestimmtes zu verwenden. Sie könnten die Wiederholbarkeit des Builds verlieren, da in 2 Jahren jemand, der das Build-Skript ausführt, einen erhält andere Version als das, was du getan hast. CMakes Dokumente empfehlen dies ebenfalls.Bearbeiten: CMake hat jetzt eine integrierte Unterstützung dafür. Siehe neue Antwort .
Sie können den Build des abhängigen Ziels auch in einem sekundären Make-Prozess erzwingen
Siehe meine Antwort zu einem verwandten Thema.
quelle
cmake
ExternalProject_Add
kann zwar verwendet werden, aber was mir nicht gefallen hat - ist, dass es während des Builds, der kontinuierlichen Abfrage usw. etwas ausführt. Ich würde es vorziehen, ein Projekt während der Build-Phase zu erstellen, sonst nichts. Ich habe versucht,ExternalProject_Add
in mehreren Versuchen zu überschreiben , leider ohne Erfolg.Dann habe ich auch versucht, ein Git-Submodul hinzuzufügen, aber das zieht das gesamte Git-Repository in Mitleidenschaft, während ich in bestimmten Fällen nur eine Teilmenge des gesamten Git-Repositorys benötige. Was ich überprüft habe - es ist zwar möglich, eine spärliche Git-Prüfung durchzuführen, dies erfordert jedoch eine separate Funktion, die ich unten geschrieben habe.
Ich habe unten zwei Funktionsaufrufe hinzugefügt, um zu veranschaulichen, wie die Funktion verwendet wird.
Jemand möchte möglicherweise nicht Master / Trunk auschecken, da dieser möglicherweise defekt ist. Dann ist es immer möglich, ein bestimmtes Tag anzugeben.
Das Auschecken wird nur einmal durchgeführt, bis Sie den Cache-Ordner löschen.
quelle
Ich suchte nach einer ähnlichen Lösung. Die Antworten hier und das Tutorial oben sind informativ. Ich habe die hier genannten Beiträge / Blogs studiert, um meine erfolgreich aufzubauen. Ich poste eine vollständige CMakeLists.txt, die für mich funktioniert hat. Ich denke, dies wäre als grundlegende Vorlage für Anfänger hilfreich.
"CMakeLists.txt"
quelle