2009-09-22 16 views
26

Ich habe zwei Projekte, die beide CMake verwenden. Jetzt möchte ich eines der Projekte als eine Bibliothek in das andere integrieren, während ich weiterhin die Fähigkeit habe, sie als eigenständige Projekte zu kompilieren.Ein Cmake-Projekt in ein anderes einbetten?

Was ich bisher getan habe: Verwenden Sie das Versionskontrollsystem, um eine Kopie des untergeordneten Projekts in einem Unterverzeichnis des übergeordneten Projekts zu klonen. Ich habe das "add_subdirectory" verwendet, um die CMakeLists.txt des untergeordneten Projekts in das übergeordnete Projekt aufzunehmen. Und ich habe Namenskollisionen zwischen Zielen durch Umbenennen einiger Ziele im Kindprojekt behoben.

Ein Problem, das ich jedoch habe, ist, dass die verschiedenen Konfigurationstests im untergeordneten Projekt nicht ausgeführt werden. Das untergeordnete Projekt verwendet beispielsweise das FindThreads-Modul, um zu ermitteln, welche Synchronisationselemente verfügbar sind. Das übergeordnete Projekt kennt Threading-Probleme nicht und hat daher keine diesbezüglichen Tests. In ähnlicher Weise verfügt das untergeordnete Projekt über verschiedene Tests für Header und solche, die vom übergeordneten Projekt nicht benötigt werden. Keiner dieser Tests scheint zu laufen, und die durch diese Tests definierten Symbole werden der CMakeCache.txt-Datei nicht hinzugefügt.

Ich möchte wirklich nicht alle Tests des untergeordneten Projekts (die sich hauptsächlich mit plattformspezifischen Problemen beschäftigen, die für den Elternteil nicht relevant sind) in die CMakeLists.txt des übergeordneten Projekts hissen.

Antwort

17

CMake 2.8 hat ein neues Modul External Project hinzugefügt, mit dem Sie ein benutzerdefiniertes Ziel erstellen können, um den Build eines anderen CMake-Projekts zu steuern. Die Dokumentation dazu ist etwas schwach, aber es sieht so aus, als könnte es tun, was Sie wollen.

Ich denke, die Idee wäre, ExternalProject_Add von Ihrem übergeordneten Projekt aufzurufen und es auf das Quellverzeichnis des untergeordneten Projekts zu verweisen (Sie können sogar das untergeordnete Projekt aus SVN oder CVS für Sie überprüfen, nett!).

+1

Danke, ich habe kürzlich mit externen Projekten gearbeitet und sie machen was ich will. Da ich git-Teilprojekte verwende, muss ich ExternalProject_Add anweisen, das externe Projekt nicht herunterzuladen oder zu installieren - dies kann durch Setzen der Download- und Installationsbefehle auf "" (leere Zeichenkette) erfolgen. – Talin