4. 开发环境搭建
i.MX9 系列(如 i.MX93、i.MX95)的 Linux BSP 开发,本质上是一套“宿主机编译、目标板运行”的交叉开发模式。宿主机负责运行 Yocto 构建系统、交叉编译内核与根文件系统,目标板只负责运行产物。因此,开发环境是否干净、工具链版本是否匹配、BSP 源码是否完整,直接决定了后续编译能否一次通过。本节围绕 Ubuntu 主机配置、交叉编译工具链、Yocto Project 与 NXP 官方 BSP 获取四条主线展开。
一、核心原理:为什么需要这样一套环境
交叉编译的核心矛盾在于:宿主机是 x86_64 架构,而 i.MX9 是 ARM64(Cortex-A55/A78 等)架构。编译器必须运行在 x86_64 上,却要生成 ARM64 指令,这就是“交叉”的含义。Yocto Project 则是一个元构建系统,它通过 BitBake 解析配方(recipe),自动下载源码、打补丁、配置、编译、打包,最终产出 U-Boot、Kernel、Rootfs 和完整镜像。NXP 官方 BSP 以 Yocto 层(meta-imx)的形式发布,叠加在社区 Yocto 之上,提供 i.MX9 专属的机器配置、驱动补丁和固件。
二、Ubuntu 主机配置
NXP 官方推荐 Ubuntu 20.04/22.04 LTS 64 位版本,磁盘建议预留 300GB 以上(Yocto 的 sstate-cache 和 tmp 目录非常占空间),内存建议 16GB 以上,CPU 核心越多编译越快。首先安装基础依赖包:
sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential \
chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
pylint xterm zstd liblz4-tool file locales libacl1
sudo locale-gen en_US.UTF-8
此外需要把默认 shell 从 dash 切换为 bash(Yocto 的 BitBake 依赖 bash 语法),并配置 git 用户信息:
sudo dpkg-reconfigure dash # 选择 No
git config --global user.name "your_name"
git config --global user.email "your_mail@example.com"
三、交叉编译工具链安装
交叉编译工具链有两种获取方式。第一种是使用 NXP 官方预编译的 SDK,适合应用开发和快速验证;第二种是由 Yocto 在构建过程中自动生成,适合 BSP 深度定制。预编译 SDK 的安装方式如下:
chmod +x fsl-imx-xwayland-glibc-x86_64-meta-toolchain-armv8a-imx93evk-toolchain.sh
./fsl-imx-xwayland-glibc-x86_64-meta-toolchain-armv8a-imx93evk-toolchain.sh
# 安装后 source 环境变量
source /opt/fsl-imx-xwayland/6.6-scarthgap/environment-setup-armv8a-poky-linux
执行 source 后,环境变量 CC、CXX、LD、ARCH、CROSS_COMPILE 会被自动设置。可以用下面的命令验证工具链是否可用:
echo $CC
aarch64-poky-linux-gcc -v
如果输出中显示 target 为 aarch64-poky-linux,说明工具链安装成功。注意:source 只对当前终端会话有效,新开终端需要重新执行。
四、Yocto Project 与 NXP 官方 BSP 获取
NXP 官方 BSP 通过 repo 工具管理多个 git 仓库。以 i.MX9 的 scarthgap 版本为例,获取流程如下:
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
mkdir ~/imx-yocto-bsp && cd ~/imx-yocto-bsp
repo init -u https://github.com/nxp-imx/imx-manifest \
-b imx-linux-scarthgap -m imx-6.6.36-2.1.0.xml
repo sync -j8
同步完成后,使用 imx-setup-release.sh 初始化构建目录,选择图形后端(如 wayland 或 framebuffer)和机器类型(如 imx93evk):
DISTRO=fsl-imx-xwayland MACHINE=imx93evk \
source imx-setup-release.sh -b build-imx93
随后即可用 BitBake 构建完整镜像:
bitbake imx-image-full
下表汇总了本节涉及的关键组件及其作用,便于对照检查:
| 组件 | 作用 | 典型路径/命令 |
|---|---|---|
| Ubuntu 22.04 LTS | 宿主机操作系统 | — |
| 依赖包 | 提供 BitBake 所需工具 | apt install ... |
| 交叉工具链 SDK | 生成 ARM64 可执行文件 | environment-setup-armv8a-poky-linux |
| repo 工具 | 多仓库同步管理 | repo init / repo sync |
| meta-imx 层 | NXP i.MX9 专属配方 | sources/meta-imx |
| BitBake | Yocto 构建引擎 | bitbake imx-image-full |
五、案例与排障复盘
一个典型场景:开发者首次执行 repo sync 时因网络中断失败,再次执行后部分仓库处于 detached HEAD 状态。此时不要直接删除目录重来,可先执行 repo sync -j8 --force-sync 强制同步,再检查 repo status。另一个高频问题是 BitBake 报 “No space left on device”,这通常是 tmp 目录占满,可通过在 local.conf 中设置 SSTATE_DIR 到独立大容量磁盘缓解。
BB_NUMBER_THREADS 和 PARALLEL_MAKE,通常设为 CPU 核心数的 1~1.5 倍,可显著缩短构建时间。最后需要强调:环境搭建不是一次性动作,而是一个可复现的流程。建议把 repo init 的 manifest 版本、DISTRO、MACHINE、SDK 版本记录在项目 README 中,团队其他成员按同一份记录搭建,才能保证编译产物一致、问题可复现。