语言iOS开发者的部分前端感悟

正文首发于自身博客
sunyongfeng.com。

许多前端工程师会将团结比喻“魔法师”,而于JavaScript这门语言,我啊想拿它唤作一流派“有魔力的言语”。因为当时丛闹最为想法的人数,真的在用它创造各种为您好奇之东西。

  1. 译者序

Web三件套


一、前言

几年前,笔者还是同誉为初涉编程的学童,对于开发的各个领域都倍感新奇。曾经以知乎一个编程相关的题材下,看到一个关于各个领域的诙谐论调,谈到前者,他概括为:“前端简单来说即使是画网页”。笑说了后,笔者也非经意间留下了前者很简单、比较低端之记忆。
新生有矣几年的活动端支付经历,后端也来一些执。在不久前的平客工作经历中,开始逐年了解了直接未曾参与的前端领域。旋即段经历切实地证实了“无知者无畏”这句话,因为我逐渐察觉了前者的魅力所在,甚至为它所吸引。
即时篇文字本身分类在了随笔中,严格来说它不到底一篇技术文章,写下来的目的是纪念记录一番协调之醒,也可望跟各位前端的前辈以及既同本人来相同想法的同学多交流。

正文译自 A practical guide to
BitBake。

仲、移动端的开头。

大学之当儿,学院科创基地当品种领域的实施顺序便是先行由前端开始入门,完成一个网页项目事后,开始随机选择后端、移动端,或者连续深耕前端。那时对前者有了早期的记忆:通过编程创造一个网页。它的容易入门,让首的自家当是世界不过这样。各种培训机构对于前端教学的怒势头,也造就了自身对这个技术趋势“低端”的误会。所以转而开
iOS 开发之习。
转瞬几年过去,在运动端上之经过中,也当持续地了解在别样世界。由于移动端对后端的指,自己吗开始了后端开发之推行,对几栽后端语言都发生了品尝。但是一直以来,对于前端都只是停留在能够简单地刻画一些
HTML,粗略地读懂前端的代码。而于她的领悟,更是与最初无异。

使您发现
bug、不晓得的节、打印错误或其他建议,请邮件告知自己,我之信箱是
sunnogo@gmail.com

老三、大前端的干活更

前段时间开始了当有数十人口大前端团队工作之经验,岗位 iOS
开发,团队受到移动端工程师负责ReactNativeHybrid齐类别的 Native
部分。由于工作用,开始了JavaScript的读书。曾经对当下门语言的认识是“操作DOM,从而实现网页中UI、数据等之动态部分”。
团组织受到前端工程师的办事内容,也同本人记忆中的大妈不同。他们见面开展React框架的本地化改进,会也ReactNative添加更增长的功效,他们再会创一个个起想法的制品,比如根据注释自动生成标准化文档的家伙、协作管理和测试API的阳台等等,我印象中网页的画家竟然也可是各种有创见和实用性的制品之创造者。这叫我开重新认识前端是领域。

留神:由于 task 和 recipe 是 BitBake
的基础概念。个人认为翻成任务和配方不免有误解的处在,因此文中基本未针对及时片独词做翻译。类似之还有
configure。

季、对前者的重新认识

就了解之加深,我开接触到更多开发了见识的前端项目,也针对前端工程师出矣全新的知晓。

  • ##### 永远不熄灭一咸三端的志向

