本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言。微信公众号: 嵌入式Linux那些事儿

1 Yocto的构建示意图

OpenEmbedded是Yocto Project特有的构建系统,构建系统的核心是任务执行器BitBake,OpenEmbedded的构建过程流程如下图所示:

这个构建过程的流程图初一看晦涩难懂,但将其分成下面5个部分后,便很容易理解。

区域1配置文件:包括用户配置、元数据(包含配方、补丁)、机器配置、发行版配置;

区域2源文件:下载的三个途径:上游发行版,本地项目和SCM;

区域3:构建系统:包括源代码获取、打补丁、编译。分析输出以生成软件包,创建和测试软件包,生成映像以及SDK;

区域4:扩展软件包:包含输出软件包(RPM,DEB或IPK)的目录,这些目录随后用于构建系统生成的映像或软件开发套件(SDK)的构建。如果启用了运行时程序包管理,还可以使用Web服务器或其他方式复制和共享这些提要,以方便在运行时扩展或更新设备上的现有镜像;

区域5:生成镜像文件和SDK。

整个构建过程的顺序分别是:

源文件获取,源文件解压和打补丁,配置、编译和安装,输出分析和打包,创建镜像,创建SDK。

本节主要讲述第一部分:配置文件。

2 配置文件

2.1 用户配置

使用oe-init-build-env脚本创建构建环境

 $ source oe-init-build-env build

构建脚本便会在poky/build/conf目录下生成默认用户配置文件,包含local.confbblayers.conf

local.conf文件提供了许多定义构建环境的基本变量。用户配置列出了构建镜像目标的体系结构、在何处存储下载源代码及构建属性等。用户目录拥有最高级别的配置。下图为local.conf文件,对部分常用变量进行描述:

切换到build目录,查看conf/local.conf

 
$ cat conf/local.conf
#目标机器的选择MACHINE ??= "qemux86-64"#发行版DISTRO ?= "poky"#指定OpenEmbedded构建系统在打包数据时使用的程序包管理器PACKAGE_CLASSES ?= 'package_rpm'​EXTRA_IMAGE_FEATURES ?= "debug-tweaks"​USER_CLASSES ?= "buildstats image-mklibs image-prelink"​PATCHRESOLVE = "noop"#构建时,启用线程个数。BB_NUMBER_THREADS = "4".........#源下载被存放的位置(注意此时该目录在BUILD目录下,建议把该目录放到构建环境目录之外)DL_DIR ?= "${TOPDIR}/downloads/"#共享缓存目录(注意此时该目录在BUILD目录下,建议把该目录放到构建环境目录之外)SSTATE_DIR ?= "${TOPDIR}/sstate_cache/"#构建输出目录TMP_DIR ?= "${TOPDIR}/tmp/"CONF_VERSION = "1" 

注意:

DL_DIR:软件包下载的目录,默认的设置是在构建环境目录下的downloads目录,建议修改到构建环境以外的目录,这样,当你新建一个构建环境时,不用重复下载这些软件包。(Yocto项目构建的大部分时间都浪费在下载这些软件包上)

SSTATE_DIR:共享的状态缓存文件目录,默认的设置是在构建环境目录下的sstate-cache目录,建议修改到构建环境以外的目录。因为在构建过程中,很多任务会产生大量的中间输出,而这些中间输出对将来其他的构建来说时可以重用的,这样可以大大加速构建过程。

您可以使用绝对路径对变量指向的路径进行设置:

 DL_DIR ?= "home/hann/poky/downloads/"SSTATE_DIR ?= "home/hann/poky/sstate_cache/"

bblayers.conf文件告诉BitBake在构建过程中要使用哪些层。默认情况下,此文件中仅列出的层包括构建系统所需的层。所以,您必须手动添加已创建的所有自定义图层。下图为bblayers.conf的内容:

 # build/conf/bblayers.conf文件发生变化后,变量POKY_BBLAYERS_CONF_VERSION的数字会随着增加。 POKY_BBLAYERS_CONF_VERSION = "2"​BBPATH = "${TOPDIR}"BBFILES ?= ""​BBLAYERS ?= " \/home/hann/poky/meta \/home/hann/poky/meta-poky \/home/hann/poky/meta-yocto-bsp \"

2.2 配方文件

下面通过一个简单例子hello.bb介绍配方文件,hello.bb在项目中的位置:

 /poky/documentation/ref-manual/examples/hello-single

