如何在CMake CPack配置中使用debian/rules实现服务自动启停?
问题
我有一个Linux服务的C++代码,已经用CPack构建.deb包,执行make package_deb可以正常完成构建,相关CMake配置如下:
install(PROGRAMS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} DESTINATION bin ) install(FILES ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.service DESTINATION /usr/lib/systemd/system ) # ... SET(CPACK_GENERATOR "DEB") SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "The Maintainer") #required set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) string(REPLACE "_" "-" CPACK_PACKAGE_NAME "${PROJECT_NAME}") set (CPACK_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/BundleConfig.cmake") include(CPack) # ... add_custom_target(package_deb COMMAND "${CMAKE_CPACK_COMMAND}" "-C" "$<CONFIGURATION>" "--config" "${CMAKE_BINARY_DIR}/BundleConfig.cmake" COMMAND /bin/bash ${CMAKE_CURRENT_BINARY_DIR}/post_package_deb.sh )
安装该包后无法自动启用并启动systemd服务。经查阅资料,需要完成三项配置:
- 在
rules文件中添加dh $@ --with systemd - 在
control文件中添加Build-Depends: dh-systemd - 在
postinst文件中添加#DEBHELPER#
还可以通过在rules的override_dh_auto_install目标中手动调用dh_systemd_enable和dh_systemd_start实现服务默认运行及安装后启动,示例配置如下:
%: dh $@ --with-systemd override_dh_auto_install: dh_auto_install dh_systemd_enable || true dh_systemd_start || true
但我不知道如何在CMakeLists.txt的CPack配置中引用自定义的debian/rules文件。我注意到CPACK_DEBIAN_PACKAGE_MAINTAINER会在构建后自动生成的control文件中对应Maintainer:字段,但不知如何配置rules文件以实现上述重载,查阅CMake官方CPackDeb文档未找到相关内容,也不确定dh-cmake是否能解决此问题。
解决方法
方法1:通过CPack内置变量直接配置(无需手动编写debian模板)
CPackDeb提供了原生变量可以直接实现systemd服务的自动启用与启动,不需要手动创建debian/rules等文件:
- 添加构建依赖
使用CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS变量注入dh-systemd依赖:set(CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS "dh-systemd") - 配置服务自动启用与启动
- 首先在项目目录创建
debian/postinst脚本,内容如下:#!/bin/sh #DEBHELPER# - 然后在CMake中配置CPack加载该脚本:
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/debian/postinst" ) - 最后通过
CPACK_DEBIAN_SYSTEMD_SERVICE变量指定服务文件,CPack会自动调用dh_systemd_enable和dh_systemd_start:set(CPACK_DEBIAN_SYSTEMD_SERVICE "${PROJECT_NAME}.service")
- 首先在项目目录创建
方法2:使用自定义debian模板目录
如果需要完全自定义debian规则文件,可以让CPack直接使用你预先编写的模板:
- 在项目根目录创建
debian文件夹,放入自定义的rules、control、postinst文件:rules使用你提供的示例内容control在原有字段基础上添加Build-Depends: dh-systemdpostinst保留#DEBHELPER#标识
- 在CMake中禁用CPack自动生成规则的逻辑,并指定自定义模板目录:
set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS OFF) set(CPACK_DEBIAN_PACKAGE_CUSTOM_TEMPLATE_DIR "${CMAKE_SOURCE_DIR}/debian")
注意事项
- 确保你的
.service文件包含正确的[Install]段,例如WantedBy=multi-user.target,否则dh_systemd_enable无法正常启用服务。 - 使用方法1时,无需手动编写
rules文件,CPack会自动完成dh-systemd的集成。 - 安装包后可通过
systemctl status ${PROJECT_NAME}.service检查服务状态,或查看/var/log/dpkg.log确认脚本执行情况。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

