如何强制让CMake/CPack构建的Debian包适配指定Ubuntu版本?
针对Ubuntu版本强制匹配的Deb包解决方案
一、推荐:利用Deb包的系统版本依赖字段(无需脚本)
Deb包本身支持通过Depends或Pre-Depends字段限制系统版本,这是官方推荐的原生方案,比自定义脚本更可靠——包管理器会在安装前直接校验系统版本,不符合则直接拒绝安装,完全跳过后续脚本执行环节。
在CMake中可通过CPack变量配置:
- 针对Ubuntu 20.04(代号focal):
set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, ubuntu (= 20.04)") - 针对Ubuntu 22.04(代号jammy):
set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, ubuntu (= 22.04)")
也可自动识别构建环境的Ubuntu版本,实现动态配置:
# 获取当前构建系统的Ubuntu版本号 execute_process( COMMAND lsb_release -sr OUTPUT_VARIABLE UBUNTU_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, ubuntu (= ${UBUNTU_VERSION})")
二、若坚持使用preinst脚本:确保失败后终止安装
如果必须通过preinst脚本做版本检查,需保证脚本返回非0退出码,同时让dpkg在preinst失败时停止后续流程。默认情况下dpkg会在preinst返回非0时终止安装,但需注意以下细节:
- 在preinst脚本开头添加
set -e,让脚本遇到错误立即退出并返回非0码:#!/bin/sh set -e REQUIRED_VERSION="20.04" # 根据包的目标版本修改 CURRENT_VERSION=$(lsb_release -sr) if [ "$CURRENT_VERSION" != "$REQUIRED_VERSION" ]; then echo "错误:此包仅支持Ubuntu $REQUIRED_VERSION,当前系统版本为$CURRENT_VERSION" >&2 exit 1 fi - 确保CPack正确打包脚本并赋予可执行权限:
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/preinst") # 打包前给脚本添加可执行权限 execute_process(COMMAND chmod +x "${CMAKE_CURRENT_SOURCE_DIR}/preinst")
完成以上设置后,preinst脚本返回非0时,dpkg会直接终止安装流程,postinst不会被执行。
内容的提问来源于stack exchange,提问作者codentary
相关产品推荐
相关产品推荐

