CPack:存档中缺少接口包含目录

CPack: Interface include directories are missing in archive

我正在使用 CMake 3.10.1 并尝试使用 CPack 为库生成档案,但我无法将接口包含目录添加到档案中。

库和生成的导出文件按预期添加,但是包含目录(使用 target_include_directories(... PUBLIC ...) 添加)完全丢失。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

project(Test VERSION 1.0.0 LANGUAGES CXX)

add_library(${PROJECT_NAME} SHARED foo.cpp) #add sources and executable

target_include_directories(${PROJECT_NAME} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc>  
    $<INSTALL_INTERFACE:inc>
)

install(TARGETS ${PROJECT_NAME}
    EXPORT ${PROJECT_NAME}
    INCLUDES DESTINATION inc
    PUBLIC_HEADER DESTINATION inc
    LIBRARY DESTINATION lib
)
install(EXPORT ${PROJECT_NAME} DESTINATION .)

include(CPack)

我的源目录的内容:

├── CMakeLists.txt
├── foo.cpp
└── inc
    └── foo.h

cpack -G TGZ .

生成的tgz内容
├── lib
│   └── libTest.so
├── Test.cmake
└── Test-noconfig.cmake

知道为什么它会丢失 inc 目录吗?

Generator-like表达式$<INSTALL_INTERFACE>target_include_directories()命令中的使用本身并不安装对应的目录。您需要手动安装此目录(使用 install(FILES)install(DIRECTORY))。


表达式 $<INSTALL_INTERFACE> 指定配置文件中目标的接口包含目录,它导出 install 树(参见 install(EXPORT) 命令)。

表达式 $<BUILD_INTERFACE> 指定接口包括项目本身中的目标目录,以及导出构建树的配置文件(请参阅 EXPORT() 命令)。

但是这些表达式并不强制在安装时将 $<BUILD_INTERFACE> 目录复制到 $<INSTALL_INTERFACE> 目录中。相反,这个目录的内容通常是不同的:除了供外部使用的头文件,安装在$<INSTALL_INTERFACE>目录下,一个目录$<BUILD_INTERFACE>可能包含供项目内部使用的头文件,这些头文件没有安装。