Page 48 - 《软件学报》2026年第6期
P. 48
屈晟 等: 面向 RISC-V 指令集多样性的兼容性感知多层级构建方法 2367
附录 A
A.1 封装 install 和 ln
以文件安装工具 install 为例, 构建系统调用如下命令安装软件文件.
install -D -m 755 libexample.so.1.0.0 $DESTDIR/usr/lib64/libexample.so.1.0.0
RuyiBuild 包装脚本首先调用上述原始命令, 以传统方式安装 ELF 文件. 随后, 自动检测到该操作, 额外调用
一次镜像命令, 在 LLVM IR 对应的存储目录中安装对应的 LLVM IR 文件.
install -D -m 755 $LLVMIR_BASEDIR/$(pwd)/libexample.so.1.0.0 \
$LLVMIR_BASEDIR/$DESTDIR/usr/lib64/libexample.so.1.0.0
同时, 该包装机制还会自动处理与动态库相关的辅助文件, 如前述章节中提到的记录动态库链接命令的_cmd
文件、符号版本脚本_verscript 文件等, 也一并进行镜像安装.
install -D -m 644 $LLVMIR_BASEDIR/$(pwd)/libexample.so.1.0.0_cmd \
$LLVMIR_BASEDIR/$DESTDIR/usr/lib64/libexample.so.1.0.0_cmd
install -D -m 644 $LLVMIR_BASEDIR/$(pwd)/libexample.so.1.0.0_verscript \
$LLVMIR_BASEDIR/$DESTDIR/usr/lib64/libexample.so.1.0.0_verscript
软链接工具 ln 的包装扩展机制与上述思路类似. 当构建系统调用软链接创建命令:
ln -sf libexample.so.1.0.0 $DESTDIR/usr/lib64/libexample.so.1
RuyiBuild 工具链包装脚本额外自动执行镜像软链接操作:
ln -sf libexample.so.1.0.0 $LLVMIR_BASEDIR/$DESTDIR/usr/lib64/libexample.so.1
A.2 扫描文件
扫描命令如下.
find $LLVMIR_BASEDIR/BUILDROOT -type f \
\( -name "*.so*" -o -name "*.a" -o -name "*_cmd" -o -name "*_verscript" \)
A.3 生成 RPM 包
自动生成的 RPM SPEC 文件片段如下.
%files llvmir
/usr/lib64/llvmir/libexample.so.1.0.0
/usr/lib64/llvmir/libexample.so.1
/usr/lib64/llvmir/libexample.so.1.0.0_cmd
/usr/lib64/llvmir/libexample.so.1.0.0_verscript
%post llvmir
# 在安装完成后, 触发后台服务执行转换任务
/usr/bin/RuyiBuild-trigger-conversion /usr/lib64/llvmir/libexample.so.1.0.0
A.4 批量转换
针对不同的指令集扩展组合或微架构选项, RuyiBuild 自动执行类似如下的批量转换命令.
# 批量转换示例 (针对不同指令集和微架构)
for rpm_dir in /cloud/llvmir_rpm_extract/*; do

