Docker 编译环境

Ubuntu 20.04 原生编译是本手册的基础流程。Docker 适合需要隔离依赖、在其他 Linux 发行版上复现 Ubuntu 20.04 环境,或同时维护多套编译环境的场景。

Docker 只承载编译工具。U-Boot、Linux、Buildroot 和应用源码仍保存在主机的 ~/v3s-workspace 中,容器删除后源码和编译产物不会丢失。

准备文件

从资料包取得:

02-开发环境/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
07-Docker/strongpi-v3s-docker.tar.gz

将这两个归档复制到 ~/v3s-workspace,再解压并放置工具链:

cd ~/v3s-workspace
tar -xzf strongpi-v3s-docker.tar.gz
cp gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz \
    strongpi-v3s-docker/toolchains/

工作目录应保持以下关系:

~/v3s-workspace/
├── uboot/
├── kernel/
├── buildroot-2023.02.3/
├── projects/
├── strongpi-v3s-support/
└── strongpi-v3s-docker/

安装 Docker

Ubuntu 可安装发行版提供的 Docker:

sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker

默认使用 sudo docker。需要以普通用户运行时,可将当前用户加入 docker 组,重新登录后生效:

sudo usermod -aG docker "$USER"

docker 组具有管理主机容器的权限,只应加入可信用户。

构建镜像

cd ~/v3s-workspace/strongpi-v3s-docker
sudo bash scripts/build-image.sh

生成的本地镜像名称为:

v3s-build:ubuntu20.04

进入编译环境

cd ~/v3s-workspace/strongpi-v3s-docker
sudo bash scripts/run-container.sh

脚本使用发起 sudo 的宿主用户 UID/GID 运行编译命令,写回源码目录的产物仍归该用户所有。

主机目录映射到容器 /workspace

主机目录 容器目录
~/v3s-workspace/uboot /workspace/uboot
~/v3s-workspace/kernel /workspace/kernel
~/v3s-workspace/buildroot-2023.02.3 /workspace/buildroot-2023.02.3
~/v3s-workspace/projects /workspace/projects
~/v3s-workspace/strongpi-v3s-support /workspace/strongpi-v3s-support

容器内的编译命令与 Ubuntu 20.04 原生章节相同,只需把 ~/v3s-workspace 替换为 /workspace。例如:

cd /workspace/kernel
make strongpi_nand_defconfig
make -j"$(nproc)" zImage dtbs

Buildroot 使用外部板级支持目录:

cd /workspace/buildroot-2023.02.3
make BR2_EXTERNAL=/workspace/strongpi-v3s-support \
     BR2_DEFCONFIG=/workspace/strongpi-v3s-support/configs/strongpi_v3s_defconfig \
     defconfig
make

执行单条命令

脚本也可以直接运行非交互命令:

sudo bash scripts/run-container.sh bash -lc \
    'cd /workspace/uboot && make -j"$(nproc)"'

TF 卡分区、loop 挂载、dd 写盘和 NAND 烧录涉及主机设备,仍应在主机执行,不应在普通编译容器中操作。