2. 开发环境搭建

i.MX 9 系列(如 i.MX 93、i.MX 95)的嵌入式 Linux 产品开发,几乎全部围绕 Yocto Project 构建体系展开。NXP 在官方 Yocto 之上维护了自己的 BSP 层(meta-imx),把 U-Boot、Linux 内核、ATF、OP-TEE、图形与多媒体组件、以及各类机器配置整合成可复现的构建配方。因此,开发环境搭建的核心不是"装一个编译器",而是准备一台能稳定跑 Yocto 构建的 Ubuntu 主机,获取匹配的 BSP 源码,并让交叉工具链与目标板架构对齐。

一、Ubuntu 主机:版本、磁盘与依赖

Yocto 对宿主发行版有明确的支持矩阵。以当前 NXP BSP(如 LF6.6.x / LF6.12.x 系列)为例,官方推荐 Ubuntu 22.04 LTS(Jammy)或 Ubuntu 20.04 LTS。选择 LTS 版本的原因是构建周期长、依赖包版本稳定,避免因宿主 glibc、Python 版本漂移导致 bitbake 解析失败。若使用 Ubuntu 24.04,通常需要额外处理 Python 与部分工具版本差异,不建议作为首次搭建环境。

硬件资源方面,一个完整的 i.MX 9 镜像(含内核、根文件系统、图形栈)构建后,build 目录常达到 80~150 GB,加上 downloads 与 sstate-cache,建议预留 250 GB 以上 SSD 空间。内存建议 16 GB 起步,32 GB 更稳妥;CPU 核心数直接决定编译时间,8 核以上可显著缩短首次构建。构建过程对磁盘 I/O 敏感,机械硬盘会明显拖慢速度。

依赖包安装是搭建的第一步。Yocto 官方文档给出了 Ubuntu 的必需包清单,典型命令如下:

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 python3-subunit zstd liblz4-tool \
  file locales libacl1

# 将默认 shell 的 dash 切换为 bash(Yocto 要求)
sudo dpkg-reconfigure dash   # 选择 "No"

其中 dash 切换为 bash 是最容易被忽略却最常导致构建报错的一步。此外,若使用 NXP 的图形或 AI 相关配方,可能还需要 libssl-dev、libncurses-dev 等开发库。安装完成后可用 git --version、python3 --version 快速确认基础工具就绪。

二、获取 Yocto Project 与 NXP BSP

NXP 的 BSP 以 repo 清单方式管理多个 git 仓库。推荐使用 Google 的 repo 工具统一拉取,避免手动逐个 clone 造成版本错配。典型流程如下:

# 安装 repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

# 初始化 NXP BSP 清单(以 i.MX 9 的 LF6.6.36 分支为例)
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

这里 -b 指定 Yocto 发行版代号(如 scarthgap、kirkstone),-m 指定 NXP 的具体 BSP 版本清单。两者必须匹配,否则会出现层依赖冲突。同步完成后,目录中会包含 sources/(各 meta 层)、imx-setup-release.sh 等脚本。

接下来初始化构建环境。NXP 提供了 imx-setup-release.sh,它会自动配置 bblayers.conf 与 local.conf:

DISTRO=fsl-imx-xwayland MACHINE=imx93evk \
  source imx-setup-release.sh -b build-imx93

其中 MACHINE 必须与目标板一致:i.MX 93 EVK 用 imx93evk,i.MX 95 EVK 用 imx95evk。DISTRO 决定图形后端,fsl-imx-xwayland 适合带显示的方案,无显示场景可用 fsl-imx-wayland 或 fsl-imx-fb。这一步完成后,当前 shell 即进入 bitbake 可用状态。

Ubuntu 主机 Ubuntu 22.04 LTS • 磁盘 ≥ 250 GB SSD • 内存 ≥ 16 GB • CPU ≥ 8 核 • 依赖包 gawk/git/python3… • dash → bash Yocto + NXP BSP repo 清单管理 • imx-manifest 仓库 • 分支 scarthgap • 清单 imx-6.6.36-2.1.0.xml • meta-imx / meta-freescale • imx-setup-release.sh 交叉工具链 aarch64-poky-linux • gcc / g++ / ld • sysroot 头文件与库 • 由 bitbake 自动生成 • 或 SDK 安装包 • 目标架构 aarch64 bitbake 构建输出 imx-image-core / imx-image-full → U-Boot + Kernel + RootFS + ATF/OP-TEE MACHINE=imx93evk · DISTRO=fsl-imx-xwayland 验证:file 检查 ELF 架构 · 目标板启动确认 aarch64 ELF 64-bit LSB executable, ARM aarch64

三、交叉编译工具链的安装与验证

Yocto 构建过程中会自动生成与目标 rootfs 完全匹配的交叉工具链,位于 build-imx93/tmp/work/.../sysroots/ 下,但直接使用它需要手动设置大量环境变量。更实用的方式是生成并安装 SDK:

# 在已 source 环境的 shell 中生成 SDK 安装包
bitbake imx-image-core -c populate_sdk

# 产物位于 tmp/deploy/sdk/
# 例如:fsl-imx-xwayland-glibc-x86_64-imx-image-core-cortexa55-imx93evk-toolchain-6.6.36.sh

# 安装到默认路径 /opt
./fsl-imx-xwayland-glibc-x86_64-imx-image-core-cortexa55-imx93evk-toolchain-6.6.36.sh

安装完成后,通过 source 环境脚本激活工具链:

source /opt/fsl-imx-xwayland/6.6.36/environment-setup-cortexa55-poky-linux

此时 $CC、$CXX、$LD 等变量已指向 aarch64 交叉工具。验证分两步:先确认编译器本身可用,再确认它产出的二进制确实是目标架构。

# 1. 查看编译器版本与目标
aarch64-poky-linux-gcc --version
# 输出应包含 aarch64-poky-linux 与 GCC 版本号

# 2. 编译一个最小程序并检查架构
echo 'int main(){return 0;}' > hello.c
$CC hello.c -o hello
file hello
# 期望输出:ELF 64-bit LSB executable, ARM aarch64, ...

若 file 显示的是 x86-64,说明 $CC 未生效或误用了宿主 gcc,应重新 source 环境脚本。若显示 ARM aarch64,则工具链与目标板架构一致,可以进入下一步的镜像构建与烧录。

首次构建建议先执行 bitbake imx-image-core(精简镜像),确认环境无误后再构建 imx-image-full。前者耗时短、依赖少,适合快速验证工具链与 BSP 是否配置正确。
不要混用不同 BSP 版本的 SDK 与源码。例如用 LF6.1 的 SDK 去编译 LF6.6 的内核模块,可能因内核头文件与符号版本不一致而失败。SDK 版本、BSP 清单版本、MACHINE 三者必须来自同一次 repo sync。

完成以上步骤后,主机、BSP 源码与交叉工具链三者已经对齐。后续的 U-Boot 移植、内核裁剪、设备树修改与驱动开发,都将在这一环境基础上展开。判断环境是否真正就绪,最直接的依据是:bitbake 能成功产出镜像,且 file 检查交叉编译产物为 aarch64 架构。