Yocto开发流程参考
环境搭建1.1 系统要求操作系统Ubuntu 20.04/22.04 LTS推荐内存至少8GB RAM推荐16GB以上硬盘空间至少100GB可用空间网络稳定的互联网连接1.2 安装依赖包sudo apt update sudo apt upgrade sudo apt install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa \ libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev \ zstd liblz4-tool1.3 配置Gitgit config --global user.name Your Name git config --global user.email your.emailexample.com1.4 下载Yocto项目# 创建工作目录 mkdir -p ~/yocto/workspace cd ~/yocto/workspace # 克隆pokyYocto核心 git clone git://git.yoctoproject.org/poky -b kirkstone # 克隆meta-openembedded额外的层 git clone git://git.openembedded.org/meta-openembedded -b kirkstone # 克隆meta-qt6如果需要Qt支持 git clone https://github.com/meta-qt6/meta-qt6.git -b kirkstone1.5 初始化构建环境cd ~/yocto/workspace/poky # 初始化环境 source oe-init-build-env1.6 配置构建环境编辑conf/local.conf文件# 设置目标机器 MACHINE ? qemux86-64 # 设置并行编译 BB_NUMBER_THREADS 8 PARALLEL_MAKE -j 8 # 启用镜像压缩 IMAGE_FSTYPES tar.bz2 # 设置包管理器 PACKAGE_CLASSES ? package_rpm # 启用本地镜像缓存 DL_DIR ? ${TOPDIR}/downloads SSTATE_DIR ? ${TOPDIR}/sstate-cache2. 系统镜像编译2.1 选择镜像类型Yocto提供多种预定义镜像类型镜像类型描述大小core-image-minimal最小系统镜像~50MBcore-image-base基础系统镜像~100MBcore-image-sato带GUI的镜像~500MBcore-image-full-cmdline完整命令行镜像~200MB2.2 编译镜像# 编译最小镜像 bitbake core-image-minimal # 编译带GUI的镜像 bitbake core-image-sato # 编译完整命令行镜像 bitbake core-image-full-cmdline2.3 编译过程监控# 查看编译进度 bitbake -e | grep ^PARALLEL_MAKE # 查看任务状态 bitbake -g core-image-minimal cat pn-buildlist | grep -v native # 查看错误日志 bitbake -v core-image-minimal 21 | tee build.log2.4 验证编译结果# 查看生成的镜像 ls -la tmp/deploy/images/qemux86-64/ # 运行QEMU模拟器 runqemu qemux86-64 core-image-minimal3. 添加Recipe3.1 Recipe基本结构# myapp_1.0.bb SUMMARY My Application DESCRIPTION A simple example application HOMEPAGE https://example.com LICENSE MIT LIC_FILES_CHKSUM file://LICENSE;md5xxxxxxx SRC_URI git://github.com/user/myapp.git;branchmain;protocolhttps SRCREV v1.0 S ${WORKDIR}/git inherit cmake DEPENDS boost openssl do_install() { install -d ${D}${bindir} install -m 0755 ${B}/myapp ${D}${bindir}/ }3.2 创建自定义层# 创建层结构 mkdir -p meta-mylayer/recipes-myapp/myapp cd meta-mylayer # 创建层配置文件 cat conf/layer.conf EOF # We have a conf and classes directory, add to BBPATH BBPATH . :${LAYERDIR} # We have recipes-* directories, add to BBFILES BBFILES ${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend BBFILE_COLLECTIONS mylayer BBFILE_PATTERN_mylayer ^${LAYERDIR}/ BBFILE_PRIORITY_mylayer 10 LAYERDEPENDS_mylayer core EOF3.3 添加层到构建配置# 在build/conf/bblayers.conf中添加 BBLAYERS ? \ /path/to/poky/meta \ /path/to/poky/meta-poky \ /path/to/meta-openembedded/meta-oe \ /path/to/meta-mylayer \ 3.4 常见Recipe类型3.4.1 CMake项目inherit cmake EXTRA_OECMAKE -DCMAKE_BUILD_TYPERelease3.4.2 Autotools项目inherit autotools3.4.3 Python项目inherit setuptools33.4.4 内核模块inherit module4.5 调试Recipe# 清理recipe bitbake -c clean myapp # 重新下载源码 bitbake -c fetch -f myapp # 解压源码 bitbake -c unpack myapp # 打补丁 bitbake -c patch myapp # 配置 bitbake -c configure myapp # 编译 bitbake -c compile myapp # 安装 bitbake -c install myapp4. 常见问题与解决方案4.1 编译错误问题依赖包缺失# 解决方案 bitbake -c cleanall recipe-name bitbake recipe-name问题网络连接问题# 解决方案设置代理 export http_proxyhttp://proxy.example.com:8080 export https_proxyhttp://proxy.example.com:8080 # 或在local.conf中添加 PREMIRRORS ?? \ bzr://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ cvs://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ git://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ gitsm://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ hg://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ osc://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ p4://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ svk://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \ svn://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n4.2 性能优化# 在local.conf中添加 # 启用ccache INHERIT ccache CCACHE_DIR ${TMPDIR}/ccache # 设置磁盘缓存 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,1K4.3 镜像定制# 添加自定义包到镜像 IMAGE_INSTALL_append myapp myutils # 移除默认包 IMAGE_FEATURES_remove x11-base # 设置root密码 INHERIT extrausers EXTRA_USERS_PARAMS usermod -P root root;4.4 调试技巧# 查看recipe变量 bitbake -e recipe-name | grep VAR_NAME # 查看依赖关系 bitbake -g recipe-name cat pn-depends.dot | grep -v native # 查看文件路径 bitbake -c listtasks recipe-name总结Yocto Project是一个强大的嵌入式Linux构建系统通过本文档的介绍您应该能够成功搭建Yocto开发环境编译系统镜像使用开发工具提高效率创建和管理自定义Recipe随着经验的积累您可以进一步探索Yocto的高级特性如多配置构建SDK生成自动化测试持续集成更多资源Yocto Project官方文档Yocto Project邮件列表Yocto Project Wiki