2. HDF开发环境搭建:从源码获取到工具链就绪
说实话,很多初学者在HDF驱动开发上栽跟头,不是因为代码写不对,而是环境没搭好。我见过太多人花了一周时间折腾编译环境,最后发现是Python版本不对。这一章,我就把我在多个项目里踩过的坑、总结的经验,一次性讲清楚。
2.1 OpenHarmony源码获取
源码获取是第一步。我个人习惯用repo工具来管理,因为OpenHarmony的仓库实在太多了,手动git clone会疯掉。
2.1.1 环境准备
先确认你的Linux系统。我推荐Ubuntu 20.04或22.04 LTS,别用太新的版本,有些依赖包还没适配。
硬件要求:
- CPU:4核以上,推荐8核
- 内存:16GB起步,32GB更稳
- 磁盘:至少200GB空闲空间(源码+编译产物)
- 网络:能稳定访问gitee.com
2.1.2 安装repo工具
# 创建bin目录并加入PATH
mkdir -p ~/bin
export PATH=~/bin:$PATH
# 下载repo工具
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo
chmod a+x ~/bin/repo
# 验证安装
repo --version
这里有个坑——repo版本必须与OpenHarmony匹配。我曾经用了一个旧版repo去拉新版本代码,结果manifest解析失败,折腾了两天。建议直接用上面的链接。
2.1.3 获取源码
以OpenHarmony 4.0 Release为例:
# 创建工作目录
mkdir -p ~/openharmony
cd ~/openharmony
# 初始化repo
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-4.0-Release --no-repo-verify
# 同步源码(这一步很慢,建议用镜像)
repo sync -c -j8
加速技巧:如果网络不好,可以用华为云镜像:
repo init -u https://gitee.com/openharmony/manifest.git \
-b OpenHarmony-4.0-Release \
--no-repo-verify \
--repo-url=https://mirrors.huaweicloud.com/git-repo \
--no-clone-bundle
2.2 编译环境配置
源码拉下来了,接下来配编译环境。嗯,这里要仔细,很多坑都在这一步。
2.2.1 安装依赖包
不同版本的OpenHarmony依赖略有差异,但核心包基本一致:
sudo apt-get update
sudo apt-get install -y \
binutils binutils-dev \
build-essential \
ccache \
curl \
file \
flex \
g++-multilib \
gcc-multilib \
git \
gnupg \
gperf \
lib32ncurses5-dev \
lib32z1-dev \
libc6-dev-i386 \
libgl1-mesa-dev \
libxml2-utils \
lz4 \
m4 \
make \
ninja-build \
nodejs \
npm \
openssh-client \
patch \
pkg-config \
python3 \
python3-pip \
python3-setuptools \
rsync \
scons \
tzdata \
unzip \
vim \
wget \
xsltproc \
zip \
zlib1g-dev
注意:Python版本必须为3.8~3.11。我遇到过用Python 3.12编译时报语法错误的情况。检查方法:
python3 --version
2.2.2 配置Node.js和npm
编译过程中会用到Node.js做前端资源处理。建议安装Node.js 14.x LTS:
curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version
npm --version
2.2.3 安装hb编译工具
hb是OpenHarmony的编译命令行工具,我个人觉得比直接调gn/ninja方便多了。
# 安装hb
python3 -m pip install --user build/hb
# 设置环境变量
export PATH=~/.local/bin:$PATH
# 验证
hb --version
小技巧:把环境变量加到~/.bashrc里,避免每次开终端都要重新export:
echo 'export PATH=~/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
2.3 HDF驱动开发工具链安装
环境配好了,但要做HDF驱动开发,还得装几样关键工具。
2.3.1 交叉编译工具链
HDF驱动最终要跑在目标硬件上,所以交叉编译工具链是必须的。以Hi3861为例:
# 下载工具链
wget https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz
# 解压到指定目录
sudo tar -xzf gcc_riscv32-linux-7.3.0.tar.gz -C /opt/
# 配置环境变量
export PATH=/opt/gcc_riscv32/bin:$PATH
# 验证
riscv32-unknown-elf-gcc --version
不同芯片的交叉工具链不一样,我整理了一个对照表:
| 芯片平台 | 工具链前缀 | 下载来源 |
|---|---|---|
| Hi3861 (RISC-V) | riscv32-unknown-elf- | 华为云镜像 |
| Hi3516 (ARM) | arm-linux-gnueabi- | 华为云镜像 |
| RK3568 (ARM64) | aarch64-linux-gnu- | Linaro官方 |
| STM32MP1 (ARM) | arm-none-linux-gnueabihf- | ARM官方 |
2.3.2 HDF驱动框架源码结构
源码拉下来后,HDF框架在以下目录:
drivers/
├── framework/ # HDF框架核心
│ ├── core/ # 核心层
│ ├── model/ # 设备模型
│ ├── support/ # 支持库
│ └── tools/ # 工具
├── adapter/ # 适配层
├── peripheral/ # 外设驱动
└── interface/ # 驱动接口定义
我个人建议先熟悉drivers/framework/core目录,这是HDF的骨架。你想想看,驱动对象管理、消息机制、配置解析都在这里。
2.3.3 编译HDF驱动示例
环境都齐了,我们来编译一个最简单的HDF驱动验证一下:
# 进入源码根目录
cd ~/openharmony
# 选择产品(以hi3861为例)
hb set -p hi3861
# 编译
hb build -f
第一次编译会比较慢,因为要编译整个系统。之后可以用增量编译:
# 只编译驱动模块
hb build -T drivers
验证成功标志:编译完成后,在out/hi3861/目录下会生成OHOS_Image.bin和OHOS_Image.map。如果看到这两个文件,说明环境搭建成功了。
2.4 环境验证与常见问题
搭建过程中难免遇到问题。我把自己踩过的坑列出来,你遇到了可以直接对照:
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
| repo sync报错"fatal: unable to access" | 网络不通或DNS解析失败 | 切换镜像源或配置代理 |
| hb build报"python3 not found" | Python未安装或版本不对 | 检查python3 --version,安装3.8~3.11 |
| 编译时报"ccache: command not found" | ccache未安装 | sudo apt-get install ccache |
| 链接时报"undefined reference to HdfDeviceRegister" | HDF框架未正确链接 | 检查BUILD.gn中deps是否包含hdf_core |
重要提醒:如果你用的是Windows + WSL2,注意文件系统性能问题。把源码放在WSL2的Linux文件系统里(如~/openharmony),不要放在/mnt/c/下,否则编译速度会慢3~5倍。我当初不知道这个,白白浪费了两天时间。
2.5 本章知识体系
为了让你对整个环境搭建流程有个全局认识,我画了一张流程图:
这张图把整个流程分成了三层:源码获取、编译环境、工具链。每一层都有对应的操作步骤。我建议你按这个顺序来,不要跳步。曾经有个学员跳过了环境依赖安装,直接编译,结果报了一堆错,排查了三天才发现是缺了libxml2。
我的习惯:每完成一步,就在终端里做个标记。比如源码同步完,我就创建一个.step1_done文件。这样万一中间断了,回来也知道做到哪了。