hello.bb配方文件的内容如下:

 #配方需编译文件的描述DESCRIPTION = "Simple helloworld application"SECTION = "examples"#遵守的协议LICENSE = "MIT"#LICENSE文件,该文件对应的MD5LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"#从本地获取源文件SRC_URI = "file://helloworld.c"#变量S指的是bitbake放置已解压文件目录的完整路径S = "${WORKDIR}"#构建:通过执行make命令来实现编译和链接do_compile() {${CC} helloworld.c -o helloworld}#安装:通过执行make install命令将编译好的文件安装到变量${D}${bindir}指定的目录中do_install() {install -d ${D}${bindir}install -m 0755 helloworld ${D}${bindir}}

2.3 机器配置

Yocto项目板级支持包meta-yocto-bsp层的目录结构如下所示,可以看出在/conf/machine中存放机器配置文件*.conf。

 hann@hann-virtual-machine:~/yocto/poky/meta-yocto-bsp$ tree -L 2
.├── conf│   ├── layer.conf│   └── machine├── beaglebone-yocto.conf├── edgerouter.conf├── genericx86-64.conf├── genericx86.conf├── include└── mpc8315e-rdb.conf├── lib│   └── oeqa├── README.hardware├── recipes-bsp│   ├── formfactor│   └── gma500-gfx-check├── recipes-graphics│   └── xorg-xserver├── recipes-kernel│   └── linux└── wic├── beaglebone-yocto.wks├── edgerouter.wks├── genericx86.wks└── mpc8315e-rdb.wks​12 directories, 6 files
 

下面是一个默认的典型配置文件,机器名为x86_64,统用的PC机和服务器的计算机配置。支持常用的驱动程序,这些驱动程序可以在“典型”的硬件上使用。

 DEFAULTTUNE ?= "core2-64"require conf/machine/include/tune-core2.increquire conf/machine/include/genericx86-common.inc​SERIAL_CONSOLES_CHECK = "ttyS0"#For runqemuQB_SYSTEM_NAME = "qemu-system-x86_64"

3.4 层配置文件

为特定发行版构建的镜像或SDK提供顶级或常规策略。例如,在Poky中,发行层是 meta-poky层。在发行版层中是一个conf/distro包含发行版配置文件的目录,如poky.conf ,其中包含用于Poky发行版的 许多策略配置。

meta-poky

 hann@hann-virtual-machine:~/yocto/poky/meta-poky$ tree -L 2.├── classes│   └── poky-sanity.bbclass├── conf│   ├── bblayers.conf.sample│   ├── conf-notes.txt│   ├── distro│   ├── layer.conf│   ├── local.conf.sample│   ├── local.conf.sample.extended│   └── site.conf.sample├── README.poky└── recipes-core├── busybox├── psplash└── tiny-init​7 directories, 8 files

layer.conf

 #在conf和classes目录下搜素配置文件和类文件BBPATH =. "${LAYERDIR}:"​#在recipes-*文件中查找配方文件和追加文件BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \${LAYERDIR}/recipes-*/*/*.bbappend"#下面定义 搜索的方式和等级BBFILE_COLLECTIONS += "yocto"BBFILE_PATTERN_yocto = "^${LAYERDIR}/"BBFILE_PRIORITY_yocto = "5"​LAYERSERIES_COMPAT_yocto = "zeus"​#版本号LAYERVERSION_yocto = "3"​LAYERDEPENDS_yocto = "core"​REQUIRED_POKY_BBLAYERS_CONF_VERSION = "2"

3 总结

本文对OpenEmbedded的构建过程总结为5个部分,并对配置文件部分进行了分析。OpenEmbedded构建过程的其它部分,将在公众号(嵌入式Linux那些事儿)后续文章中进行分析。

