3. 开发环境搭建

i.MX 93 的软件开发不是“装个编译器就能跑”的桌面式流程,而是一条由 Yocto Project 驱动的完整构建链:Yocto 负责按配方(recipe)拉取源码、交叉编译、打包成镜像;NXP 提供的 Linux BSP 层(meta-imx)把 i.MX 93 的 U-Boot、内核、设备树和驱动集成进来;交叉编译工具链负责在 x86_64 主机上生成 ARM64 目标代码;SDK 则把工具链、sysroot、库和头文件打包,供应用开发者脱离 Yocto 全量构建单独编译程序。理解这四者的分工与衔接,是后续所有章节能顺利推进的前提。

一、四层职责与依赖关系

先建立整体认识:Yocto 是构建框架,BSP 是板级内容,工具链是编译手段,SDK 是交付给应用开发的封装。它们不是并列的四件事,而是层层依赖的关系。下图给出本节的核心结构:

Yocto Project(构建框架) BitBake 解析配方 → 拉取源码 → 交叉编译 → 打包 rootfs / 镜像 poky + meta-openembedded + meta-freescale + meta-imx 提供配方与层 Linux BSP(meta-imx 板级支持) U-Boot(SPL + proper)→ Linux Kernel 6.1 → 设备树 imx93-evk.dts 驱动:Ethernet FEC、USDHC、I2C、SPI、SAI、MIPI-DSI、NPU Ethos-U65 编译产出 交叉编译工具链(aarch64-poky-linux) gcc 11.4 · binutils 2.40 · glibc 2.38 · gdb 13.2 主机 x86_64 → 目标 ARM64(Cortex-A55),含 sysroot 与头文件 封装为 SDK 安装包(.sh 自解压) fsl-imx-xwayland-glibc-x86_64-imx-image-full-aarch64-imx93evk-toolchain.sh 安装后 source environment-setup → 直接使用 $CC 编译应用

二、主机环境准备

Yocto 对主机有明确要求。推荐 Ubuntu 22.04 LTS,至少 8 核 CPU、16 GB 内存、250 GB 可用磁盘(全量构建 imx-image-full 会占用 100 GB 以上)。先安装依赖包:

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 python3-subunit mesa-common-dev zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8

注意:不要用 root 用户执行 Yocto 构建,BitBake 会直接拒绝。同时确保 /bin/sh 指向 bash 而非 dash,否则部分配方脚本会失败。

三、获取 BSP 与初始化构建目录

NXP 官方推荐使用 repo 工具管理多仓库。以 i.MX 93 EVK 的 Yocto 5.15.71_2.2.0(kirkstone)版本为例:

mkdir ~/imx-yocto-bsp && cd ~/imx-yocto-bsp
repo init -u https://github.com/nxp-imx/imx-manifest \
  -b imx-linux-kirkstone -m imx-5.15.71-2.2.0.xml
repo sync -j8

同步完成后,用 imx-setup-release.sh 生成构建目录。该脚本会创建 build/ 目录、写入 conf/local.conf 与 bblayers.conf,并自动把 meta-imx 各层加入:

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

关键参数含义:DISTRO 决定图形栈(xwayland 带 XWayland 兼容,wayland 纯 Wayland,framebuffer 无 GPU);MACHINE 决定目标板,i.MX 93 对应 imx93evk 或 imx93-11x11-evk。执行后终端会进入 BitBake 环境,提示符前出现 (build-imx93)。

四、构建镜像与 SDK

先构建完整镜像,确认 BSP 可用:

bitbake imx-image-full

首次构建约 2~4 小时(取决于主机性能)。产物位于 tmp/deploy/images/imx93evk/,包括 imx-image-full-imx93evk.wic.zst(可烧录 SD 卡)、imx-boot-imx93evk-sd.bin-flash_singleboot(U-Boot + SPL)、Image(内核)和 imx93-evk.dtb(设备树)。

镜像构建成功后,再生成 SDK:

bitbake imx-image-full -c populate_sdk

SDK 安装包输出到 tmp/deploy/sdk/,文件名形如 fsl-imx-xwayland-glibc-x86_64-imx-image-full-aarch64-imx93evk-toolchain-5.15.71.sh。安装到默认路径 /opt/fsl-imx-xwayland/5.15.71/:

cd tmp/deploy/sdk
./fsl-imx-xwayland-glibc-x86_64-imx-image-full-aarch64-imx93evk-toolchain-5.15.71.sh
# 安装完成后,每次使用前 source 环境
source /opt/fsl-imx-xwayland/5.15.71/environment-setup-aarch64-poky-linux

source 之后,$CC 自动指向 aarch64-poky-linux-gcc,$CXX、$AR、$LD、$PKG_CONFIG_SYSROOT_DIR 等变量均已就绪。可以用一个最小程序验证:

cat > hello.c <<'EOF'
#include <stdio.h>
int main(void){ printf("i.MX 93 ARM64 OK\n"); return 0; }
EOF
$CC hello.c -o hello
file hello
# 输出应含:ELF 64-bit LSB executable, ARM aarch64

把 hello 通过 scp 或 SD 卡拷到板端运行,若打印 i.MX 93 ARM64 OK,说明工具链与目标系统 ABI 一致,SDK 可用。

五、常见问题与判断依据

现象可能原因处理方式
bitbake 报 “Please use a locale setting which supports UTF-8”主机 locale 未生成执行 sudo locale-gen en_US.UTF-8 并导出 LANG=en_US.UTF-8
repo sync 中断或超时网络访问 GitHub 不稳定配置代理或改用 NXP 镜像源,重试 repo sync -j4
SDK 安装后 $CC 为空未 source environment-setup 脚本每次新开终端都要重新 source,或写入 ~/.bashrc
编译出的程序在板端报 “No such file or directory”动态链接器路径不匹配或 glibc 版本不一致确认 SDK 与板端 rootfs 来自同一次构建,检查 readelf -l hello | grep interpreter
bitbake 报 “No space left on device”磁盘不足清理 tmp/work 或扩容至 250 GB 以上
若只需开发应用而不修改 BSP,可直接下载 NXP 官方预编译 SDK,跳过 bitbake imx-image-full 全量构建,节省数小时。但若要修改内核驱动或设备树,则必须走完整 Yocto 流程。