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 专属的机器配置、驱动补丁和固件。

关键认知:Yocto 不是“一个编译器”,而是一套构建框架;交叉编译工具链既可以由 Yocto 自动生成,也可以使用 NXP 预编译的 SDK。两者用途不同,不能混用。

二、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"
常见误区:在 WSL 或虚拟机中把源码放在 /mnt/c 等 Windows 挂载盘上编译。这类文件系统不支持 Linux 的符号链接和权限位,Yocto 会在 do_patch 或 do_configure 阶段随机报错。请务必放在 ext4 原生分区,例如 ~/imx-yocto-bsp。

三、交叉编译工具链安装

交叉编译工具链有两种获取方式。第一种是使用 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
BitBakeYocto 构建引擎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 到独立大容量磁盘缓解。

建议在首次构建前,先在 local.conf 中设置 BB_NUMBER_THREADS 和 PARALLEL_MAKE,通常设为 CPU 核心数的 1~1.5 倍,可显著缩短构建时间。

最后需要强调:环境搭建不是一次性动作,而是一个可复现的流程。建议把 repo init 的 manifest 版本、DISTRO、MACHINE、SDK 版本记录在项目 README 中,团队其他成员按同一份记录搭建,才能保证编译产物一致、问题可复现。

i.MX9 Linux BSP 开发环境搭建流程 ① Ubuntu 宿主机配置 Ubuntu 22.04 LTS x86_64 / 300GB+ 依赖包安装 gawk / git / python3 shell 切换 bash dpkg-reconfigure dash ext4 原生分区 避免 /mnt/c 挂载盘 ② 交叉编译工具链 NXP 预编译 SDK fsl-imx-xwayland-*.sh Yocto 自动生成工具链 bitbake meta-toolchain source 环境变量 CC / CXX / CROSS_COMPILE ③ Yocto + NXP BSP 获取 repo init imx-manifest repo sync -j8 多仓库同步 imx-setup-release.sh DISTRO / MACHINE bitbake imx-image-full 构建产物:U-Boot + Kernel + Rootfs + imx-image-full-*.wic 烧录至 i.MX9 EVK 目标板运行