利用Yocto构建嵌入式Linux教程3_1--Yocto构建系统的配置文件相关推荐

  1. 利用Yocto构建嵌入式Linux教程01--第一个Yocto项目构建

    大家好,从今日开始,计划写一个利用Yocto构建嵌入式Linux的教程,算是对个人工作和学习的一个总结. 本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 ( ...

  2. 利用Yocto构建嵌入式Linux教程02--Yocto的一些基本概念介绍

    本教程选用的Yocto版本为3.0.4,使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言.微信公众号:嵌入式Linux那些事儿 在Yocto项 ...

  3. iMX6Ull采用Yocto构建嵌入式Linux系统(三)

    获取Yocto 设置Git用户名和密码 Yocto项目采用repo管理各个git库的方式进行管理.因此,除了使用repo工具外,还需要使用到Git.使用Git前,需要设置Git的用户名和密码: $ g ...

  4. 用QEMU构建嵌入式LINUX系统

    Table of Contents Qemu –从源头建造 ARM工具链 Linux内核 构建文件系统 通过NFS使用根文件系统 配置QEMU Tap网络 创建运行脚本 推荐阅读:<在CentO ...

  5. 构建嵌入式linux系统_用于构建嵌入式Linux系统的4种工具

    构建嵌入式linux系统 Linux正在被部署到比Linus Torvalds在他的宿舍里工作的设备更多的设备中. 受支持的各种芯片架构令人震惊,并导致各种大小的设备都使用Linux. 从庞大的IBM ...

  6. 嵌入式系统实验 构建嵌入式Linux系统,《嵌入式系统与开发》构建嵌入式Linux系统-实验报告.doc...

    <嵌入式系统与开发>构建嵌入式Linux系统-实验报告 <嵌入式数据库sqlite移植及使用> 实验报告 学生姓名: 陈 彤 学 号: 1座机电话号码 专业班级: 130044 ...

  7. 基于AT91SAM9G20构建嵌入式Linux系统

    本文中使用的目标平台AT91SAM9G20是Atmel公司使用ARM926EJ-S处理器内核开发的一块SoC嵌入式微处理器,主频达到400MHz,具有Atmel 先进的外设DMA 和分布式存储器架构, ...

  8. 基于qemu-riscv从0开始构建嵌入式linux系统ch10. qemu之virtio与fw_cfg

    基于qemu-riscv从0开始构建嵌入式linux系统ch10. qemu之virtio与fw_cfg 上一节我们已经基本完成了uboot的移植,下一步自然就是移植linux kernel.在真实的 ...

  9. 基于qemu-riscv从0开始构建嵌入式linux系统ch3. 添加中断控制器、串口、pflash支持

    基于qemu-riscv从0开始构建嵌入式linux系统ch3. 添加中断控制器.串口.pflash支持 添加串口支持 真实板卡的初期调试中,串口打印可谓神器,几乎所有的SOC都会带有串口这个外设,因 ...

最新文章

  1. Nginx与Lua利用fpm打成rpm包
  2. 【ACM】UVa 489 刽子手游戏(自顶向下)
  3. html左右飘窗高度不一致,飘窗的最佳尺寸,你可知道?不懂的留着吧!
  4. 《WebForm开发系列高级篇》Item2导出EXCEL通用类(GridView,DataList,Repeater,DetailView)
  5. 大牛推荐的30本经典编程书籍,从Python到前端全系列。
  6. 数学--数论--HDU 6128 Inverse of sum (公式推导论)
  7. .net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...
  8. Fedora 11 Beta 跳票了
  9. protostuff java_protostuff 及其注意事项
  10. 学生信息管理系统——C语言版
  11. 推荐一个工具:Dukto 免费快速实现局域网跨平台文件传输
  12. 阿里云服务器使用freessl配置免费证书Nginx
  13. java 新浪短链接_如何通过Java调用新浪短网址官方API接口实现短网址缩短功能
  14. Android - 简单的查看APP启动时间
  15. 饥荒联机版专属服务器建立和后续mod更新
  16. sniffer-agent
  17. 为 什 么 说 Synchronized 是 一 个 悲 观 锁 ?
  18. MOS管过大电流时关断为什么会出现尖峰电压
  19. 一位创业者创业失败后,成功的做了一个创业孵化器!
  20. 小技巧:Excel顽固的名称、引用冲突的解决

热门文章

  1. 分享一个英语听力资源下载网站
  2. Adobe Photoshop CS6图片无法拖入解决方法
  3. 采用分治算法迭代计算最长公共前缀问题(python)
  4. 机器学习实验——分类学习算法
  5. 电信和移动差距:关于充话费赠手机的营销对比
  6. 【PYTHON,WORD】3.调整Word文档样式
  7. pandas数据分组聚合——groupby()、aggregate()、apply()、transform()和filter()方法详解
  8. 结合grabcut和inpaint,实现人像去除
  9. mysql mongo关联查询语句_MySQL与Mongo简单的查询实例代码 筋斗云网络
  10. PHP语言的动态特性-Going dynamic with PHP