本项目为凌云实验室NXP i.MX系列 IGKBoard 开发板移植的 Yocto 源码,当前 `meta-igkboard` 支持以下 Yocto 版本: ```bash guowenxue@ubuntu22:~/meta-igkboard$ git branch -r origin/kirkstone Kirkstone(Yocto 4.0) 支持 Machine: `igkboard-6ull`; origin/mickledore Mickledore(Yocto 4.2) 支持 Machine: `igkboard-imx6ull` 和 `igkboard-imx8mp`; ``` 如果想要源码编译Yocto系统的话,则Linux主机服务器需满足如下条件: * 系统能够代理翻墙访问 github; * 推荐使用 8核以上CPU、16GB以上内存; * 硬盘空闲空间至少要求 200GB+; * 推荐使用 Ubuntu 20.04 系统及以上; 本文档将以 ***igkboard-imx6ull*** 上的 ***Yocto Mickledore(4.2)*** 为例,讲解其下载、编译过程。关于Yocto系统的详细使用,可以参考 [NXP官方Yocto文档](https://www.nxp.com.cn/docs/en/user-guide/UG10164.pdf)。 # 1. 开发环境安装 使用 `apt` 命令安装Yocto源码编译所依赖的Linux系统工具或命令。 ``` guowenxue@ubuntu22:~$ sudo apt update && sudo apt install -y \ coreutils jq wget curl tree gawk sed unzip cpio bc lzop zstd rsync kmod kpartx \ desktop-file-utils iputils-ping xterm diffstat chrpath asciidoc docbook-utils help2man \ build-essential gcc g++ make cmake automake groff socat flex texinfo bison texi2html \ git cvs subversion mercurial autoconf autoconf-archive parted dosfstools \ python3 python3-pip python3-pexpect python3-git python3-jinja2 \ lib32z1 libssl-dev libncurses-dev libgl1-mesa-dev libglu1-mesa-dev libsdl1.2-dev ``` 如果没有配置过则配置 `git` 的账号信息。 ``` guowenxue@ubuntu22:~$ git config --global user.name guowenxue guowenxue@ubuntu22:~$ git config --global user.email "guowenxue@gmail.com" ``` # 2. Yocto源码下载 ## 2.1 下载NXP官方Yocto NXP的Yocto源码托管在 [NXP官方github站点](https://github.com/nxp-imx/imx-manifest) 上,并且需要使用 google 的 `repo` 命令来下载,但这两个站点都需要翻墙才能下载。 ``` guowenxue@ubuntu22:~$ proxy guowenxue@ubuntu22:~$ curl google.com 301 Moved

301 Moved

The document has moved here. ``` > 注: `proxy` 是我们设置代理翻墙访问 google 和 github 的命令,并不是Linux系统命令. 使用 `curl` 命令下载 google 最新的 `repo` 命令. ``` guowenxue@ubuntu22:~$ curl https://storage.googleapis.com/git-repo-downloads/repo -o repo guowenxue@ubuntu22:~$ chmod a+x repo guowenxue@ubuntu22:~$ sudo mv repo /usr/bin/ ``` 创建 Yocto 编译工作目录. ``` guowenxue@ubuntu22:~$ mkdir -p ~/yocto-mickledore guowenxue@ubuntu22:~$ cd ~/yocto-mickledore ``` 使用 `repo` 命令下载 NXP 官方的 Yocto 源码, 具体可以参考 [Github上的官方ReadMe文档](https://github.com/nxp-imx/imx-manifest/tree/imx-linux-kirkstone). ``` guowenxue@ubuntu22:~/yocto-mickledore$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-mickledore -m imx-6.1.36-2.1.0.xml guowenxue@ubuntu22:~/yocto-mickledore$ repo sync ``` 下面是下载完成后的Yocto源码. ``` guowenxue@ubuntu22:~/yocto-mickledore$ ls imx-setup-release.sh README README-IMXBSP setup-environment sources ``` ## 2.2 下载 meta-igkboard `meta-igkboard` 是凌云实验室针对 IGKBoard 开发板移植的 Yocto Meta 源文件,接下来我们需要到 *sources* 文件夹里下载相应版本的 `meta-igkboard` 源码. ``` guowenxue@ubuntu22:~/yocto-mickledore$ cd sources/ guowenxue@ubuntu22:~/yocto-mickledore/sources$ git clone http://master.weike-iot.com:8088/r/meta-igkboard.git -b mickledore ``` 下面是 *sources* 目录下的源文件。 ``` guowenxue@ubuntu22:~/yocto-mickledore/sources$ ls base meta-freescale meta-imx meta-security meta-arm meta-freescale-3rdparty meta-nxp-demo-experience meta-timesys meta-browser meta-freescale-distro meta-openembedded meta-virtualization meta-clang meta-igkboard meta-qt6 poky ``` # 3 Yocto源码编译 ## 3.1 首次编译 在 `meta-igkboard` 源码里,提供了一键初始化 Yocto 编译环境的脚本 *meta-igkboard/tools/igkboard-setup.sh*。该脚本的使用方法如下: ``` guowenxue@ubuntu22:~/yocto-mickledore/sources$ cd ~/yocto-mickledore/ guowenxue@ubuntu22:~/yocto-mickledore$ ./sources/meta-igkboard/tools/igkboard-setup.sh -h Usage: MACHINE= source igkboard-setup.sh Options: machine name - igkboard-imx8mp - igkboard-imx6ull * [-b build-dir]: Build directory, if unspecified script uses 'build' as output directory * [-h]: help Examples: $ MACHINE=igkboard-imx8mp source sources/meta-igkboard/tools/igkboard-setup.sh -b igkboard-imx8mp $ MACHINE=igkboard-imx6ull source sources/meta-igkboard/tools/igkboard-setup.sh -b igkboard-imx6ull ``` 首次编译Yocto源码,需要调用 `igkboard-setup.sh` 脚本来初始化 Yocto 的编译环境。 ``` guowenxue@ubuntu22:~/yocto-mickledore$ MACHINE=igkboard-imx6ull source sources/meta-igkboard/tools/igkboard-setup.sh -b igkboard-imx6ull ``` 此时它将会自动创建一个名为 `igkboard-6ull` 的文件夹,并进入到该工作目录下。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ ls conf guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ ls conf/ bblayers.conf conf-notes.txt local.conf templateconf.cfg ``` 下载的源码默认存放到Yocto工作路径 *downloads* 文件夹下。有时多个项目或多个开发人员会编译同一个版本 Yocto,此时可以通过修改 *conf/local.conf* 文件中的 `DL_DIR` 选项指定源码下载的统一存放路径,这样可以避免重复下载节省磁盘空间。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ sudo mkdir -p /srv/yocto/mickledore/ guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ sudo chmod a+w /srv/yocto/mickledore/ guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ vim conf/local.conf DL_DIR ?= "/srv/yocto/mickledore/" ``` Yocto编译过程中需要从 github下载大量的源码,所以我们必须使能代理访问 github。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ proxy ``` 接下来使用 `bitbake` 命令开始编译Yocto系统的源码。这个编译过程很长,如果编译的过程中出现错误,再重新开始编译即可。也可以使用 `-k` 选项先跳过编译出错的软件包。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ bitbake yocto-image-full ``` > 这个编译过程非常漫长,大概需要 4~5 个小时,具体依赖编译服务器的 CPU、内存、网络环境等。 *`bitbake`* 命令并不是Linux系统命令,而是由 Yocto 提供的编译命令。在第一次编译时,它由前面的 `source sources/meta-igkboard/tools/igkboard-setup.sh` 命令导入。如果需要再次打开新的终端重新编译,则需要使用下面 `source` 命令重新导入才能开始编译。 ``` guowenxue@ubuntu22:~$ cd ~/yocto-mickledore guowenxue@ubuntu22:~/yocto-mickledore$ source sources/poky/oe-init-build-env igkboard-imx6ull/ guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ proxy guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ bitbake yocto-image-full ``` ## 3.2 编译输出 前面我们通过修改 *conf/local.conf* 文件中的 `DL_DIR` 选项,指定了编译过程中下载的源码存放路径为 `/srv/yocto/mickledore`,否则默认就在当前路径的 *downloads* 文件夹下. 我们可以看看下载的源码包大小。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ du -sh /srv/yocto/mickledore/ 36G /srv/yocto/mickledore/ ``` 源码的编译工作目录为 *tmp/work*,所有的源码编译工作都在这里进行。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ ls tmp/work all-poky-linux cortexa7t2hf-neon-poky-linux-gnueabi x86_64-linux cortexa7t2hf-neon-mx6ul-poky-linux-gnueabi igkboard_imx6ull-poky-linux-gnueabi ``` Yocto在编译的过程中,每个软件包都将会生成相应的 `.deb` 安装文件,它们存放在 *tmp/deploy/deb/* 路径下。 ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ ls tmp/deploy/deb/ all cortexa7hf-neon cortexa7t2hf-neon cortexa7t2hf-neon-mx6ul igkboard_imx6ull ``` 编译最终生成的烧录到 eMMC或 TF卡上的系统镜像和BSP相关文件,则存放在 *tmp/deploy/images/igkboard-imx6ull/* 路径下: ``` guowenxue@ubuntu22:~/yocto-mickledore/igkboard-imx6ull$ ls tmp/deploy/images/igkboard-imx6ull/ u-boot-igkboard-imx6ull.imx --Uboot镜像文件的符号链接 yocto-image-full-igkboard-imx6ull.tar.zst --Yocto根文件系统压缩包的符号链接 yocto-image-full-igkboard-imx6ull.wic.zst --Yocto烧录系统镜像文件的符号链接 ```