CMAKE сохраняет путь к каталогу для заголовка включает в себя из библиотеки, созданной только для заголовка

#c #cmake #header-only

Вопрос:

Я пытаюсь реструктурировать свой проект CMAKE, поместив все заголовки в отдельный проект только для заголовков cmake и добавив его с помощью target_link_libraries в мой исходный проект cmake.

Можно ли сохранить путь к папке при включении заголовков в исходный файл cpp.

Заголовки в библиотеке интерфейса также должны иметь возможность доступа к другим заголовкам из другого каталога(в рамках одного и того же проекта интерфейса cmake), используя имя папки заголовка.

ожидаемый

 #include "A/A.hpp"
#include "AGen/AGen.hpp"
#include "json/json.hpp"
 

текущая рабочая импл

 #include "A.hpp"
#include "AGen.hpp"
#include "json.hpp"
 

конфигурация моего интерфейса cmake

     set(project_includes_internal
    ${CMAKE_CURRENT_LIST_DIR}/A
    ${CMAKE_CURRENT_LIST_DIR}/B
    ${CMAKE_CURRENT_LIST_DIR}/C
    )
    
    set(project_gen_includes
    ${CMAKE_CURRENT_BINARY_DIR}/include/AGen
    ${CMAKE_CURRENT_BINARY_DIR}/include/BGen
    ${CMAKE_CURRENT_BINARY_DIR}/include/CGen
    )
    
    set(project_dep_inludes
    ${CMAKE_HOME_DIRECTORY}/dep/nlohmann/json
    )
set(PROJECT_INCLUDES
        ${project_includes_internal}
        ${project_gen_includes}
        ${project_dep_inludes})

add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME}
        INTERFACE


lt;BUILD_INTERFACE:${PROJECT_INCLUDES}>


lt;INSTALL_INTERFACE:include>
)

мои источники конфигурации cmake

 add_executable(${PROJECT_NAME}-bin ${PROJECT_TARGET_SOURCES})
target_link_libraries(${PROJECT_NAME}-bin
        PUBLIC
        ${ACTIVATION_PROJECT_INCLUDES_NAME})
 

Также можно скопировать все необходимые включаемые файлы в каталог сборки, чтобы их можно было скопировать/опубликовать в tar при установке на другие машины.

Комментарии:

1. Я не понимаю, в чем здесь проблема. Если вы хотите это сделать #include "AGen/AGen.hpp" , добавьте include каталог в target_include_directories вместо include/AGen . Кроме того, «внутренний» предполагает, что эти заголовки должны быть видны только при реализации, так зачем добавлять их в интерфейс?

2. @pptaszni не уверен, что именно вы подразумеваете под «внутренний предполагает, что эти заголовки должны быть видны только при реализации, так зачем добавлять их в интерфейс?» в основном я пытаюсь создать библиотеку только для заголовков и добавить ее в качестве цели вместо того, чтобы указывать заголовки в исходном файле cmake

3. Почему вы вызываете первую коллекцию заголовков project_includes_internal ? Я подумал, потому что это внутренние детали, и я хотел бы посоветовать не включать их в интерфейс. В противном случае все, что вы показываете, правильно. Испытываете ли вы проблемы с включением заголовков в код? Ваш (немного упрощенный) пример работает для меня.