是因为其余平台都必不可少 Web
运行环境,造就了“每当一个初的平台出现,都是前者工程师的新舞台”的层面。
个体电脑推广下,由于 Windows 和 Mac OS
操作系统还发出独家的商海,每当一舒缓软件推出,开发人员都必须也零星只平台独家采用不同的语言编写不同的桌面客户端。这个时前端工程师开始站了出,他们创造了Electron,想要为此Web三件套来构建跨平台的桌面客户端。
于智能手机风靡的今日,他们又创办出了PhoneGap,想使就此Web三项套来开过平台的移动应用程序。他们创造了Weex,甚至想用同样仿照Web代码构建各移动平台的原生应用程序。他们还创造了ReactNative,想使为此Web代码编写各平台的原生应用程序。
她们以这个宏伟的目标不断尝试,而桌面客户端或挪动端工程师则于无停歇地从他们之行事。(哭

  • ##### 百家争鸣的开框架

对于各种设计模式,前端工程师等总是冲在前边进行尝试,各种前端开发框架为就算层出不穷。ReactAngularVue,虽然彼此之间竞争剧烈,但毋庸置疑他们还各有所长,也深改观了前端开发的法。可以说,对于前端工程师,“与时俱进”是无与伦比核心的渴求,因为及时群口到底在非鸣金收兵地开创新东西。

  • ##### 后端?我耶可

哪位说前端真的就是永远停留在前者?node.js告诉我们前端工程师也得开展后端开发。而且由于
JavaScript
的语言、以及相应引擎的特性,node架构的类在少数场景下还装有美妙之显现。

  • ##### 在各种场面中进行创办

由前端项目在各种平台中之通畅,以及浏览器在私有电脑受到之使用方便性,前端工程师创造了各种可以好我们生存之成品。可以说,很多前端工程师是有良好产品经理的想法的。
作者使用的博客框架Hexo暨同样好精良的Ghost,可以好好地开展个人博客网页的自动化生成。
任何的各种JavaScript项目,笔者不一一列举了,总的而见面发现自己在持续地问,“它还可以形成这?”

  • ##### 无所不能的JavaScript

生魔力的JavaScript

众前端工程师会管自己称作魔法师,因为它们会创出各种神奇之种类,满足各种具体的要求。这一切都是因为她发出
JavaScript 这个起魔力的枪杆子。在 Github
语言排行榜中挨雄踞第一,那么基本上口且以用它举行在各种有趣之事体。又或说是脚本语言的“无所未能够”,另一个漂亮的脚本语言
Python,也一致在举行着各种神奇之业务。

  1. 序言

五、笔者的终极感悟

好之职业规划一直都是成一个全栈工程师,进而成为一个明白技术之成品经营。后端作为一个型的基业,所以一直于拓展着尝,也计划正在就要发力学习。移动端是履行已老之天地。而前者,一直还深受自己所忽略。开始了解下,竟然发现前端是世界人人都是活经理,让我觉着移动端、后端的工程师总是在专注在友好之片段,而前者工程师也是无比有产品视野的,他们总思索着各种刁钻古怪的想法。事实吧确确实实如此,相比起,前端领域是最为有精力之。自己接下,也以开始大前端的探讨。

后记

无知者无畏。曾经当前端浅显,觉得其他世界高端。经过摸底才知晓她的魅力。确实,前端入门门槛非常没有,然而她的上限确实用不完高。不甚了解的时,心中来莫名其妙的不足。了解得愈多,越发产生了敬畏。技术的鄙视链一直留存,现在倒是发现,总是叫嚣在轻视某个圈子的人数,多半对这方向不甚了解。只有当某某圈子成就顶端的人口,才生身份考评高下。哪天尤雨溪要是言语:“嗨,前端是趋势,不过这样。”那我或者就是着实会信了咔嚓。(笑


1.1 关于以课程

若你看本学科,说明您早已了解 BitBake 是同等栽恍若 make
的构建工具,主要用于 OpenEmbedded 和 Yocto 工程构建 Linux
发行本。你可能也曾发现及 BitBake
的上学曲线来接触突然,本文可吃这曲线变缓一些。

本文不见面报告您 BitBake 的百分之百,但是会尝试解释以 BitBake
时用到的片基本功能。理解这些基础而辅助您开写好的 BitBake recipe。

1.2 本课程的靶子

准课程展示如何创造一个无比小工程,并一步步扩展,说明 BitBake 如何运转。

1.3 致谢

感谢 Tritech
给本人时刻准备按照文档。同时感谢大家以问题跟站点语的题材和打印错误。

1.4 反馈

若是你意识 bug、不知道的段、打印错误或任何建议, 请使用 issue tracker
https://bitbucket.org/a4z/bitbakeguide/issues,不待报。
还要为可以使用本文底部的 Disqus 评论功能。

  1. BitBake

2.1 什么是 BitBake

以下内容有助于了解 BitBake:

差不多,BitBake是一个Python程序,它由用户创建的布置驱动,可以呢用户指定的对象实行用户创建的天职,即所谓的配方(recipes)。

2.1.1 Config、tasks 与 recipes

经过一致栽 BitBake 领域特定语言形容 Config、tasks 与
recipes,这种语言包含变量和可实行之 shell、python
代码。所以理论及,BitBake 可以执行代码,你吧足以为此 BitBake
做除了构建软件之外的事体,但是连无推荐这么做。

BitBake
是千篇一律种植构建软件的工具,因此产生一对奇之效应,比如可定义依赖关系。BitBake
可以解决因关系,并拿那任务为对顺序运行。此外,构建软件包通常含相同或相似之职责。比如大规模的天职:下载源代码包,解压源代码,跑
configure,跑 make,或简捷的输出 log。Bitbake
提供相同种机制,可经平等栽而部署的法,抽象、封装和录取这个效果。

  1. 配置 BitBake

BitBake
可以起此间下载:https://github.com/openembedded/bitbake。选择一个版本的分,并生载
zip。解压 zip 包,可找到一个 bitbake-$version 目录。

小心:本文使用的 Bitbake 版本是 bitbake-1.22,因此可本学科的 bitbake
版本应该不止或顶1.22。
专注:译者使用 bitbake-1.27.0,因此文中样例为 1.27.0 版本 bitbake
样例。
提拔:如果应用 Yocto,则无欲装 BitBake,Yocto 源代码本身捆绑了
BitBake。Yocto 要求你 source
一个剧本,这个剧本和咱们这边召开的一模一样,安装 BitBake 到我们的环境被。

3.1 安装 BitBake

装过程十分简单:

  • 添加 bitbake-$version/bin 目录到 PATH
  • 添加 bitbake-$version/lib 目录到 PYTHONPATH

即执行:

export PATH=/path/to/bbtutor/bitbake/bin:$PATH
export PYTHONPATH=/path/to/bbtutor/bitbake/lib:$PYTHONPATH

顿时基本跟 yocto init 脚本一致。yocto init 脚本同时也开创 build
目录,我们拿当顷刻创建。

首先检测是勿是一切正常、bitbake 是否安装成功。通过执行以下 bitbake
命令:

bitbake --version

运行结果当接近:

BitBake Build Tool Core version 1.27.0

3.2 BitBake 文档

极致实际的版本带有源代码。

当极端中,cd 到 bitbake-$version/doc 目录并执行以下命令,生成
doc/bitbake-user-manual/bitbake-user-manual.html。

make html DOC=bitbake-user-manual

这文档可与遵循课程并行阅读,在朗诵完本教程后呢欲阅读该文档。

yocto
工程文档
也发生一个 bitbake 章节。

  1. 创立工程

4.1 Bitbake 工程布局

经过 BitBake 工程通过 layers 目录及一个 build 目录组织,layer
目录包含配置文件和 meta data。

4.1.1 Layer 目录

Layer 目录包含配置、任务以及目标描述。常因此 meta-‘something’ 命名 Layer
目录。

4.1.2 Build 目录

Build 目录是 bitbake 命令于实施之地方。在这边,BitBake
期望能找到该初步配置文件,并以那转移的保有文件在这目录。

为让 BitBake 运行时起有其它不当,我们用创造一个 build 目录和一个
layer 目录,并以斯存放有亟待的布局文件。

4.2 最小工程

极端小的配置看起像这么:

bbTutorial/
├── build
│   ├── bitbake.lock
│   └── conf
│       └── bblayers.conf
└── meta-tutorial
    ├── classes
    │   └── base.bbclass
    └── conf
        ├── bitbake.conf
        └── layer.conf

亟需创造这 4 个公文:

  • bblayers.conf
  • base.bbclass
  • bitbake.conf
  • layer.conf

4.2.1 需要之安排文件

第一描述得之公文,然后简短说明其内容。

build/conf/bblayers.conf,BitBake 于其工作目录(即 build
目录)期望找到的首先个文件。现在我们为以下内容创建一个 bblayers.conf:

BBPATH := "${TOPDIR}"
BBFILES ?= ""
BBLAYERS = "/path/to/meta-tutorial"

meta-tutorial/conf/layer.conf,每个 layer 需要一个 conf/layer.conf
文件。现在咱们盖以下内容创建它:

BBPATH .= ":${LAYERDIR}"
BBFILES += ""

meta-tutorial/classes/base.bbclass
meta-tutorial/conf/bitbake.conf
当今,这些文件可以起 BitBake 安装目录中得。这些文件在文件夹
bitbake-$version/conf 和 bitbake-$version/classes中。只需要以它复制到
tutorial 项目被。

4.2.2 创建文件的组成部分注意事项

build/conf/bblayers.conf

  • 加上当前目录及 BBPATH,TOPDIR 被 BitBake 设置为当前工作目录。
  • 开班设置 BBFILES 变量为空,Recipes 在后会加上。
  • 长我们 meta-tutorial 的不二法门到 BBLAYERS 变量。当 BitBake
    开始履行时,它会找所有给定的 layer 目录,以便获取任何安排。

meta-tutorial/conf/layer.conf

  • LAYERDIR 是 BitBake 传被那所加载 Layer 的变量。我们上加该路线到
    BBPATH 变量。
  • BBFILES 告诉 BitBake recipes
    在啊,现在我们从来不添加任何东西,但是说话咱们见面转移其。

注意事项。“.=” 和“+=”
以不弥加空格、添加空格的方法,将追加值附给一个变量。

conf/bitbake.conf
conf/bibake.conf 包含 一层层我们谈谈的变量。

classes/base.bbclass
一个 *.bbclass 文件包含共享功能。我们的 base.bbclass
包含部分咱们说话运用的 log 函数,以及一个 buld 任务。
并无是怪有因此,但是 BitBake 有要求,因为如果没其它现实工作时,BitBake
默认需求的。我们就将转这作用。

4.2.3 BitBake 搜索路径

于 BitBake 来讲,有成千上万 BBPATH 非法和文书路径。这证明要我们告诉
BitBake 探索有路时,它会招来 BBPATH。
俺们添加 TOPDIR 和 LAYERDIR 到 BBPATH,放在 classes/base.bbclass 或
conf/bitbake.conf 中的自由一个。
理所当然,我们会加加 meta-tutorial 目录。
编译目录不承诺涵盖通用文件。只有像 local.conf
对实在编译是行得通之,后面我们见面为此到 local.conf。

第一次于运行

创立上述四只布局文件后,在极限 cd 到 build
目录,这是我们的办事目录。我们一直在 build 目录运行 bitbake 命令,以便
bitbake 可以找到相应的 conf/bblayers.conf 文件。

现在,在 build 目录,不牵动其他参数运行 bitbake 命令:

bitbake

一旦先的步骤正确,则控制台会输出:

Nothing to do.  Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.

马上从没什么用,但是一个好的开始。

此介绍一个百般有因此的授命标志:输出一些 debug 信息。
执行 bitbake -vDD,然后查其出口,它报告我们大量有关 BitBake
如何动作的信。

DEBUG: Found bblayers.conf (~/bbTutorial/build/conf/bblayers.conf)
DEBUG: LOAD ~/bbTutorial/build/conf/bblayers.conf
DEBUG: Adding layer ~/bbTutorial/meta-tutorial
DEBUG: LOAD ~/bbTutorial/meta-tutorial/conf/layer.conf
DEBUG: LOAD ~/bbTutorial/meta-tutorial/conf/bitbake.conf
DEBUG: BB configuration INHERITs:0: inheriting ~/bbTutorial/meta-tutorial/classes/base.bbclass
DEBUG: BB ~/bbTutorial/meta-tutorial/classes/base.bbclass: handle(data, include)
DEBUG: LOAD ~/bbTutorial/meta-tutorial/classes/base.bbclass
DEBUG: Clearing SRCREV cache due to cache policy of: clear
DEBUG: Using cache in '~/bbTutorial/build/tmp/cache/local_file_checksum_cache.dat'
DEBUG: Using cache in '~/bbTutorial/build/tmp/cache/bb_codeparser.dat'

而于顾到 BitBake 创建了一个 bitbake.log 文件及一个 tmp 目录?

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ ls
bitbake.lock  conf  tmp

提示,所有的样例代码都可从
https://bitbucket.org/a4z/bitbakeguide
获取。本样例在 ch04。

  1. 第一个 recipe

BitBake 需要 recipes 定义要做来什么,现在此呀还未曾。
咱得以经过 bitbake -s 确认运行时什么吧尚未做:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
ERROR: no recipe files to build, check your BBPATH and BBFILES?

Summary: There was 1 ERROR message shown, returning a non-zero exit code.
NOTE: Not using a cache. Set CACHE = <directory> to enable.
Recipe Name                                    Latest Version         Preferred Version
===========                                    ==============         =================

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 

马上告诉我们少个信息:

  1. 尚未定义任何 cache;
  2. BitBake 真的悠闲可做,只显示了一个空的 recipe 列表

5.1 cache 位置

BitBake 缓存 meta data 在一个索引,即 cache
目录。这会协助加快后面推行的指令。

俺们只是透过简单加加一个变量到 bitbake.conf 文件,解决 cache
找不交的问题。因此,我们编辑 meta-tutorial/conf/bitbake.conf
文件,并以脚添加:

CACHE = "${TMPDIR}/cache/default"

增补加后运行 bitbake -s 的结果:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
ERROR: no recipe files to build, check your BBPATH and BBFILES?

Summary: There was 1 ERROR message shown, returning a non-zero exit code.

留意:在促成种被,比如 Yocto,这些变量已经装好,我们毫不关心。通常
cache 路径由不同之变量组成,在名称被富含实际的构建配置,如 debug 或
release。

下同样步是丰富一个 recipe,需要简单只步骤:

  1. 比方 bitbake 可以找到 recipes
  2. 描绘第一个 recipe

5.2 添加一个 recipe 到 tutorial layer

BitBake 需要了解一个 layer 提供哪些 recipes,可经编制
meta-tutorial/conf/layer.conf 文件,使用通配符告诉 BitBake 加载所有的
recipe:

BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb"

本可下以前当 build/conf/bblayers.conf 定义之变量。recipe
文件之扩充名是 .bb,如果我们通过通配符的艺术,只用一行就好告知 BitBake
加载所有 recipes。

常备 recipes 有谈得来的目录,并坐 groups
的花样收集在一道,也就是说把有涉嫌的 recipes 放在同一个目。

只顾:通常采用 recipes-‘group’ 命令这些目录,这里 group 名表示一个
category 或局部先后。

本 BitBake 已经知道从哪找 recipe,我们可以开始添加第一独 recipe 了。

按部就班一般的做法,我们创建目录
meta-tutorial/recipes-tutorial/first,并于是创建第一独 recipe。 Recipe
文件呢生通用的命名方式:{recipe}_{version}.bb

5.3 创建第一单 recipe 和 task

咱俩的率先独 recipe 只打印一些 log 信息。将它们座落 tutorial group,版本为
0.1。所以我们的率先只 recipe 是:
meta-tutorial/recipes-tutorial/first/first_0.1.bb

DESCRIPTION = "I am the first recipe"
PR = "r1"
do_build () {
  echo "first: some shell script running as build"
}
  • task do_build 覆盖 base.bbclass 中的全局 build task。
  • PR 是里面修订数据,在每次修订后许于更新。
  • 安 description 可说该 recipe 的用途。

假若点还举行对了,可以通过 bitbake -s 列出可用的 recipes。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 1 .bb files complete (0 cached, 1 parsed). 1 targets, 0 skipped, 0 masked, 0 errors.
Recipe Name                                    Latest Version         Preferred Version
===========                                    ==============         =================

first                                                 :0.1-r1                          

接下来就得尽 bitbake first 编译 first 组件。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 1 .bb files complete (0 cached, 1 parsed). 1 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

兹检讨 tmp/work/first-0.1-r1/temp 目录,里面有有妙趣横生之文书:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ ls -al tmp/work/first-0.1-r1/temp/
total 20
drwxrwxr-x 2 sunyongfeng sunyongfeng 4096 10月 20 11:19 .
drwxrwxr-x 3 sunyongfeng sunyongfeng 4096 10月 20 11:19 ..
lrwxrwxrwx 1 sunyongfeng sunyongfeng   18 10月 20 11:19 log.do_build -> log.do_build.17314
-rw-rw-r-- 1 sunyongfeng sunyongfeng  123 10月 20 11:19 log.do_build.17314
-rw-rw-r-- 1 sunyongfeng sunyongfeng   37 10月 20 11:19 log.task_order
lrwxrwxrwx 1 sunyongfeng sunyongfeng   18 10月 20 11:19 run.do_build -> run.do_build.17314
-rwxrwxr-x 1 sunyongfeng sunyongfeng  909 10月 20 11:19 run.do_build.17314

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/log.do_build.17314 
DEBUG: Executing shell function do_build
first: some shell script running as build
DEBUG: Shell function do_build finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/log.task_order 
do_build (17314): log.do_build.17314
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/run.do_build
#!/bin/sh

# Emit a useful diagnostic if something fails:
bb_exit_handler() {
    ret=$?
    case $ret in
    0)  ;;
    *)  case $BASH_VERSION in
        "")   echo "WARNING: exit code $ret from a shell command.";;
        *)    echo "WARNING: ${BASH_SOURCE[0]}:${BASH_LINENO[0]} exit $ret from
  "$BASH_COMMAND"";;
        esac
        exit $ret
    esac
}
trap 'bb_exit_handler' 0
set -e
export HOME="/home/sunyongfeng"
export SHELL="/bin/bash"
export LOGNAME="sunyongfeng"
export USER="sunyongfeng"
export PATH="/home/sunyongfeng/ops-build.test/yocto/poky/scripts:/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
export TERM="linux"
do_build() {
  echo "first: some shell script running as build"

}

