Есть ли cmake, эквивалентный BUCK header_namespace?

Инструмент сборки BUCK позволяет мне определить пространство имен заголовка для библиотеки. Например, если у меня есть библиотека с именем libA, с такой структурой каталогов:

root
include
a.h
src
a.cpp

Я могу установить пространство header_name в библиотеке как, скажем, examples/liba, такой, что в отдельном проекте, который использует libA, я могу:

#include "examples/liba/a.h"

Это хорошо, потому что позволяет мне сохранять упрощенную структуру каталогов в моих проектах, и в то же время держать мои включения организованными таким образом, чтобы это было более читабельным.

CMake предлагает что-нибудь подобное? Я еще не нашел что-то подобное. Моя цель — иметь файлы сборки BUCK и CMake, чтобы упростить сборку на системах без Java (одна из зависимостей BUCK).

1

Решение

Нет, у 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"

Таким образом, никогда не должно быть никакого конфликта в файле или коде, если только вы не плохо умеете именовать!

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector