我有一些用于 Linux 服务的 C++ 代码,我使用 CPack 创建了 .deb 包,它构建得很好,然后我运行
make package_deb
:
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
)
问题是,安装包并不会自动启用并启动服务;此处讨论/回答了这一点:自动启用使用 deb 安装的 systemd 服务? - Unix 和 Linux 堆栈交换 :
您需要 3 样东西:
包含rules
、dh $@ --with systemd
包含control
、Build-Depends: dh-systemd
包含postinst
以及合理的当前构建系统 [...]#DEBHELPER#
我通过从
中的override_dh_auto_install目标手动调用dh_systemd_enable(使服务默认运行)和dh_systemd_start(在安装后实际启动它)来解决这个问题,所以它看起来像这样:rules
%: 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
运行后,Maintainer:
最终成为自动生成的 control
文件中的 make package_deb
字段 - 但是我该如何处理 rules
文件,以便我可以覆盖上述内容?我在 https://cmake.org/cmake/help/v3.4/module/CPackDeb.html 中看不到太多(Ctrl-F "/rules" - 0 结果)(我还看到存在称为https://gitlab.kitware.com/debian/dh-cmake,但我无法判断它是否与我的问题相关/可以帮助解决我的问题)。
嗯,刚刚发现这个:https://github.com/ABruines/CPackDebHelper
一个 CMake 模块,允许您的项目使用 debhelper 工具套件来协助 CPack DEB 生成器。
示例 ./CMakeLists.txt 包含一个使用该模块的小项目。
...示例 https://github.com/ABruines/CPackDebHelper/blob/master/CMakeLists.txt 的代码如下:
# ...
#
# Set CPackDebHelper vars:
#
# Required. The directory that contains the files listed in CPACK_DEBHELPER_INPUT
set(CPACK_DEBHELPER_INPUT_DIR "${CMAKE_SOURCE_DIR}/src/debian")
# Required. List of input files that require processing by the debhelpers.
# ...
set(CPACK_DEBHELPER_INPUT
control.in
${CPACK_DEBIAN_PACKAGE_NAME}.changelog.in
# ...
# Optional. Set the debhelper compatability level, if left unset CPackDebHelper
# sets this to 12.
unset(CPACK_DEBHELPER_COMPAT)
# ...
所以,我想这会有所帮助 - 而且 CMake 中可能没有本地工具(至少我使用的 CMake 3.28)...