cd '/home/sunyongfeng/workshop/test/tutorial/build'
do_build

# cleanup
ret=$?
trap '' 0
exit $?
  1. Classes 和 functions

生一致步用:

  • 长一个 class
  • 加上一个行使 class 的 recipe
  • 探索 functions

6.1 创建 mybuild class

缔造一个异之 build 函数,并共享。先在 tutorial layer 创建 class,如
meta-tutorial/classes/mybuild.bbclass

addtask build
mybuild_do_build () {

  echo "running mybuild_do_build."

}

EXPORT_FUNCTIONS do_build

于 base.class 中,我们加加了一个 build task,它吧是一个略的 shell
函数。mybuild_do 前缀的冲是 class 中 task 定义的业内
classname_do_functionname。

EXPORT_FUNCTIONS 使该 build 函数而于这个 class
的使用者利用,如果不加加这行,则它不会见盖 base class 中的 build 函数。

今昔,已可每当第二单 recipe 中使这个 class。

6.2 在次只 recipe 中使用 myclass

此丰富一个有些目标,在 build 任务面前先运行一个 patch 函数,这里要有
python 的用法。

因 bitbake 的命名规范,我们抬高一个新的 recipe
目录,并于拖欠目录外补充加一个 recipe 文件
meta-tutorial/recipes-tutorial/second/second_1.0.bb

