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

如何让CMake构建Deb包时不将/etc目录下的脚本标记为配置文件?

如何让CMake构建Deb包时不将/etc目录下的脚本标记为配置文件?

我太懂你这个困扰了!CMake打包Deb的时候确实有这个“默认操作”——只要是安装到/etc目录下的文件,不管是正经配置文件还是你这种控制机器重启的脚本,都会被自动塞进debian目录的conffiles里,导致dpkg把它们当成配置文件,卸载的时候不肯删除;自己手动写conffiles还会被CMake追加内容,在postrm里删又容易触发文件找不到的错误,真的麻烦。

其实解决方法很直接,利用CMake的CPack Deb模块提供的变量就能完全控制conffiles的内容,具体分两种情况:

  • 如果你的包有真正需要保留的配置文件:
    在CMakeLists.txt里用CPACK_DEBIAN_PACKAGE_CONFFILES变量手动指定哪些是配置文件,比如你只有/etc/myapp/main.conf是需要标记为配置文件的,就加这一行:

    set(CPACK_DEBIAN_PACKAGE_CONFFILES "/etc/myapp/main.conf")
    

    这样CMake就不会自动把/etc下的所有文件都塞进conffiles,只会用你指定的内容,你的脚本自然就不会被标记成配置文件了。

  • 如果你的包完全不需要配置文件:
    直接把这个变量设为空就行:

    set(CPACK_DEBIAN_PACKAGE_CONFFILES "")
    

    这时候CMake生成的conffiles文件是空的,/etc下的脚本就会被当成普通可执行文件,卸载时会被dpkg自动删除。

结合你给的最小CMakeLists.txt,修改后应该是这样:

cmake_minimum_required(VERSION 3.20)

project(test VERSION 1.1.0)

set(PACKAGE_VERSION ${PROJECT_VERSION})

install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/test_script.sh DESTINATION /etc/molly-guard/run.d)

# 关键配置:空值表示没有需要标记的配置文件
set(CPACK_DEBIAN_PACKAGE_CONFFILES "")

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})

include(CPack)

修改完后重新运行cmake和cpack打包,你去debian目录里看conffiles,就会发现里面没有你的脚本路径了,安装包之后卸载,test_script.sh就会被正常删除,不会再出现之前的问题。

备注:内容来源于stack exchange,提问作者GatoMiador

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:58:09