最近在搞imx-yocto-L5.4.24_2.1.0的编译,也是第一次接触这个东西真的是遇到各种问题,也做个小结。
按照文档使用的是Ubuntu18.04,硬盘空间240G,内存空间3G。文档中建议的空间是120G,实际上在编译过程中会出现硬盘空间不足的情况。
编译时最好使用固态硬盘,机械硬盘的编译速度简直感人。
-
增加并行任务数量,加快下载速度
打开编译目录下的local.conf文件 (我使用的文件夹是imx-yocto-bsp )
vi imx-yocto-bsp/build-xwayland/conf/local.conf
添加下列两条指令 8代表8个任务并行
MACHINE ??= 'imx8qxpmek'
DISTRO ?= 'fsl-imx-xwayland'
PACKAGE_CLASSES ?= 'package_rpm'
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
STOPTASKS,/tmp,100M,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K \
ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-system-native = " sdl"
CONF_VERSION = "1"
DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = "1"
//以下两条指令
BB_NUMBER_THREADS = '8'
PARALLEL_MAKE = '-j 8'
# Switch to Debian packaging and include package-management in the image
PACKAGE_CLASSES = "package_deb"
EXTRA_IMAGE_FEATURES += "package-management"
建议只用于下载,并行编译很容易出现内存不足编译失败的问题。如果使用的是机械硬盘,并行编译的任务多了之后,很容易出现任务还在跑却没在编译(cpu没跑满)。
对于设置yocto只下载,针对于我使用的yocto,网上找的一些只下载指令试过都不太行,我最后用了这个指令
bitbake imx-image-full --runall=fetch
用是可以用,不过增加并行任务的语句就不生效了。
-
清除中间文件,节约硬盘空间
同样也是修改imx-yocto-bsp/build-xwayland/conf/local.conf文件
添加下面这行,可以在编译完成后删除中间文件(下载的文件都还在,删除了中间文件后,我的yocto大小从240G变成了110G)
INHERIT += "rm_wo
-
编译时出现Error: open CFI at the end of file; missing .cfi_endproc directive
基本上是内存不足造成的,有实际内存的可以加大虚拟机内存,如果没有可以增加Ubuntu的swap空间
参考这个https://blog.youkuaiyun.com/yc461515457/article/details/53610412
注意每次打开一个shell窗口时,需要重新激活swap文件。
-
各种do_compile do_configure 等类似的错误
简单点可以使用
bitbake -c cleansstate <软件包名>
这会清除所有编译生成的文件
如果不行尝试
bitbake -c clean <软件包名>
这会清除所有的配置文件,编译生成的文件
如果依然不行尝试
bitbake -c cleanall <软件包名>
这会清除所有相关文件,包括下载下来的文件
清除之后可以使用
bitbake <软件包名>
进行单独编译
-
do_fetch错误
说实话这个遇到的其实也很多,搞到后来是开代理下载的,不过速度也很感人,最多不会失败。而且do_fetch期间会出现很多次莫名的重新下载也不知道啥原因。
-
编译工具时找不到指定软件包
一般来说这种问题基本上是缺什么装什么就行了
使用
sudo apt-get install <对应软件包>
然后命令行运行测试一下即可。
不过我就比较悲催,我遇到的问题就是装上之后依然不行。
我遇到问题是这个样子的
Program sed found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools/sed)
Program awk found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools/awk)
Program m4 found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/work/aarch64-poky-linux/systemd/1_243.2-r0/recipe-sysroot-native/usr/bin/m4)
Program stat found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools/stat)
Program git found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools/git)
Program env found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools/env)
Program perl found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/work/aarch64-poky-linux/systemd/1_243.2-r0/recipe-sysroot-native/usr/bin/perl-native/perl)
Program test/test-efi-create-disk.sh found: YES (/home/cyk/imx-yocto-bsp/build-xwayland/tmp/work/aarch64-poky-linux/systemd/1_243.2-r0/git/test/test-efi-create-disk.sh)
Message: Using /usr/sbin/quotaon for quotaon
Message: Using /usr/sbin/quotacheck for quotacheck
Message: Using /bin/kmod for kmod
Message: Using /usr/sbin/kexec for kexec
Message: Using /sbin/sulogin for sulogin
Message: Using /bin/mount for mount
Message: Using /bin/umount for umount
Program loadkeys found: NO
Program /usr/sbin/loadkeys found: NO
Program /sbin/loadkeys found: NO
Program setfont found: NO
Program /usr/sbin/setfont found: NO
Program /sbin/setfont found: NO
Message: Using /sbin/nologin for nologin
Program gperf found: NO
meson.build:584:0: ERROR: Program(s) ['gperf'] not found or not executable
提示缺少gperf工具,使用apt-get进行安装,清除后重新编译还是不行。这个问题搞了好几天,在网上各种搜都没有找到同样问题的,NXP论坛也去了,得到的解决方案还是不行。最后查看日志的时候发现很多工具都是存放在这个目录下。
/home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools
于是就尝试了一下,将/usr/bin目录下的gperf工具拷贝到yocto工具目录下
sudo cp /usr/bin/gperf /home/cyk/imx-yocto-bsp/build-xwayland/tmp/hosttools
重新编译后就可以了,估计到最后还是环境变量的问题,对于yocto在编译过程中的环境变量是什么样的也没去研究。
另外还有一些yocto使用的网站,可以看看
https://www.kancloud.cn/digest/yocto/138624
https://www.jianshu.com/p/ce13db733c37
还有代理配置介绍的网站
https://www.wangzhi.vip/?p=186
不过这些做下来作用都有限,对于我最有用的还是下面这条指令,在git使用http协议下速度能得到明显提升。
export ALL_PROXY=socks5://172.16.112.237:1090