DESCRIPTION = "I am he second recipe"
PR = "r1"                       (1)
inherit mybuild                 (2)

def pyfunc(o):                  (3)
    print dir (o)

python do_mypatch () {          (4)
  bb.note ("runnin mypatch")
  pyfunc(d)                     (5)
}

addtask mypatch before do_build (6)
  1. 譬如说 first recipe 那样定义 DESCRIPTION 和 PR;
  2. 继承 mybuild class,让 myclass_do_build 成为默认 build task;
  3. 纯 python 函数 pyfunc 获取有参数,并基于该入参运行 python dir
    函数;
  4. bitbake python 函数 my_patch 添加并报改成一个 task,该 task 要在
    build 函数前实行。
  5. mypatch 函数调用 pyfunc 函数,并传到全局 bitbake 变量 d。d
    (datastore) 由 bitbake 定义,并直接可用。
  6. mypatch 函数被注册改成一个 task,并求在 build 函数前执行。

立就是是一个应用 python 函数的样例。

只顾:函数部分的情节以 bitbake 手册 3.4 节。

6.3 探索 recipes 和 tasks

如今咱们有个别单 recipes 可用,可探索有初的 bitbake
命令选项。我们好落BitBake 运行时 recipes 及其
tasks、控制过程的信息。

6.3.1 显示 recipes 和 tasks 列表

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -s
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 2 .bb files complete (0 cached, 2 parsed). 2 targets, 0 skipped, 0 masked, 0 errors.
Recipe Name                                    Latest Version         Preferred Version
===========                                    ==============         =================

