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

如何在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等文件:

  1. 添加构建依赖
    使用CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS变量注入dh-systemd依赖:
    set(CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS "dh-systemd")
    
  2. 配置服务自动启用与启动
    • 首先在项目目录创建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直接使用你预先编写的模板:

  1. 在项目根目录创建debian文件夹,放入自定义的rules、control、postinst文件:
    • rules使用你提供的示例内容
    • control在原有字段基础上添加Build-Depends: dh-systemd
    • postinst保留#DEBHELPER#标识
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:35:00