使用CPack生成多Debian包时如何排除无需打包的组件
解决方案
有两种不需要修改只读子目录配置的方法可以实现需求:
方法1:显式指定需要打包的组件列表
CPack默认会收集所有已定义的组件进行打包,你可以通过覆盖CPACK_COMPONENTS_ALL变量,仅声明你需要保留的组件即可。
在主CMakeLists.txt的include(CPack)语句之前添加如下配置:
set(CPACK_COMPONENTS_ALL main-comp)
这个变量会直接指定CPack需要处理的组件范围,未列入的组件会被完全忽略。
方法2:标记不需要的组件为禁用状态
如果需要保留的组件数量较多,逐个列举太麻烦,可以直接将不需要的组件标记为禁用:
同样在include(CPack)之前添加配置:
cpack_component_set_properties(remove-me PROPERTIES DISABLED TRUE)
标记为DISABLED的组件不会被CPack纳入打包流程。
修改后的主CMakeLists.txt完整示例:
cmake_minimum_required(VERSION 3.18) project(p) add_subdirectory(dep EXCLUDE_FROM_ALL) # define our install + component install(FILES main.py DESTINATION main COMPONENT main-comp ) # enable deb component install set(CPACK_DEB_COMPONENT_INSTALL ON) # disable unused package formats set(CPACK_BINARY_STGZ OFF) set(CPACK_BINARY_TZ OFF) set(CPACK_SOURCE_TGZ OFF) set(CPACK_BINARY_DEB ON) set(CPACK_PACKAGE_CONTACT foo@bar.com) # 剔除不需要的组件(二选一即可) set(CPACK_COMPONENTS_ALL main-comp) # 或者使用:cpack_component_set_properties(remove-me PROPERTIES DISABLED TRUE) include(CPack)
补充说明
add_subdirectory(EXCLUDE_FROM_ALL)仅控制默认构建、安装流程中是否编译该子目录的目标,不会影响CPack对组件的全局收集逻辑,因此单独使用该参数无法屏蔽子目录中定义的组件。
两种方案都兼容你使用的CMake 3.18.4版本,修改后重新执行make package,只会生成main-comp对应的deb包,不会再出现remove-me组件的包。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