first                                                 :0.1-r1                          
second                                                :1.0-r1 

假设想看有 recipe 提供什么 tasks,可以经过
bitbake -c listtasks recipe_name 查看:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -c listtasks second
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 2 .bb files complete (0 cached, 2 parsed). 2 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
do_showdata
do_build
do_mypatch
do_listtasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

6.4 执行 tasks 或整构建

粗选项可在 recipes 执行 builds 或特定任务时以。

  • 构建一个 recipe。使用 bitbade recipe-name 执行该 recipe 的所有
    tasks。
  • 实践一个 task。使用 bitbake -c your-task recipe-name 只运行 recipe
    中的某个 task。
  • 构建具有 recipe。使用 bitbake world 运行有 recipes 的有所
    tasks。

得玩玩这些命令,看会出现什么。

6.4.1 确认构建过程遭到之 log

Bitbake 创建一个 tmp/work 目录存放有的 log 文件。这些 log
文件包含有有意思之信,值得一效。第一涂鸦实践了 bitbake world
,其出口为:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake world
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 2 .bb files complete (0 cached, 2 parsed). 2 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 3 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ tree tmp/work/           
tmp/work/
├── first-0.1-r1
│   └── temp
│       ├── log.do_build -> log.do_build.17657
│       ├── log.do_build.17657
│       ├── log.task_order
│       ├── run.do_build -> run.do_build.17657
│       └── run.do_build.17657
└── second-1.0-r1
    ├── second-1.0
    └── temp
        ├── log.do_build -> log.do_build.17659
        ├── log.do_build.17659
        ├── log.do_mypatch -> log.do_mypatch.17656
        ├── log.do_mypatch.17656
        ├── log.task_order
        ├── run.do_build -> run.do_build.17659
        ├── run.do_build.17659
        ├── run.do_mypatch -> run.do_mypatch.17656
        └── run.do_mypatch.17656

这些 log 文件包含众多得力之音讯,比如 BitBake 如何运作,执行 tasks
输出了呀。

  1. BitBake layers

突出 BitBake 工程分包多独 layer。通常 layer
包含一个特定主题,比如基础体系、图像系统等。一些工程得以包括不断一个构建目标,每个目标由不同之
layers 组成。例如,构建一个拉动 GUI 组件或未牵动 GUI 组件的 Linux 发行本。

Layers 可以为下、扩展、配置,也说不定有覆盖已有些
layers。这很重要,因为它同意根据实际要求用或由定义。

基本上个 layers 共同动作是通用的事例,因此我们会补充加一个分外的层次到工程。

7.1 添加一个 layer

经以下步骤添加一个新的 layer:

  1. 缔造一个初的 layer 目录
  2. 创建 layer 配置
  3. 告诉 BitBake 有新的 layer
  4. 添加 recipes 到 layer

7.1.1 添加新的 layer 目录

始建一个新的目录为 meta-two:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial$ ls
build  meta-tutorial  meta-two

7.1.2 配置新 layer

补加 meta-two/conf/layer.conf 文件,该文件及 tutorial layer 的如出一辙:

BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb"

7.1.3 告诉 BitBake 有新的 layer

编辑 build/conf/bblayers.conf,扩展 BBLAYERS 变量:

BBLAYERS = " \
  ${TOPDIR}/../meta-tutorial \
  ${TOPDIR}/../meta-two \
"

bitbake-layer 命令

通过 bitbake-layer 命令检查新 layer 配置。
率先应用 show-layers 选项,显示该工程的 layers、layers
路径和先行级。这里优先级都是 0,后面会尝试改一下。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake-layers show-layers
layer                 path                                      priority
==========================================================================
meta-tutorial         /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial  0
meta-two              /home/sunyongfeng/workshop/test/tutorial/build/../meta-two  0

bitbake-layers 命令还发出其他有效的选择项,可透过 -h 选项显示。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake-layers -h
usage: bitbake-layers [-h] [-d] [-q] <subcommand> ...

BitBake layers utility

optional arguments:
  -h, --help            show this help message and exit
  -d, --debug           Enable debug output
  -q, --quiet           Print only errors

subcommands:
  <subcommand>
    show-layers         show current configured layers
    add-layer           Add a layer to bblayers.conf
    remove-layer        Remove a layer from bblayers.conf
    show-overlayed      list overlayed recipes (where the same recipe exists
                        in another layer)
    show-recipes        list available recipes, showing the layer they are
                        provided by
    show-appends        list bbappend files and recipe files they apply to
    flatten             flatten layer configuration into a separate output
                        directory.
    show-cross-depends  Show dependencies between recipes that cross layer
                        boundaries.
    layerindex-fetch    Fetches a layer from a layer index along with its
                        dependent layers, and adds them to conf/bblayers.conf.
    layerindex-show-depends
                        Find layer dependencies from layer index.

Use bitbake-layers <subcommand> --help to get help on a specific command

7.3 扩展 layer 配置

在 layer 的 layer.conf 文件被,定义优化级和外配置值。为布局 layer
的优先级,需要补加新的概念及都有些 layer.conf。以
meta-tutorial/conf/layer.conf 开始,添加:

# append layer name to list of configured layers                                                       
BBFILE_COLLECTIONS += "tutorial"                                                                       
# and use name as suffix for other properties                                                          
BBFILE_PATTERN_tutorial = "^${LAYERDIR}/"                                                              
BBFILE_PRIORITY_tutorial = "5" 

应用的变量在 BitBake 使用手册有死好的求证,这里不另行。

模式应是明的,这里定义 layer
名,并动用这名字做啊外变量的后缀。这种当 BitBake
变量名中采取用户定义的域后缝机制,在 BitBake 的诸多地方得视。

同样的,修改 meta-two/conf/layer.conf:

# append layer name to list of configured layers                                                       
BBFILE_COLLECTIONS += "tutorial"                                                                       
# and use name as suffix for other properties                                                          
BBFILE_PATTERN_tutorial = "^${LAYERDIR}/"                                                              
BBFILE_PRIORITY_tutorial = "5" 

若是这运行 bitbake-layers show-layers,结果是:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake-layers show-layers     
layer                 path                                      priority
==========================================================================
meta-tutorial         /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial  5
meta-two              /home/sunyongfeng/workshop/test/tutorial/build/../meta-two  5
  1. 共享和录取配置

结束目前,我们利用 classes 和 config 文件包配置和
tasks。但是还有更多的法重用和扩展 tasks 和布置:

  • class 继承
  • bbappend 文件
  • include 文件

