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

如何强制让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时终止安装,但需注意以下细节:

  1. 在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
    
  2. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:27:17