CPack子项目和公共标题

时间:2018-10-05 14:21:57

标签: cmake cpack subproject

我对CPack有疑问。 我有一个项目test_lib_1,它依赖于其他2个项目test_lib_2和test_lib_3。 test_lib_2和3都定义了自己的CPACK规则,定义了要打包的PUBLIC_HEADER。 test_lib_1具有相同的规则,打包二进制文件和一些public_header。使用CPack,我得到了一个包含test_lib_1的二进制文件及其公共头文件,其他两个子项目的二进制文件(动态库)以及两个子项目的公共头文件的软件包:test_lib_2和test_lib_3。

这是我的test_lib_1的CMakeLists.txt(对于其他两个,该文件是相似的,没有包含两个子项目)。

cmake_minimum_required(VERSION 3.10)

set(PROJECT_NAME "test_lib_1")
set(PROJECT_VERSION 1.0.0)
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/opt/company")

project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} DESCRIPTION "test_lib_1 description")

file(GLOB PROJECT_INTERFACE "include/*.h")
file(GLOB PROJECT_HEADERS "src/*.h")
file(GLOB PROJECT_SRCS "src/*.cpp")

add_subdirectory(test_lib_2)
add_subdirectory(test_lib_3)

add_library(${PROJECT_NAME} SHARED ${PROJECT_INTERFACE} ${PROJECT_HEADERS} ${PROJECT_SRCS})

target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")

target_link_libraries(${PROJECT_NAME} test_lib_2)
target_link_libraries(${PROJECT_NAME} test_lib_3)

set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION})

set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${PROJECT_INTERFACE}")

install(TARGETS ${PROJECT_NAME} 
    PUBLIC_HEADER DESTINATION "include"
    ARCHIVE DESTINATION "lib"
    RUNTIME DESTINATION "bin"
    LIBRARY DESTINATION "bin"
    )

set(CPACK_PACKAGE_CONTACT "Contact")

if(WIN32)
    set(CPACK_GENERATOR ZIP)
else()
    set(CPACK_GENERATOR "DEB" )
    set(CPACK_SET_DESTDIR TRUE )
endif()

include(CPack)

我当前的输出是: bin-> test_lib_1.dll; test_lib_2.dll; test_lib_3.dll 包括-> test_lib_1.h; test_lib_2.h; test_lib_3.h ...

预期为: bin-> test_lib_1.dll; test_lib_2.dll; test_lib_3.dll 包括-> test_lib_1.h;

没有test_lib_2和test_lib_3公共头。

有什么主意吗?

1 个答案:

答案 0 :(得分:0)

我自己找到了一个可能的解决方案。 这个想法是用

包围install + cpack部分
get_directory_property(hasParent PARENT_DIRECTORY)
if(NOT hasParent)
...
endi()

这样,如果当前项目是子项目,则它不会填充install和cpack的变量,并且不会参与install和cpack的说明。

希望它可以帮助其他人