2016-07-12 2 views
1

У меня есть проект, содержащий два подкаталога (упрощенный):CMake: сборка подпроектов в зависимости от другого подпроекта заголовка

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

bar-api использует foo-api заголовки и ожидает, что их можно устанавливать в $PREFIX/include/foo (его файлы содержат #include <foo/header.h>)

Но когда я скомпилирую этот суперпроект, я не хочу, чтобы foo-api фактически был установлен в моей системе. Как мне построить bar-api? Можно ли это сделать, не возившись с CMakeFile bar-api? Я хочу, чтобы эти два проекта были максимально независимыми, поэтому можно было просто клонировать и строить их отдельно.

+1

Как насчет ['target_include_directories (... PUBLIC ...)'] (https://cmake.org/cmake/help/latest/command/target_include_directories.html) для 'foo-api'? Обычно это способ сделать вашу библиотеку самораспространяющейся, включая каталоги. – Florian

ответ

1

Использование include_directories:

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

Это действие распространяется на все подкаталоги в текущем каталоге. И да, рассмотрим target_include_directories для современных версий CMake, как отметил Флориан в комментариях.

+0

Я думаю, что 'include_directories' не будет работать, потому что путь к заголовкам в папке проекта и пути, где они устанавливаются, различаются. Я имею в виду, что они находятся в 'foo-api/include/some_header.h', но устанавливают на'/usr/include/foo/some_header.h'. И в файлах 'bar-api' это' #include '. Поэтому я не могу просто добавить 'include_directories', не изменяя директиву' # include' в файлах 'bar-api'. –

+1

@c_spk Это важная проблема. Похоже, вам нужно создать псевдоним для include path, но компиляторам не хватает этой функции, поэтому система сборки здесь не имеет никакого отношения. В качестве обходного пути вы можете создать символическую ссылку 'foo-api/foo', которая указывает на' foo-api/include' и добавить 'foo-api' в include_directories. Опять же, у cmake отсутствует функция создания символических ссылок (возможно, потому, что не все файловые системы поддерживают их?), И вам нужно будет автоматизировать символическую привязку для всех поддерживаемых платформ, используя 'add_custom_target' или' add_custom_command'. – Sergey

Смежные вопросы