简单翻译。不是一字一句完全翻译。。也不知道有没有翻译错误。如果有请指出。我也是菜鸟
http://www.yoctoproject.org/docs/2.1/bitbake-user-manual/bitbake-user-manual.html
1.1 介绍
bitbake是一个任务执行引擎。并行高效地运行shell脚本和Python任务。处理一些复杂的依赖任务。和make有些相似。但是也有些不同
主要的不同体现在:
bitbake是根据构成这个任务的元数据(metadata)来执行任务的。元数据主要保存在recipe(.bb)文件,append(.append)文件 配置文件(.conf) 以及包含文件(.inc) 和类(.class)文件中。元数据提供了哪些任务需要运行,以及这些任务之间的依赖关系。
bitbake包含一个文件获取的工具用于从不同的地方获取源码。比如从源码控制系统SVN GIT,或者从网站上获取。
每一个需要被构建的结构单元由菜谱文件来描述。菜谱包含了这个单元的所有信息,比如依赖库,源码位置,校验和,描述等等
bitbake包含抽象的客户端和服务端。能够从命令行或者基于XML的远程服务执行。而且有很多不同的用户接口(这里不知道具体有什么用)
1.2 历史和目标
巴拉巴拉 bitbake很牛逼。很多人都在用。包括openembedded yocto
1.3概念
bitbake是python写的。最高一层。bitbake解释元数据。决定要运行哪些任务。然后执行这些任务。和GNU Make差不多。bitbake控制软件的构建。只是Make用makefile,而bitbake用recipe。bitbake继承了很多简单工具比如make的的特性。所以能够运行更加复杂的任务。
1.3.1 菜谱
recipes用.bb扩展结尾,是最常见的基本元数据。提供了下列信息
×关于这个包的描述。比如作者,主页,license和其他的。
×菜谱的版本
×存在的一些依赖。包括运行时依赖和构建时依赖
×包的源码在哪里。如何得到这个源码
×这个包是否需要打补丁。从哪里获取补丁。如何应用这些补丁
×如何配置(./configure)和编译这些源码
×这些包应该安装在目标机器的什么位置。
在bitbake的上下文或者任何使用bitbake作为构建工具的工程中。.bb扩展结尾的文件都是菜谱
1.3.2配置文件
配置文件以.conf扩展结尾。定义了管理build过程的许多变量。配置文件存在于很多地方。比如机器配置选项。发行版配置选项,编译选项,通用选项,用户配置选项
主要是的配置文件是bitbake.conf。在bitbake源码conf目录中
1.3.3 类
类文件主要是.bbclass扩展。元数据之间用于共享一些信息的时候是非常有用的。。当前bitbake源码树里面包含了一个base.bbclass元数据。可以在classes目录找到。这个base.bbclass是很特殊的。所所有的菜谱和classes总是会自动包含这个bbclass.这个类包含了一些标准的基本操作。比如获取源码,解压 ,配置(默认为空),编译(默认为空) 安装(默认为空)和打包(默认为空)。这些基本操作常常继承子类覆盖是实际地实现这些功能。
1.3.4层
层可以让不同类型的定制选项相互之间独立,
当你构建一个单独项目的时候,总是觉得把所有的东西都放在一个层里面的比较好。实际上元数据的组织如果模块化得比较好,将来改动的时候会就越简单。
为了展示如何用分层来模块化所有的事情。假设针对你的指定的目标机器来做定制。那么这些定制的东西通常处在一个特殊的层里面。而不是一个通用的层。
(比如,上层的一些app是通用的例如SSH FTP这些可以放在通用层里面。因为这些放在所有的板子上都能跑,但是底层的一些东西就要独立做一个层。比如我的板子A有wifi。板子B没有。这些独立的就放到特殊的层里面,根据不同的机器来做),通常这个特殊的层叫做BSP (主板支持包)。除此之外。这些机器相关的特性的东西也必须和支持GUI环境的元数据以及菜谱独立开来。比如现在有一些层,一个是机器的BSP层,另外一个是GUI环境,即使不去修改GUI层本身。BSP这一层也可以通过指定.bbappend来做制作一些主板相关的需要GUI的菜谱(也许意思是。GUI层是完全独立的一个层,和主板无关,但是如果主板BSP这一层,需要制作一些GUI相关的菜谱,可以通过.bbappend来实现。)。
1.3.5附加文件 append files
附加文件。是.bbappend结尾的继承或者覆盖菜谱的一些信息。
bitbake期望每个bbapend文件都有一个bb菜谱文件和他相对应。除此之外append文件应该和bb文件一样 有相同的根文件名,文件名只通过后缀来区分。
比如 formfactos_0.0.bb 和 formfactos_0.0.bbappend
bbappend文件里面的信息主要是继承或者覆盖原来的bb文件里面一些相似的信息。
你可以在bbappend里面用%来匹配菜单名。
比如busybox_1.21.%.bbappend
那么这个bbappend就会匹配任何busybox.1.21.x.bb文件。例如 busybox.1.21.1.bb busybox.1.21.2.bb busybox.1.21.3.bb.这些。但是不会匹配busybox.1.30.0.bb
,但是如果你命名为busybox_1.%.bbappend 那么就会匹配了。
通常情况下就指定 busybox_%.bbappend 来支持所有的版本
1.4
获取bitbake
git clone git://git.openembedded.org/bitbake或者任何其他方式。这里就不讲了
1.5 bitbake命令
bitbake使用 以及表达式
使用bitbake -h 打印usage
bitbake -h
bitbake [options] [recipename/target recipe:do_task ...]
后续用到再回来解释吧。Options: --version show program's version number and exit -h, --help show this help message and exit -b BUILDFILE, --buildfile=BUILDFILE Execute tasks from a specific .bb recipe directly. WARNING: Does not handle any dependencies from other recipes.-b 直接从指定的bb菜谱执行任务。并不处理来自于其他菜谱的依赖关系-k, --continue Continue as much as possible after an error. While the target that failed and anything depending on it cannot be built, as much as possible will be built before stopping.-k 出现错误以后,尽可能多地执行任务。直到停止。也就是出现错误并不马上停止。如果还可以继续执行。那么就继续执行 -a, --tryaltconfigs Continue with builds by trying to use alternative providers where possible.-a尽可能的使用可选的提供者来完成构建的任务 -f, --force Force the specified targets/task to run (invalidating any existing stamp file).-f 强制指定任务运行. 将任何已经存在的标记文件视为无效。 -c CMD, --cmd=CMD Specify the task to execute. The exact options available depend on the metadata. Some examples might be 'compile' or 'populate_sysroot' or 'listtasks' may give a list of the tasks available.-c 指定需要对于这个菜谱执行的任务.比如compile 或者listtask或者clean -C INVALIDATE_STAMP, --clear-stamp=INVALIDATE_STAMP Invalidate the stamp for the specified task such as 'compile' and then run the default task for the specified target(s).-C 使得任务指定的标记文件徐晓。然后与运行默认的任务。(有些东西是有缓存的。比如已经编译过了。没有任何修改就不再重新编译,这个就是无论如何都重编译) -r PREFILE, --read=PREFILE Read the specified file before bitbake.conf.-r 在读取bitbake.conf之前读取指定的文件 -R POSTFILE, --postread=POSTFILE-R 在读取bitbake.conf之后读取指定的文件 Read the specified file after bitbake.conf.
-v, --verbose Output more log message data to the terminal.-v 输出日志信息 -D, --debug Increase the debug level. You can specify this more than once.-D 增加调试级别。可以指定N次。来增加N次调试级别-n, --dry-run Don't execute, just go through the motions.-n 不执行。只是尝试走通一下流程 -S SIGNATURE_HANDLER, --dump-signatures=SIGNATURE_HANDLER Dump out the signature construction information, with no task execution. The SIGNATURE_HANDLER parameter is passed to the handler. Two common values are none and printdiff but the handler may define more/less. none means only dump the signature, printdiff means compare the dumped signature with the cached one. -p, --parse-only Quit after parsing the BB recipes.-p 只解析bb文件。 -s, --show-versions Show current and preferred versions of all recipes. -e, --environment Show the global or per-recipe environment complete with information about where variables were set/changed. -g, --graphviz Save dependency tree information for the specified targets in the dot syntax.-g 产生依赖的dot图 -I EXTRA_ASSUME_PROVIDED, --ignore-deps=EXTRA_ASSUME_PROVIDED Assume these dependencies don't exist and are already provided (equivalent to ASSUME_PROVIDED). Useful to make dependency graphs more appealing-I 指定某个依赖不存在。但是已经早就提供了。-l DEBUG_DOMAINS, --log-domains=DEBUG_DOMAINS Show debug logging for the specified logging domains -P, --profile Profile the command and save reports. -u UI, --ui=UI The user interface to use (depexp, goggle, hob, knotty or ncurses - default knotty). -t SERVERTYPE, --servertype=SERVERTYPE Choose which server type to use (process or xmlrpc - default process). --token=XMLRPCTOKEN Specify the connection token to be used when connecting to a remote server. --revisions-changed Set the exit code depending on whether upstream floating revisions have changed or not. --server-only Run bitbake without a UI, only starting a server (cooker) process. -B BIND, --bind=BIND The name/address for the bitbake server to bind to. --no-setscene Do not run any setscene tasks. sstate will be ignored and everything needed, built. --remote-server=REMOTE_SERVER Connect to the specified server. -m, --kill-server Terminate the remote server. --observe-only Connect to a server as an observing-only client. --status-only Check the status of the remote bitbake server. -w WRITEEVENTLOG, --write-log=WRITEEVENTLOG Writes the event log of the build to a bitbake event json file. Use '' (empty string) to assign the name automatically.
1.5.2 例子
本章举例说明了如何使用bitbake
1.5.2.1
执行一个单一的任务很简单。在后面加任务名即可。如果不指定。bitbake执行默认的任务 也就是builld。
bitbake -b foo_1.0.bb 不处理任何依赖。执行foo_1.0.bb的构建任务
bitbake -b foo_1.0.bb -c clean 对于这个菜谱执行清理任务
-b明确指定了不要处理任何依赖。如果不是用于调试目的。建议使用1.5.2.2的表达式
1.5.2.2 执行一系列菜谱任务的集合
如果你想管理很多个bb菜谱。必须要告诉bitbake那些文件是可以是哟娜的。那些任务是你需要执行的。每个菜谱也描述表达他需要的依赖库,包括运行时和构建时。也必须描述相同或者类似功能能菜谱的优先级,或者菜谱有多个不同版本的时候也需要描述优先级。比如glibc和musl都是标准C函数库,那么也要指定优先级别。或者glibc1.0 glibc2.0也要指定优先级别。
bitbake命令如果不是用--buildfile或者-b。 只能接受PROVIDES。而不能提供任何东西。默认情况下一个菜谱文件通过bitbake foo来产生PROVIDES
bitbake -c clean foo提供了 foo包并且执行了do_clean任务。
1.5.2.3 产生依赖图
bitbake通过dot表达式产生依赖图。可以通过dot工具生成image
当你产生依赖图的时候。bitbake在当前的working目录产生四个文件。
package-depends.dot 显示了bitbake所知道的这个目标运行时的依赖
pn-depends.dot 显示了构建目标时的依赖。
task-depends.dot 显示了任务之间的依赖
pn-buildlis 显示了这个构建这个任务的一系列清单
通过-I指定不去依赖某些通用的依赖。去掉这些信息可以让依赖度可读性更高。不太多。
比如bitbake -g foo 产生了foo的依赖图。所有的都包含了。
bitbake -g -I virtual/kernel -I eglibc foo 去掉了virtual/kernel eglibc 的foo的依赖图
产生的dot文件可以用graphviz的dot工具变成img文件。
使用命令如下。sudo apt-get install graphviz
dot -Tpng xxxx.dot >out.png
但是依赖关系图一般都非常大。这个out.png可能会非常非常大。所以使用-I命令去掉一些通用的基础依赖可以有更好地可读性
待续待续