如何让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

