Инструмент сборки BUCK позволяет мне определить пространство имен заголовка для библиотеки. Например, если у меня есть библиотека с именем libA, с такой структурой каталогов:
root
include
a.h
src
a.cpp
Я могу установить пространство header_name в библиотеке как, скажем, examples/liba
, такой, что в отдельном проекте, который использует libA, я могу:
#include "examples/liba/a.h"
Это хорошо, потому что позволяет мне сохранять упрощенную структуру каталогов в моих проектах, и в то же время держать мои включения организованными таким образом, чтобы это было более читабельным.
CMake предлагает что-нибудь подобное? Я еще не нашел что-то подобное. Моя цель — иметь файлы сборки BUCK и CMake, чтобы упростить сборку на системах без Java (одна из зависимостей BUCK).
Нет, у CMake нет такой возможности.
Стандартный способ управления заголовками — это организация их в файловой системе таким образом, что они вряд ли будут конфликтовать с другим кодом.
root
include
liba
a.h
src
a.cpp
Тогда это просто вопрос:
include_directories(include)
или лучше,
target_include_directories(liba PUBLIC include)
или, самое современное из всех,
target_include_directories(liba PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>""$<INSTALL_INTERFACE:include>")
который просто говорит сделать доступным на пути включения для всех, кто использует liba
содержимое подкаталога include
в текущей директории с исходным кодом и кем-либо, устанавливающим liba
содержание include
подкаталог (интерпретируется относительно префикса установки).
Тогда установка обычно выглядит примерно так:
install(DIRECTORY include/
DESTINATION include)
для заголовков установка всего в исходный каталог включает в себя и
install(TARGETS liba
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
для фактической цели библиотеки («libliba.a» или «libliba.so»). Еще лучше использовать переменные из include(GNUInstallDirs)
для стандартных имен папок GNU.
В вашем коде вы всегда ссылаетесь на код обычным бесконфликтным методом:
#include "liba/a.h"
Таким образом, никогда не должно быть никакого конфликта в файле или коде, если только вы не плохо умеете именовать!
Других решений пока нет …