2016-07-12 23 views
1

Ich habe ein Projekt, das zwei Unterverzeichnisse (vereinfacht):CMake: build Teilprojekt abhängig von anderen Teilprojekt Header

project(superproj)  
add_subdirectory(foo-api) 
add_subdirectory(bar-api) 

bar-api verwendet foo-api Header und erwartet, dass sie in $PREFIX/include/foo (seine Dateien #include <foo/header.h> enthalten) installiert werden

Aber wenn ich dieses Superprojekt kompiliere, möchte ich nicht foo-api tatsächlich in meinem System installiert. Wie baue ich bar-api in diesem Fall? Ist es möglich, dies zu tun, ohne mit CMakeFile bar-api zu verwirren? Ich möchte diese beiden Projekte so unabhängig wie möglich halten, also könnte man sie einfach klonen und separat bauen.

+1

Was ist mit ['target_include_directories (... PUBLIC ...)'] (https://cmake.org/cmake/help/latest/command/target_include_directories.html) für 'foo-api'? Das ist normalerweise der Weg, Ihre Bibliothek dazu zu bringen, ihre Include-Verzeichnisse selbst zu propagieren. – Florian

Antwort

1

Verwendung include_directories:

project(superproj) 
include_directories(foo-api/path/to/includes) 
add_subdirectory(foo-api) 
add_subdirectory(bar-api) 

Es Aktion wird in dem aktuellen Verzeichnis zu allen Unterverzeichnissen weitergegeben. Und ja, überlegen Sie target_include_directories für moderne Versionen von CMake, wie Florian in Kommentaren erwähnt.

+0

Ich denke 'include_directories' wird nicht funktionieren, da der Pfad zu den Headern im Projektordner und der Pfad, in dem sie installiert werden, unterschiedlich sind. Ich meine, sie finden in 'foo-api/include/some_header.h', aber installieren sie in'/usr/include/foo/some_header.h'. Und in 'bar-api' Dateien ist' #include '. Also kann ich 'include_directories' nicht einfach hinzufügen, ohne die' include' Direktive in 'bar-api' Dateien zu ändern. –

+1

@c_spk Das ist ein wichtiges Anliegen. Sieht so aus, als müssten Sie einen Alias ​​für den Include-Pfad erstellen, aber Compilern fehlt diese Funktion, sodass das Build-System hier nichts zu tun hat. Als Workaround können Sie 'foo-api/foo' symlink erstellen, der auf' foo-api/include' verweist und 'foo-api' hinzufügen, um include_directories hinzuzufügen. Nochmals, cmake hat keine Symlink-Erstellungsfunktion (vielleicht, weil nicht alle Dateisysteme sie unterstützen?), Und Sie müssen Symlinking für alle unterstützten Plattformen mit 'add_custom_target' oder' add_custom_command' automatisieren. – Sergey