|  |  | 
 |  |  | ## meta-igkboard | 
 |  |  | 本项目为凌云实验室针对IGKBoard开发板移植的 Yocto 源码,关于Yocto系统的详细使用,大家可以参考 [NXP官方的用户手册文档](https://www.nxp.com/docs/en/user-guide/IMX_YOCTO_PROJECT_USERS_GUIDE.pdf)。如果想要源码编译Yocto系统的话,则Linux主机服务器需满足如下条件: | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | * 系统能够代理翻墙访问 github; | 
 |  |  | * 推荐使用 8核以上CPU、16GB以上内存; | 
 |  |  | * 硬盘空闲空间至少要求 200GB+; | 
 |  |  | * 推荐使用 Ubuntu 20.04 系统及以上; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 本文档将以 ***IGKBoard-6ULL*** 上的 ***Yocto Kirkstone(4.0)***  为例,讲解Yocot 源码下载及编译过程。 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | # 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 Yocto源码下载 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | NXP的Yocto源码托管在  [NXP官方github站点](https://github.com/nxp-imx/imx-manifest) 上,并且需要使用 google 的 ***repo*** 命令来下载,但这两个站点都需要翻墙才能下载,所以推荐大家从凌云实验室文件服务器上下载。 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | ### 2.1.1  NXP官方下载 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 国内如果想要稳定访问 github 并能从 google官方站点下载 repo 命令,则需要翻墙. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~$ proxy | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  | 注: ***`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/ | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 创建IGKBoard-6ULL 的 Yocto 工作目录. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~$ mkdir -p ~/igkboard-imx6ull/yocto/kirkstone | 
 |  |  | guowenxue@ubuntu22:~$ cd ~/igkboard-imx6ull/yocto/kirkstone | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 使用 ***`repo`*** 命令下载 NXP 官方的 Yocto 源码, 具体可以参考 [Github上的官方ReadMe文档](https://github.com/nxp-imx/imx-manifest/tree/imx-linux-kirkstone). | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-kirkstone -m imx-5.15.71-2.2.0.xml | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone$ repo sync | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 下面是下载完成后的Yocto源码. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone$ ls | 
 |  |  | imx-setup-release.sh  README  README-IMXBSP  setup-environment  sources | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | ### 2.1.2 凌云实验室下载 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 首先创建 IGKBoard-6ULL 的 Yocto 工作目录. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~$ mkdir -p ~/igkboard-imx6ull/yocto/ | 
 |  |  | guowenxue@ubuntu22:~$ cd ~/igkboard-imx6ull/yocto/ | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 由于NXP官方的Yocto源码需要翻墙才能下载,凌云实验室已将移植好的相应版本 Yocto 源码下载并打包放到了文件服务器上,这样我们可以直接从凌云实验室的文件服务器上下载. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto$ wget http://main.iot-yun.club:2211/imx/bsp/yocto/kirkstone-lf-5.15.71-2.2.0.tar.xz | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto$ tar -xJf kirkstone-lf-5.15.71-2.2.0.tar.xz | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto$ mv imx-yocto-bsp/ kirkstone | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 下面是下载解压缩后的Yocto源码. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto$ cd kirkstone && 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:~/igkboard-imx6ull/yocto/kirkstone$ cd sources/ | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/sources$ git clone http://main.iot-yun.club:8088/r/meta-igkboard.git -b kirkstone | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 下面是 ***sources*** 目录下的源文件。 | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/sources$ ls | 
 |  |  | base  meta-clang  meta-freescale-3rdparty  meta-igkboard  meta-nxp-demo-experience | 
 |  |  | meta-qt6  meta-virtualization  meta-browser  meta-freescale  meta-freescale-distro | 
 |  |  | meta-imx  meta-openembedded  meta-timesys  poky | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | # 3 Yocto源码编译 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | ## 3.1 首次编译 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 在 **meta-igkboard** 源码里,提供了一键初始化 Yocto 编译环境的脚本 ***meta-igkboard/tools/igkboard-setup.sh***。该脚本的使用方法如下: | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~$ cd ~/igkboard-imx6ull/yocto/kirkstone | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone$ ./sources/meta-igkboard/tools/igkboard-setup.sh -h | 
 |  |  | Usage: | 
 |  |  |  MACHINE=<machine> source igkboard-setup.sh <build-dir> | 
 |  |  | Options: | 
 |  |  |   <machine>    machine name | 
 |  |  |                - igkboard-6ull | 
 |  |  |   * [-b build-dir]: Build directory, if unspecified script uses 'build' as output directory | 
 |  |  |   * [-h]: help | 
 |  |  | Examples: | 
 |  |  | $ MACHINE=igkboard-6ull source sources/meta-igkboard/tools/igkboard-setup.sh -b igkboard-6ull | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 如果是首次编译此Yocto源码,则需要调用 ***igkboard-setup.sh*** 脚本来初始化 Yocto 的编译环境。 | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone$ MACHINE=igkboard-6ull source sources/meta-igkboard/tools/igkboard-setup.sh -b igkboard-6ull | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 此时它将会自动创建一个名为 igkboard-6ull 的文件夹,并进入到该工作目录下. 同时会将 ***meta-igkboard/conf/*** 目录下的一些配置文件也拷贝到这里来。 | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ ls | 
 |  |  | conf | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ ls conf/ | 
 |  |  | bblayers.conf  local.conf  templateconf.cfg | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | Yocto编译过程中需要从 github下载大量的源码,所以我们必须使能代理访问 github. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ proxy | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 下载的源码默认存放到 ***downloads*** 文件夹中. 有时多个项目或多个开发人员会编译同一个版本Yocto,此时可以通过修改 ***conf/local.conf*** 文件中的 **DL_DIR** 选项指定源码下载的统一存放路径,这样可以避免重复下载节省磁盘空间. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ vim conf/local.conf | 
 |  |  | DL_DIR ?= "/srv/yocto_packets/" | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 接下来使用 ***`bitbake`*** 命令开始编译Yocto系统的源码。这个编译过程很长,如果编译的过程中出现错误,再重新开始编译即可。也可以使用 ***-k*** 选项先跳过编译出错的软件包。 | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ bitbake yocto-image-full | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | ## 3.2 再次编译 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 需要注意的时, ***`bitbake`*** 命令并不是Linux系统命令,而是由前面的  ***`source`*** 命令导入。所以每次打开新的终端开始编译之前,必须重新 source 导入。在第一次编译时,我们必须使用 ***igkboard-setup.sh*** 脚本来完成这个工作,此后再次编译Yocto源码,则可以使用下面命令完成。 | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~$ cd ~/igkboard-imx6ull/yocto/kirkstone | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone$ source sources/poky/oe-init-build-env igkboard-6ull/ | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ bitbake yocto-image-full | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | ## 3.3 编译输出 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 前面我们通过修改 ***conf/local.conf*** 文件中的 **DL_DIR** 选项,指定了编译过程中下载的源码存放路径为 ***/srv/yocto_packets/***,否则默认就在当前路径的 ***downloads*** 文件夹下. 我们可以看看下载的源码包大小. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ du -sh /srv/yocto_packets/ | 
 |  |  | 34G     /srv/yocto_packets/ | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 源码的编译工作目录为 ***igkboard-6ull/tmp/work***,所有的源码编译工作都在这里进行。 | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ ls tmp/work | 
 |  |  | all-poky-linux  cortexa7hf-neon-poky-linux-gnueabi  cortexa7t2hf-neon-mx6ul-poky-linux-gnueabi  cortexa7t2hf-neon-poky-linux-gnueabi  igkboard_6ull-poky-linux-gnueabi  x86_64-linux | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | Yocto在编译的过程中,每个软件包都将会生成相应的 **.deb** 安装文件,它们存放在 ***igkboard-6ull/tmp/deploy/deb/*** 路径下. | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ ls tmp/deploy/deb/ | 
 |  |  | all  cortexa7hf-neon  cortexa7t2hf-neon  cortexa7t2hf-neon-mx6ul  igkboard_6ull | 
 |  |  | ``` | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 编译最终生成的烧录到 eMMC或 TF卡上的系统镜像和BSP相关文件,则存放在 ***igkboard-6ull/tmp/deploy/images/igkboard-6ull/*** 路径下: | 
 |  |  |  | 
 |  |  | ``` | 
 |  |  | guowenxue@ubuntu22:~/igkboard-imx6ull/yocto/kirkstone/igkboard-6ull$ ls tmp/deploy/images/igkboard-6ull/ | 
 |  |  | u-boot-igkboard-6ull.imx                --Uboot镜像文件的符号链接 | 
 |  |  | yocto-image-full-igkboard-6ull.tar.zst  --Yocto根文件系统压缩包的符号链接 | 
 |  |  | yocto-image-full-igkboard-6ull.wic.zst  --Yocto烧录系统镜像文件的符号链接 | 
 |  |  | ``` | 
 |  |  |  |