设置 Cmake Cpack 以使用 debian/rules?

问题描述 投票:0回答:1

我有一些用于 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#
以及合理的当前构建系统 [...]

我通过从

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
运行后,
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,但我无法判断它是否与我的问题相关/可以帮助解决我的问题)。

linux cmake debian systemd debhelper
1个回答
0
投票

嗯,刚刚发现这个: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)...

© www.soinside.com 2019 - 2024. All rights reserved.