提问者:小点点

CMAKE/CPACK:I想要 deb 在安装后执行 bash 脚本,但它不起作用


我用 cmake/cpack 构建了一个 debian 软件包。我希望 deb 在我安装 deb 后执行一个 bash 脚本。我安装 deb 使用 sudo dpkg -i my.deb.如果我像这样安装 deb,则安装程序的用户和组是 root。所以我希望 deb 自动执行一个 bash 脚本,以使用当前登录的用户和组修改用户和组。

我发现SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA,./script/postinst)可以做到这一点。所以我确实喜欢这样,但它没有用。

我喜欢这个:

install(PROGRAMS${CMAKE_SOURCE_DIR}/script/postinst DESTINATION ./script)

设置(CPACK_GENERATOR“DEB”)

套装(CPACK_PACKAGE_NAME “mydeb”)

套装(CPACK_PACKAGE_VERSION “1.0”)

套(CPACK_DEBIAN_PACKAGE_MAINTAINER“乔治”)

set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA, ./script/postinst)

设置(CPACK_PACKAGING_INSTALL_PREFIX“USR”)

包括(CPACK)

Postinst 是一个 bash scritp,用于使用当前登录的用户和组修改已安装程序的用户和组

如果有什么不对劲的地方?我需要帮助


共3个答案

匿名用户

我以同样的方式这样做。就我而言,我使用 set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA, ./script/postinst) 将 systemd 服务设置为在启动时运行。

类似地,我使用 set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA, ./script/prerm) 在实际删除 Debian 软件包之前,从引导序列中干净地删除服务。

这里的一个重要注意事项是,您不需要单独安装这些文件。set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA, ./script/postinst) 就足够了,因此不需要 install(DIRECTORY ${CMAKE_SOURCE_DIR}/scripts/ DESTINATION ${SCRIPT_DESINATION}。请确保正确设置了这些附加脚本的权限。

匿名用户

通常,postinst 脚本不应修改与一个用户直接相关的任何内容,但应完成整个系统的安装。例如,如果需要基于系统上存在的硬件生成配置文件,则可以使用 postinst 脚本。我不知道您的用户脚本可以做什么来建议可能的替代方案。

匿名用户

我用

# generate the shell script from template.                            #
CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/contrib/postinst.in" "postinst" @ONLY IMMEDIATE)
# and 
# hook up the event postinst to run after install                       #
SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_BINARY_DIR}/postinst;")

我真的不需要使用模板,即 .in 文件,但如果我需要更复杂的东西,我有可能@varname@ varname 现在是一个 cmake 变量,我的 postinst.in

#!/usr/bin/env sh
/usr/sbin/ldconfig
# vim: set filetype=sh

基本上一个shell脚本也有postrmprerm也有shell脚本 https://cmake.org/cmake/help/latest/cpack_gen/deb.html,但cmake和cpack的文档非常差。不确定何时发生 Postrm 和 prerm,但 Postinst 在安装后运行,因此在安装我的 .so 文件后运行 ldconfig 的最佳时机