如何让CPack仅构建打包所需的必要目标?
解决CPack打包时仅构建必要目标的问题
针对你遇到的ninja package会构建所有target但仅打包少数标记安装的目标的问题,有几种简洁的解决方案,无需替换install命令:
方法1:自定义轻量打包目标
在顶层CMakeLists.txt中,在include(CPack)之后添加以下代码,创建一个只聚焦必要目标的打包命令:
include(CPack) # 自定义目标:仅构建安装所需的target及其依赖 add_custom_target(install-required COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target install USES_TERMINAL ) # 自定义打包目标:先完成必要构建,再执行CPack add_custom_target(package-fast COMMAND ${CMAKE_CPACK_COMMAND} -G DEB ${CMAKE_BINARY_DIR} DEPENDS install-required USES_TERMINAL )
之后只需运行ninja package-fast,该命令会仅构建被install(TARGET)标记的目标及其依赖,随后自动执行打包。
方法2:调整install目标的默认行为
如果你的install目标当前被设置为依赖所有项目target(通常是因为项目中未明确分离构建目标),可以修改其属性让它仅关注安装需求:
# 将install目标排除在默认的ALL构建目标之外 set_target_properties(install PROPERTIES EXCLUDE_FROM_ALL TRUE)
修改后运行ninja package时,就只会构建install目标依赖的必要内容,而非全部target。注意:如果你的安装流程依赖未被install命令标记的target,这个方法可能导致问题,需提前验证。
方法3:分步执行命令(无需修改CMake)
如果不想改动CMake配置,直接分步执行以下命令即可:
# 仅构建安装所需的target ninja install # 执行Deb包打包 cpack -G DEB
CMake的install目标本身只会构建完成安装所需的内容,不会触发全部target的构建,后续再单独运行CPack即可完成打包。
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

