前面的准备工作都做好了,下面就是要构建。
依赖:25 项里缺 1 项
清单不是网上抄的,是 poky 自带的 documentation/poky.yaml.in 里的 UBUNTU_HOST_PACKAGES_ESSENTIAL。逐个 dpkg 核对:
【03_01_依赖实测】
24 项已装,缺 python3-subunit。它只给 ptest 用,最小镜像用不到,所以不卡构建。
经验是:照清单装齐最稳,但缺个把可选包,先构建再补更省时间。
gcc 的版本陷阱
dpkg -l gcc 报 4:13.2.0,看着是 gcc 13。但 gcc --version 输出的是 11.5.0。
因为 /usr/bin/gcc 指向 /etc/alternatives/gcc,alternatives 选了 gcc-11,而机器上 11、12、13 三个版本都在。
【03_02_gcc陷阱】
Yocto 只要求 gcc ≥ 8.0,所以不报错。但这意味着同一条 BSP,不同机器的宿主编译器可能完全不同。以后说"我这边能编过",最好带上版本号。
locale 也有差异:官方建议 en_US.UTF-8,我这台是 zh_CN.UTF-8。能过,但涉及排序和字符转换的配方可能有差异。
拉四层,初始化
照 README 锁的版本,四个仓库、四个目录:
git clone -b scarthgap-5.0.3 --depth 1 \ https://git.yoctoproject.org/poky git clone -b scarthgap git.openembedded.org/meta-openembedded git -C meta-openembedded checkout 735ae03 git clone -b linux4microchip+sama7d65-2025.02 \ github.com/linux4sam/meta-atmel git clone -b yocto-5.0 git.yoctoproject.org/meta-arm
(地址里的协议头一样,都是 https,这里省掉避免刷屏。)
克隆很快:13 秒、11 秒、3 秒。耗时在后面的 do_fetch,几十个 mirror 分散拉,DL_DIR 最后攒到 8.5 GB。
仓库名有个坑:linux4sam/meta-atmel,不是 linux4microchip/meta-atmel。照芯片名去猜,第一把就撞 Repository not found。
初始化用 meta-atmel 自带模板:
export TEMPLATECONF=$Y/meta-atmel/conf/templates/default source oe-init-build-env $Y/build-microchip
往 conf/local.conf 追加四行:DL_DIR、SSTATE_DIR 指到项目缓存目录,BB_NUMBER_THREADS 和 PARALLEL_MAKE 都给 20(20 核)。
构建就一行:
MACHINE=sama7d65-curiosity-sd bitbake core-image-minimal
结果
Attempted 4377 tasks of which 2803 didn't need to be rerun and all succeeded. Summary: There were 14 WARNING messages.
1858 秒,退出码 0,14 个警告,0 错误。警告都是配方层面的小提示,不影响产物。
【03_03_构建产物】
从 BOOT.BIN 到根文件系统,一条完整启动链。
口径要说清楚:这不是完全冷启动,DL_DIR 里已有 8.5 GB。但下篇会讲到,pseudo 升级让 sstate 大面积失效,实际编译量接近全量。
迭代成本
一次构建 31 分钟,但后面靠增量:
外部内核模块 16 秒出 .ko,ELF 32-bit ARM EABI5,vermagic 与内核完全匹配
设备树 dtc 重编 不到 1 秒
这两个数字决定试错节奏。任一变成几分钟,整个调试方式都得改。
我要赚赏金
