You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CMake/CPack及CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA为Debian包添加conffile

解决CMake/CPack Debian包配置文件升级被覆盖问题

问题背景

使用CMake+CPack构建Debian包时,安装在/etc/test下的配置文件在包升级时会被覆盖,需要将这些文件标记为Debian的conffile,避免升级时被替换。

解决方案

Debian包通过DEBIAN/conffiles文件标记配置文件,CMake/CPack可通过CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA变量将自定义conffiles文件加入包中,步骤如下:

1. 生成conffiles文件

创建包含所有配置文件绝对路径的conffiles文件,路径需对应系统安装后的实际位置。用CMake自动生成该文件:

# 定义配置文件列表
set(CONFFILES
  /etc/test/proc-test.env
  /etc/test/sub-proc-test-1.env
  /etc/test/sub-proc-test-2.env
  /etc/test/proc-test-add.env
)

# 生成conffiles文件
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conffiles "")
foreach(CONFFILE ${CONFFILES})
  file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/conffiles "${CONFFILE}\n")
endforeach()

2. 配置CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA

将生成的conffiles文件指定给CPack,使其被包含到Debian包的控制目录中:

set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  ${CMAKE_CURRENT_BINARY_DIR}/conffiles
)

修改后的完整CMakeLists.txt片段

整合上述代码到现有配置中,最终相关部分如下:

###########
# Install #
###########
set(CMAKE_INSTALL_PREFIX "/opt/test/usr")
set(CPACK_PACKAGE_NAME test-package)
set(CPACK_PACKAGE_VENDOR "Test company")
set(CPACK_PACKAGE_CONTACT "test@company.com")
set(CPACK_PACKAGE_VERSION_MAJOR 0)
set(CPACK_PACKAGE_VERSION_MINOR 1)
set(CPACK_PACKAGE_VERSION_PATCH 2)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Test package for CPack")
set(CPACK_GENERATOR DEB)
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_PACKAGE_PRIORITY extra)

# 定义并生成conffiles文件
set(CONFFILES
  /etc/test/proc-test.env
  /etc/test/sub-proc-test-1.env
  /etc/test/sub-proc-test-2.env
  /etc/test/proc-test-add.env
)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conffiles "")
foreach(CONFFILE ${CONFFILES})
  file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/conffiles "${CONFFILE}\n")
endforeach()

# 配置CPack包含conffiles
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
  ${CMAKE_CURRENT_BINARY_DIR}/conffiles
)

install(TARGETS ${PROJECT_NAME}
  DESTINATION bin)
install(TARGETS sub-proc-test    # two programs built from my MWE
  DESTINATION bin)
install(FILES                    # these SHOULD be conffiles
  ${CMAKE_SOURCE_DIR}/proc-test.env
  ${CMAKE_SOURCE_DIR}/sub-proc-test-1.env
  ${CMAKE_SOURCE_DIR}/sub-proc-test-2.env
  ${CMAKE_SOURCE_DIR}/proc-test-add.env
  DESTINATION /etc/test)         # installed here

include(CPack)

补充说明

你提到/etc下的文件未被自动识别为conffile,原因是设置了CMAKE_INSTALL_PREFIX "/opt/test/usr",CPack默认仅识别安装前缀下的文件,而/etc/test属于系统根目录路径,不在前缀范围内,因此必须手动通过conffiles文件标记。

内容的提问来源于stack exchange,提问作者Alessandro Bertulli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:23:12