啊求证如何使用这些办法,我们以填补加 class 到 layer-two,新的 class
将介绍一个 configure-build 链并应用 class 继承重用现存的 mybuild
class。然后在初的 recipe 中动用这个新 class,最后经 append
方法扩展现有的 recipe。

8.1 class 继承

也促成 configure-build 链,这里开创一个 class,该 class 继承
mybuild,并简短加加一个 configure task,让 build task 依赖 configure
task。

meta-two/classes/confbuild.bbclass

inherit mybuild                            (1)

confbuild_do_configure () {                (2)

  echo "running configbuild_do_configure."

}

addtask do_configure before do_build       (3)

EXPORT_FUNCTIONS do_configure              (4)
  1. 以 mybuild class 为基础;
  2. 创建新的函数;
  3. 概念函数的逐一,configre 在 build 之前;
  4. export 刚创建的函数使的可用。

下一场创建 third recipe 使用 confbuild class。
meta-two/recipes-base/third_01.bb

DESCRIPTION = "I am the third recipe"
PR = "r1"
inherit confbuild

这运行 bitabke third 会执行 configure 和 build task。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake third
Parsing recipes: 100% |######################################################################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/
log.do_build            log.do_configure        log.task_order          run.do_build.19728      run.do_configure.19726  
log.do_build.19728      log.do_configure.19726  run.do_build            run.do_configure        
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/log.task_order 
do_configure (19726): log.do_configure.19726
do_build (19728): log.do_build.19728
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/log.do_configure
DEBUG: Executing shell function do_configure
running configbuild_do_configure.
DEBUG: Shell function do_configure finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/third-01-r1/temp/log.do_build
DEBUG: Executing shell function do_build
running mybuild_do_build.
DEBUG: Shell function do_build finished

8.2 bbappend 文件

append 文件可以添加函数到都生 class 中,而非待创造一个新
class。它于同名 class 添加 append 文件之文书。需要安装 layer
配置,才能够加载到相应的 append 文件。因此待改 layer 的配置,添加加载
*.bbappend 文件之布到 BBFILES 变量。例如:
meta-two/conf/layer.conf

BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"

现扩张已有些 first recipe,让它在 build task 前先行运行一个 patch
函数。为召开比,将相应的 recipe 和 append 文件放到
meta-two/recipes-base/first 目录。
meta-two/recipes-base/first/first_0.1.bbappend

python do_patch () {
  bb.note ("first:do_patch")
}

addtask patch before do_build

这儿若列出 first recipe 的 task 列表,可以看出 patch task。运行 bitbake
first 可张运行了 patch 和 build。

添加前:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -c listtasks first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
do_showdata
do_build
do_listtasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

添加 append 文件后:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake -c listtasks first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
do_showdata
do_build
do_listtasks
do_patch
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

运行 bitbake first 结果:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake first
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 3 .bb files complete (0 cached, 3 parsed). 3 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/
log.do_build            log.do_listtasks.20111  run.do_build            run.do_listtasks.20111
log.do_build.20152      log.do_patch            run.do_build.20152      run.do_patch
log.do_listtasks        log.do_patch.20151      run.do_listtasks        run.do_patch.20151
log.do_listtasks.20001  log.task_order          run.do_listtasks.20001  
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/first-0.1-r1/temp/log.task_order 
do_listtasks (20001): log.do_listtasks.20001
do_listtasks (20111): log.do_listtasks.20111
do_patch (20151): log.do_patch.20151
do_build (20152): log.do_build.20152
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 

唤醒:如果你愿意,现在即令可构建一个 recipe,使用 confbuild class
和一个 append 文件,运行 patch、configure 和 build 任务。

8.3 include 文件

BitBake 有半点种指令引用文件:

  • include filename,这是同等种植而卜援,如果 filename 找不顶,不会见发
    error 产生;
  • require filename,如果 filename 没找到,会产生 error。

值得一提的是,include 和 require 都是于 BBPATH 中指定的目录查找
filename。

8.3.1 添加 local.conf 用于引用文件

BitBake 工程通常用 bitbake.conf 引用一个在 build 目录外之 local.conf
文件。local.conf
文件或者含有部分手上构建目标相关的超常规装置。典型的样例是 Yocto 的安装。

这里学 local.conf 的独立以,让 bitbake.conf require 引用
local.conf,添加以下内容到 meta-tutorial/conf/bitbake.conf:

require local.conf
include conf/might_exist.conf

只要此刻推行构建命令,BitBake 会产生类似以下的错误信息:

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake world
ERROR: Traceback (most recent call last):
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/cookerdata.py", line 175, in wrapped
    return func(fn, *args)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/cookerdata.py", line 185, in parse_config_file
    return bb.parse.handle(fn, data, include)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/__init__.py", line 107, in handle
    return h['handle'](fn, data, include)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py", line 148, in handle
    statements.eval(data)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/ast.py", line 39, in eval
    statement.eval(data)
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/ast.py", line 61, in eval
    bb.parse.ConfHandler.include(self.filename, s, self.lineno, data, "include required")
  File "/home/sunyongfeng/ops-build.test/yocto/poky/bitbake/lib/bb/parse/parse_py/ConfHandler.py", line 98, in include
    raise ParseError("Could not %(error_out)s file %(fn)s" % vars(), parentfn, lineno)
ParseError: ParseError at /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial/conf/bitbake.conf:53: Could not include required file local.conf

