本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Bash 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。
🚀 构建入口与环境
-
📝 执行命令 :
OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh -
🔧 入口脚本 :
create-hnp.sh- 检查必需的环境变量
OHOS_ARCH和OHOS_ABI

- 导出
LC_CTYPE、TOOL_HOME、OHOS_SDK_HOME

- 执行
make -C build-hnp

- 检查必需的环境变量
-
📦 顶层构建 :
build-hnp/MakefilePKGS变量定义需要构建的包列表(如bash、gettext等)

- 通过
check-pkgs机制自动检测PKGS变化并触发重新构建

- 自动合并
external-hnp目录下的外部 HNP 包

- 总目标
all: copy,打包base.hnp并拷贝到entry/hnp/$(OHOS_ABI)

⚙️ Bash 包的构建配置
- 📁 包目录 :
build-hnp/bash/Makefile- 继承通用规则:
include ../utils/Makefrag - 源地址:
SOURCE_URL = $(GNU_MIRROR)/gnu/bash/bash-5.3.tar.gz - 配置参数:
--prefix=$(PREFIX)安装前缀(默认PREFIX=/data/app/base.org/base_1.0,见Makefrag:33)--host aarch64-unknown-linux-musl交叉编译目标--without-bash-malloc、--disable-nls精简配置
- 构建流程由通用宏
define_autotools_package驱动:下载→解包→configure→make→make install→拷贝与 strip
- 继承通用规则:
- 🔧 通用工具链与路径 :
build-hnp/utils/MakefragCC/CXX/LD/AR/RANLIB/...均指向 OHOS SDK 的 LLVM 工具链($(OHOS_SDK_HOME)/native/llvm/bin)- 通过
PKG_CONFIG_LIBDIR指向sysroot下.pc目录,确保依赖发现 - 安装到临时目录
build$(PREFIX)后,整体复制至../sysroot并进行 ELF strip - 下载支持多镜像回退:
wget→curl,主镜像失败时自动尝试备用镜像
📋 关键日志与过程节点
-
📥 下载与镜像修正:
- 初始默认镜像
ftpmirror.gnu.org被重定向到 TUNA,返回403 Forbidden导致下载错误 - 修正方式:将默认镜像改为
https://ftp.gnu.org(build-hnp/utils/Makefrag)

- 清理损坏的归档文件:删除
build-hnp/bash/download/bash-5.3.tar.gz后重新执行构建 - 下载规则支持多镜像回退:
wget→curl,自动尝试备用镜像
- 初始默认镜像
-
⚙️ 配置与编译:
- 成功探测到多数标准库与系统调用(如
clock_gettime、regcomp、getpwuid等) - 生成并归档
libhistory.a与libsh.a,随后进入主程序与内置模块构建
- 成功探测到多数标准库与系统调用(如
-
📦 安装与打包:
- 安装路径下的 Loadable 模块被复制到
sysroot/lib/bash/(日志显示多个loadables模块,如recho、printf、basename等) - 执行 ELF strip 减小体积
- 合并外部 HNP 包(如果存在)
- 最终执行
zip -r base.hnp sysroot并拷贝到entry/hnp/arm64-v8a/
- 安装路径下的 Loadable 模块被复制到
✅ 产物验证
-
📦 检查打包文件:
bashls build-hnp/base.hnp # 应存在 ls entry/hnp/arm64-v8a/*.hnp # 应包含 base.hnp 与 base-public.hnp -
🔍 检查模块:
bashls -la build-hnp/sysroot/lib/bash/ # 包含 Bash 的可加载模块(loadables) ls -la build-hnp/sysroot/bin/bash # Bash 可执行文件- Bash 可执行文件按前缀安装复制到
sysroot,路径受PREFIX影响(默认在sysroot/data/app/base.org/base_1.0/bin/bash)
- Bash 可执行文件按前缀安装复制到
🐛 常见问题与解决方案
- ❌ 下载失败(HTTP 403) :
- 现象:默认镜像被重定向后被拒绝
- 解决 :固定镜像为
ftp.gnu.org并清理损坏的归档后重试 - 自动回退 :构建系统已实现
wget→curl的多镜像回退机制
- ⚠️
configure找不到 :- 现象 :归档损坏或未正确解压导致
../configure缺失 - 解决 :删除坏归档重新下载;确保
tar正常解包(仓库使用的 bsdtar 可按扩展自动识别压缩格式)
- 现象 :归档损坏或未正确解压导致
- 🔗 依赖发现 :
- 通过
PKG_CONFIG_LIBDIR指向sysroot的.pc路径,保障构建期依赖发现 - 如需增强交互功能可先行编译
ncurses/readline并配置 Bash 使用系统 readline
- 通过
🔄 重建与扩展
-
🔧 重建单包:
bashmake -C build-hnp rebuild-bash # 触发子包重新编译并刷新 .stamp -
🧹 清理:
bashmake -C build-hnp clean # 清理 sysroot、所有 .stamp 和 PKGS_MARKER -
📦 扩展 :若需将 Bash 与其依赖列入全量构建,可在
PKGS中加入ncurses、readline等,并按依赖顺序组织(详见docs/PKGS依赖与构建顺序解析.md) -
🔄 自动重建机制:
- 修改
PKGS后,check-pkgs会自动检测变化并触发重新构建 - 新增外部 HNP 包到
external-hnp目录后,会自动合并到base.hnp
- 修改
📝 结论与建议
- ✅ 本次已在 aarch64 环境下完成 Bash 的交叉编译与打包,并生成 HNP 产物副本于
entry/hnp/arm64-v8a/。 - 💡 为保证构建稳定 :
- 固定可靠的上游镜像,避免下载阶段随机失败(已实现自动回退机制)
- 对大型包启用构建缓存(可在
Makefrag中开启USE_CCACHE) - 优先在早期阶段编译 TUI/基础库(
ncurses/readline),提升 Bash 交互体验 - 利用
check-pkgs机制自动检测包列表变化,无需手动清理
📚 以上为 Bash 构建的深度解读与实践记录。