Calibre 运行的二三事

本文基于 Calibre 2025.2_38.18 版本在CentOS 7.9 上运行的经验,对 Calibre 的启动逻辑进行分析。

版本:Siemens Calibre AOJ 2025.2_38.18
平台:CentOS 7.9 / RHEL 7
作者:工程实录
日期:2026-03-17


一、背景

Siemens Calibre 是 EDA 领域最广泛应用的物理验证工具之一,涵盖 DRC、LVS、PEX 等核心流程。其官方文档明确列出了支持的操作系统组合:

软件树(VCO) 支持平台
aoj RHEL 7 / SLES 12SP3(需 AVX2)
aok RHEL 8(需 AVX2)
soa SLES 15.2+(需 AVX2)
aaw RHEL 9 AArch64

然而,从 2025.1 版本开始,Siemens 正式宣布 RHEL 7(及 aoj 软件树)进入极度受限支持阶段,并计划在 2025.3 版本中完全停止支持。这意味着即便你使用的是理论上仍受支持的 CentOS 7.9,在 2025.2 版本中执行 calibre -gui 时,也会遭遇一道”人为设置的拦截门”。

本文通过详细分析 Calibre 的启动脚本,揭示这道拦截门的运作机制,以及各类网传环境变量的真实效果。


二、启动脚本的调用链

执行 calibre -gui 时,调用链如下:

1
2
3
4
5
6
7
8
9
bin/calibre
  └─→ pkgs/icv.aoj/bin/calibre          (符号链接指向真实脚本)
        ├─ source bin/calibre_env        (环境初始化)
        │     └─→ pkgs/icv_calenv.aoj/bin/calibre_env
        │           ├─ 调用 calibre_vco  (检测当前 OS 对应的 VCO)
        │           ├─ deprecation_error()   (RHEL 6 / SLES 11 拦截)
        │           └─ deprecation_warning() (RHEL 7 / aoj 拦截 ← 核心)
        ├─ source pkgs/icv_calenv/pvt/calibre_host_info (读取 OS 信息)
        └─ exec cgi_app                  (最终启动 GUI 程序)

重要发现bin/ 目录下的所有可执行文件全部是符号链接,真正的脚本逻辑位于 pkgs/icv_calenv.aoj/pkgs/icv.aoj/ 中。这一点在用 find -type f 搜索时容易被忽略。


三、OS 识别机制

calibre_host_info 脚本通过读取 /etc/os-release(或旧格式 /etc/redhat-release)获取系统信息,并将其标准化为以下变量:

1
2
3
4
5
OS_VENDOR=redhat      # CentOS / AlmaLinux / Rocky / RHEL 均映射为 "redhat"
OS_MAJOR_REV=7        # 主版本号
OS_MINOR_REV=9        # 次版本号
OS_ARCH=x86_64
OS_AVX2=1             # 若 CPU 支持 AVX2 指令集则非空

calibre_vco 根据这些变量决定 VCO 值:

1
2
3
4
5
6
7
8
elif test "$OS_VENDOR" = redhat -a "$OS_MAJOR_REV" -eq 7
then
  if test -n "$OS_AVX2"
  then
    VCO=aoj   # ← CentOS 7 + AVX2 → aoj
  else
    error_exit 'VCO "aoj" is only supported on AVX2 capable hardware...'
  fi

随后 calibre_env 检查当前 VCO 与软件树类型(pkgs/icv_calenv/dependencies/sw_type 内容为 aoj)是否匹配,匹配后进入 deprecation_warning() 函数


四、拦截门的核心:deprecation_warning() 函数

这是整个问题的核心所在。该函数位于 pkgs/icv_calenv.aoj/bin/calibre_env 第 85–128 行,包含两个独立的判断块,按顺序依次执行:

Block 1:授权密钥检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 若在 Siemens 内网,从内部脚本预设密钥
test -x $rhel7chk && . $rhel7chk

# 对环境变量做"部分校验"(完整校验在 Calibre 二进制内部完成)
if echo "$CALIBRE_2025_1_ENABLE_DEPRECATED_RHEL7$CALIBRE_2025_2_ENABLE_DEPRECATED_RHEL7" \
  | egrep -q '36|85'
then
  partial_failed=''      # 密钥通过
else
  echo "Error: Calibre RHEL 7 (and aoj) enabling environment variable is not set..."
  CALIBRE_SKIP_OS_CHECKS=''          # ← 强制清空!
  CALIBRE_DISABLE_RHEL7_WARNING=''   # ← 强制清空!
  partial_failed=yes
fi

关键设计:当密钥检查失败时,脚本会主动清空 CALIBRE_SKIP_OS_CHECKSCALIBRE_DISABLE_RHEL7_WARNING,封堵使用这两个变量绕过的路径。

Siemens 内部用户在其内网通过 /user/icdet/bin/set_rhel7_beta_var 自动获取密钥;外部客户需联系 Siemens EDA 支持团队获取。

Block 2:退出门卫

1
2
3
4
5
6
7
8
9
if test -z "$CALIBRE_SKIP_OS_CHECKS$CALIBRE_DISABLE_RHEL7_ERR"
then
  cat <<'!EOF!'
// Support for running Calibre aoj applications ...
// RHEL 7 support is fully discontinued as of the Calibre 2025.3 release.
// To disable this message, use "setenv CALIBRE_DISABLE_RHEL7_WARNING 1"
!EOF!
  test "$partial_failed" = "yes" && exit 1    # ← 终止启动的那一行
fi

