# rpmbuildWrapper **Repository Path**: malachite/rpmbuildWrapper ## Basic Information - **Project Name**: rpmbuildWrapper - **Description**: 一系列用于在x64平台,使用x64本机rpmbuild和目标为riscv64平台的交叉编译工具链,为riscv64目标平台进行交叉编译提供帮助的脚本。 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-02 - **Last Updated**: 2025-07-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rpmbuildWrapper #### 介绍 riscv64 架构仍然处于起步早期,缺少算力和可用的硬件平台。 在上述背景下,维护者开发了一系列用于在 x64 平台,使用 x64 本机 `rpmbuild` 构建系统和目标为 riscv64 平台的交叉编译工具链,为 riscv64 目标平台进行交叉编译提供帮助的脚本。 本工具仅在 OpenCloudOS Stream 23 测试过。 **目前仍然处于开发阶段,构建产物的部分行为依然与QEMU或riscv64物理机构建产物不同!** #### 安装教程 `git clone` 到本地然后放到 PATH 里面就可以用了。 #### 使用说明 本工具由三个组件组成。 `check`: 以一个 shell 脚本(通常位于 `rpmbuild/SOURCES`)或一个 spec 文件为目标,检测其是否适合用于交叉编译。 **检测标准:** 目标文件是否没有使用 shell 变量(如`$CC`、`$CXX`)或 rpm 宏(如`%{__objcopy}、%{__strip}`)表示工具链,而是硬编码了工具链(如`nm`、`g++`)。 产生一个标准的 `patch` 文件,表示为了将输入文件修改得符合交叉编译的要求,需要作出的更改。该文件默认情况下会被输出到标准输出,用户可以直接审阅并应用补丁,也可以输出重定向到文件后,对补丁进行修改再应用。 `rbwrap`: rpmbuild 的 wrapper。它的参数与本机编译时传入 rpmbuild 的参数是相同的。例如,如果你在 QEMU 运行的是 `rpmbuild -bb --no-check ~/rpmbuild/SPECS/foo.spec`,那么你使用这套脚本交叉编译时,就需要运行 `rbwrap -bb --no-check ~/rpmbuild/SPECS/foo.spec`。 `rbwrap` 在内部会使用 `--define` 指定一系列 rpm 宏,并设置一系列的环境变量(与前面 `check` 生成的补丁相呼应),尽量避免对 spec 文件的修改,**尽量保证软件包的同源异构**。 `chriscv`: 自动完成 chroot 到 riscv64 rootfs 的准备工作,`mount` 一系列的文件系统,并设置 `trap` 在退出时 `umount` 它们。 **建议不使用`chriscv`**,而是额外安装 `systemd-container` 软件包,使用 `systemd-nspawn -D /lib/riscv64-linux-gnu/sys-root`。 ##### 推荐的交叉编译工作流 首先,使用 `check` 脚本对 `rpmbuild/SOURCES` 下所有的 shell 文件和 `rpmbuild/SPECS` 下的 spec 文件生成补丁。用户需审阅这些自动生成的补丁,判断是否某些对源码的改动是不必要甚至错误的,将其重定向为`.patch`文件并修正,再应用到原文件上。 然后,使用 `systemd-nspawn` 或 `chriscv` 进入 `/lib/riscv64-linux-gnu/sys-root` 中,下载并安装所需的构建依赖。 接着,使用 `rbwrap` 替代 `rpmbuild`命令构建目标软件包。 上述过程是一个循环,毕竟交叉编译和打包测试等过程中总是会发生各种莫名其妙的问题。阅读错误日志,修改 spec 文件和各种涉及到的脚本、维护构建环境、尝试解决问题,不断重复 `rbwrap`,直到构建成功。