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_CHECKS 和 CALIBRE_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 仅在此处触发。触发条件为:
partial_failed=yes(Block 1 密钥检查失败),并且CALIBRE_SKIP_OS_CHECKS为空(已被 Block 1 清空),并且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
注意事项
CALIBRE_DISABLE_RHEL7_ERR=1仅绕过 shell 脚本层面的exit 1。Calibre 二进制自身(cgi_app)内部可能还有更深层的校验,是否影响实际功能取决于具体许可证配置与构建版本。- 2025.3 版本将完全停止 RHEL 7 支持,届时即便此变量也可能失效。如有长期使用需求,建议迁移至 RHEL 8 +
aok软件树。 - 三个无效变量(
CALIBRE_RHEL7_ENABLE、CALIBRE_AOJ_ENABLE、AOJ_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 |
包路径后缀,留空即可 |