exit 1 仅在此处触发。触发条件为:

  1. partial_failed=yes(Block 1 密钥检查失败),并且
  2. CALIBRE_SKIP_OS_CHECKS 为空(已被 Block 1 清空),并且
  3. CALIBRE_DISABLE_RHEL7_ERR 为空(从未被脚本清空)

只要第 3 项非空,整个 Block 2 直接被跳过执行,exit 1 永远不会触发。


五、社区流传的常见环境变量

经过对整个安装目录的全量文件搜索,以下是各变量的真实情况:

❌ 无效变量(整个安装目录中不存在)

这三个变量在所有文件中完全没有匹配项,属于网络上流传的”猜测性”写法:

setenv CALIBRE_RHEL7_ENABLE 1    # ❌ 脚本中不存在此变量
setenv CALIBRE_AOJ_ENABLE 1      # ❌ 脚本中不存在此变量
setenv AOJ_ENABLE 1              # ❌ 脚本中不存在此变量

设置这些变量对 Calibre 的启动逻辑毫无影响


⚠️ 存在但无法单独起效的变量

CALIBRE_DISABLE_RHEL7_WARNING

1
出现位置:calibre_env 第 101、115、124、125 行

该变量名具有很强的误导性。它在警告文字中被推荐,但实际效果受到严格限制:

  • Block 1 失败时,脚本在第 101 行将其强制清空
  • 警告信息”To disable this message, use setenv CALIBRE_DISABLE_RHEL7_WARNING 1“仅对密钥验证通过的用户有意义(用于抑制嵌套调用中的重复警告输出)
  • 外部用户提前设置此变量,Block 1 执行后即被覆盖为空,无法阻止 exit 1

CALIBRE_SKIP_OS_CHECKS

1
出现位置:calibre_env 第 28、65、100、105、140、279、295、298 行

这是 Calibre 脚本体系中的通用 OS 检查跳过标志,在其他场景(如热启动子调用)中会被设为 1。但在 deprecation_warning() 路径中,Block 1 失败时同样在第 100 行被强制清空,与 CALIBRE_DISABLE_RHEL7_WARNING 同命运。


✅ 有效绕过变量

CALIBRE_DISABLE_RHEL7_ERR

1
出现位置:calibre_env 第 105 行(全文仅此一处)

这是唯一真正有效的绕过变量。它出现在 Block 2 的门卫条件中:

1
if test -z "$CALIBRE_SKIP_OS_CHECKS$CALIBRE_DISABLE_RHEL7_ERR"

在整个脚本中,没有任何地方清空或覆盖此变量。设置后,两字符串拼接结果非空,test -z 判断为假,整个 Block 2 被跳过,exit 1 不执行,Calibre 正常继续启动。


📌 辅助变量

USE_CALIBRE_VCO

1
出现位置:calibre_vco 第 15、76、78 行
1
2
3
elif test -n "$USE_CALIBRE_VCO"
then
  VCO=$USE_CALIBRE_VCO

作用是跳过 OS 自动检测,直接将 VCO 设为指定值。适用场景:/etc/os-release 格式特殊导致 OS 识别失败时,可通过 setenv USE_CALIBRE_VCO aoj 强制指定。与 RHEL7 退出门卫逻辑无关。

PREF_VCO

1
出现位置:pkgs/icv.aoj/bin/calibre 第 923 行(只读引用,从不赋值)

用于构造包路径:this_pkg="icv$PREF_VCO"。由于本安装中 pkgs/icv 已是指向 pkgs/icv.aoj 的符号链接,PREF_VCO 留空时 this_pkg="icv" 可正常解析,无需设置


六、总结与建议

最小可用配置

CentOS 7.9 上运行 calibre -gui,只需一条命令:

setenv CALIBRE_DISABLE_RHEL7_ERR 1
calibre -gui

可选补充说明

若 OS 识别有异常(VCO 无法自动确定),可追加:

setenv USE_CALIBRE_VCO aoj

注意事项

  1. CALIBRE_DISABLE_RHEL7_ERR=1 仅绕过 shell 脚本层面exit 1。Calibre 二进制自身(cgi_app)内部可能还有更深层的校验,是否影响实际功能取决于具体许可证配置与构建版本。
  2. 2025.3 版本将完全停止 RHEL 7 支持,届时即便此变量也可能失效。如有长期使用需求,建议迁移至 RHEL 8 + aok 软件树。
  3. 三个无效变量(CALIBRE_RHEL7_ENABLECALIBRE_AOJ_ENABLEAOJ_ENABLE)在网络上广泛流传,本次通过全量文件搜索予以明确否定,避免误导。

附录:变量速查表

环境变量 脚本中是否存在 作用位置 实际效果
CALIBRE_RHEL7_ENABLE 无效,整个安装目录中不存在
CALIBRE_AOJ_ENABLE 无效,整个安装目录中不存在
AOJ_ENABLE 无效,整个安装目录中不存在
CALIBRE_DISABLE_RHEL7_WARNING calibre_env:101,124 Block 1 失败时被清空,无法阻止 exit 1
CALIBRE_SKIP_OS_CHECKS calibre_env:100 Block 1 失败时被清空,单独使用无效
CALIBRE_DISABLE_RHEL7_ERR calibre_env:105 唯一有效绕过变量,从不被清空 ✅
USE_CALIBRE_VCO calibre_vco:76,78 强制指定 VCO,与退出门卫无关
PREF_VCO ✅(仅引用) calibre:923 包路径后缀,留空即可