如何用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
相关产品推荐
相关产品推荐

