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

时间:2018-02-22 16:05:09

标签: c++ cmake cpack

我正在使用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目录?

1 个答案:

答案 0 :(得分:1)

$<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>可能包含项目内部使用的头文件,这些文件未安装。