如何修改CMakeLists.txt避免头文件重复至vcpkg的debug/include目录
我正尝试为一个仅头文件库创建vcpkg端口,配置与安装过程正常,但在构建后验证步骤中收到警告:
warning: Include files should not be duplicated into the /debug/include directory.
If this cannot be disabled in the project cmake, use
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
我看到的指南均是在portfile.cmake中添加上述命令,但更希望通过修改CMakeLists.txt来彻底解决问题。
项目结构如下:
hlib/ + include/ | + hlib/ | + hlib.hpp + CMakeLists.txt
当前项目的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.20) project(hlib VERSION 0.1.0 LANGUAGES CXX) include(GNUInstallDirs) if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) include(CTest) endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) add_library(hlib INTERFACE) target_include_directories( hlib INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) install(TARGETS hlib EXPORT hlib_Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) include(CMakePackageConfigHelpers) write_basic_package_version_file("hlibConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) configure_package_config_file( "${PROJECT_SOURCE_DIR}/cmake/hlibConfig.cmake.in" "${PROJECT_BINARY_DIR}/hlibConfig.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hlib/cmake) install(EXPORT hlib_Targets FILE hlibTargets.cmake NAMESPACE hlib:: DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hlib/cmake) install(FILES "${PROJECT_BINARY_DIR}/hlibConfig.cmake" "${PROJECT_BINARY_DIR}/hlibConfigVersion.cmake" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hlib/cmake) install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/hlib DESTINATION include) if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING) add_subdirectory(tests) endif()
请问需要修改哪些内容,才能避免头文件被重复复制到/debug/include目录?
问题根源在于你未指定install命令的COMPONENT参数,CMake会默认在Debug和Release配置下都安装头文件,导致vcpkg的debug/include目录出现重复文件。以下是两种修改方式:
方式一:统一设置默认组件
在CMakeLists开头(project命令之后即可)添加一行:
set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME Development)
这个变量会让所有未显式指定COMPONENT的install命令默认使用Development组件。vcpkg在处理时,Development组件只会被安装到Release对应的目录结构(即主include目录),不会同步到debug/include。
方式二:逐个指定组件
如果不想全局设置,也可以给每个install命令添加COMPONENT Development参数:
修改头文件安装命令:
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/hlib DESTINATION include COMPONENT Development)修改目标安装命令:
install(TARGETS hlib EXPORT hlib_Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Development)修改导出配置安装命令:
install(EXPORT hlib_Targets FILE hlibTargets.cmake NAMESPACE hlib:: DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hlib/cmake COMPONENT Development)修改Config文件安装命令:
install(FILES "${PROJECT_BINARY_DIR}/hlibConfig.cmake" "${PROJECT_BINARY_DIR}/hlibConfigVersion.cmake" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hlib/cmake COMPONENT Development)
两种方式都能解决头文件重复安装到debug/include的问题,推荐方式一,更简洁。
内容的提问来源于stack exchange,提问作者Kian