ERROR: Unable to parse conf/bitbake.conf: ParseError at /home/sunyongfeng/workshop/test/tutorial/build/../meta-tutorial/conf/bitbake.conf:53: Could not include required file local.conf

添加一个 local.conf 文件及 build 目录但解决这问题。注意 include
语句子包含的文本可有可无。

  1. 使用变量

而是定义变量并当 recipes 中采取,让 BitBake
具有老强的灵活性。可拿只是部署有行使变量的章程编写 recipe,这种 recipe
的用户可以叫有那些将出于 recipe 使用的变量值。一个独立的事例是被 recipe
传递额外的配备或者标志。通过是运用变量,不欲编制和更改
recipe,因为某些函数只需要有非同寻常的参数。

9.1 全局变量

全局变量可以通过使用者设置,recipe 可以动用。

9.1.1 定义全局变量

顷早已创办一个缺损的
local.conf,现在于斯文件加有变量。比如添加一行:

MYVAR="hello from MYVAR"

9.1.2 访问全局变量

得在 recipes 或 classes 中走访 MYVAR 变量。这里创办一个新的 recipes 组
recipes-vars,及一个 recipe myvar。
meta-two/recipes-vars/myvar/myvar_0.1.bb

DESCRIPTION = "Show access to global MYVAR"
PR = "r1"

do_build(){
  echo "myvar_sh: ${MYVAR}"                        (1)
}

python do_myvar_py () {
  print "myvar_py:" + d.getVar('MYVAR', True)      (2)
}

addtask myvar_py before do_build
  1. 每当类 bash 语法中访问变量;
  2. 通过全局数据存储访问变量。

今运作 bitbake myvar,检查 tmp
目录的出口,则可观看咱们的确访问了全局 MYVAR 变量。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake myvar
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 4 .bb files complete (0 cached, 4 parsed). 4 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/myvar-0.1-r1/temp/log.task_order 
do_myvar_py (4595): log.do_myvar_py.4595
do_build (4596): log.do_build.4596
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/myvar-0.1-r1/temp/log.do_myvar_py
DEBUG: Executing python function do_myvar_py
myvar_py:hello from MYVAR
DEBUG: Python function do_myvar_py finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/myvar-0.1-r1/temp/log.do_build
DEBUG: Executing shell function do_build
myvar_sh: hello from MYVAR
DEBUG: Shell function do_build finished

9.2 本地变量

首屈一指的 recipe 只含有有当地变量,这些变量用于其持续的 classes
中的函数设置。

先创建 meta-two/classes/varbuild.bbclass

varbuild_do_build () {
  echo "build with args: ${BUILDARGS}"
}

addtask build

EXPORT_FUNCTIONS do_build

然后在 meta-two/recipes-vars/varbuld/varbuild_0.1.bb 中使用:

DESCRIPTION = "Demonstrate variable usage \
  for setting up a class task"
PR = "r1"

BUILDARGS = "my build arguments"

inherit varbuild

运行 bitbake varbuild,输出的 log 显示 build 任务使用了 recipe
设置的变量值。

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ bitbake varbuild
Parsing recipes: 100% |################################################################################| Time: 00:00:00
Parsing of 5 .bb files complete (0 cached, 5 parsed). 5 targets, 0 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/varbuild-0.1-r1/temp/log.task_order 
do_build (4760): log.do_build.4760
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ cat tmp/work/varbuild-0.1-r1/temp/log.do_build
DEBUG: Executing shell function do_build
build with args: my build arguments
DEBUG: Shell function do_build finished
sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial/build$ 

当时是运用 BitBake的一流方式。通用 task 由 class
定义,比如下载源代码、configure、make 和任何操作,recipe 设置这些 task
所欲之变量。

  1. 附目录树

sunyongfeng@openswitch-OptiPlex-380:~/workshop/test/tutorial$ tree ./*
./build
├── bitbake.lock
├── conf
│   └── bblayers.conf
└── local.conf
./meta-tutorial
├── classes
│   ├── base.bbclass
│   └── mybuild.bbclass
├── conf
│   ├── bitbake.conf
│   └── layer.conf
└── recipes-tutorial
    ├── first
    │   └── first_0.1.bb
    └── second
        └── second_1.0.bb
./meta-two
├── classes
│   ├── confbuild.bbclass
│   └── varbuild.bbclass
├── conf
│   ├── bitbake.conf
│   └── layer.conf
├── recipes-base
│   ├── first
│   │   └── first_0.1.bbappend
│   └── third
│       └── third_01.bb
└── recipes-vars
    ├── myvar
    │   └── myvar_0.1.bb
    └── varbuild
        └── varbuild_0.1.bb

14 directories, 17 files
  1. 总结

上述是遵照学科的具有内容,感谢您一直视此,希望而欢喜。
读书完课,你应该本着 BitBake 的基本概念有中心了解。本学科涉及的情来:

  • BitBake 是一个尽 python 和 shell 脚本的发动机;
  • 科普的 BitBake 工程设计与部分默认文件的职位;
  • BitBake 以的 5 种文件类型(.bb,.bbclass,.bbappend,.conf 和
    include 文件);
  • BitBake 函数和 task,说明什么组织、分组和调用它们;
  • BitBake 变量及其核心使用办法 。

熟识这些情节后,希望你可以开采取类 Yocto 的工,并连续深入明。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图