YoctoBitBake入门之HelloWorld
Posted jiangwei0512
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YoctoBitBake入门之HelloWorld相关的知识,希望对你有一定的参考价值。
基础示例
创建一个新的目录OE,从https://gitee.com/mirrors/poky.git获取BitBake工具,将得到的bitbake目录放在OE目录下,可以查看版本:
jw@X1C:~/code/OE$ ./bitbake/bin/bitbake --version
BitBake Build Tool Core version 1.49.0
通过目录来调用bitbake工具不是很方便,所以将该目录增加到PATH变量中,将命令写到一个脚本中(init.sh):
#!/bin/bash
# Set the bitbake bin path.
PWD=`pwd`
export PATH=$PWD/bitbake/bin:$PATH
之后执行source命令,这样执行bitbake的时候就不需要加上目录了:
jw@X1C:~/code/OE$ source init.sh
jw@X1C:~/code/OE$ bitbake --version
BitBake Build Tool Core version 1.49.0
环境准备好之后,接下去使用一个HelloWorld的示例来执行BitBake配方,从而打印HelloWorld。
首先创建新的目录:
jw@X1C:~/code/OE$ mkdir hello
jw@X1C:~/code/OE$ cd hello
先不管其它,在这个目录下执行bitbake看看结果:
jw@X1C:~/code/OE/hello$ bitbake
ERROR: Unable to find conf/bblayers.conf or conf/bitbake.conf. BBPATH is unset and/or not in a build directory?
这里提示没有conf/bitbake.conf,我们需要在该目录下创建该文件,bitbake命令在执行的开头就会去读取这个文件,而BBPATH是这个文件所在的位置。所以我们还应该在init.sh中设置BBPATH变量,它的值就是前面创建的hello目录,所以init.sh变成如下的样子:
#!/bin/bash
# Set the bitbake bin path.
PWD=`pwd`
export PATH=$PWD/bitbake/bin:$PATH
export BBPATH=$PWD/hello
设置了BBPATH之后,还需要在hello目录下创建bitbake.conf,它在hello/conf目录中,内容如下:
PN = "${@bb.parse.BBHandler.vars_from_file(d.getVar('FILE', False),d)[0] or 'defaultpkgname'}"
TMPDIR = "${TOPDIR}/tmp"
CACHE = "${TMPDIR}/cache"
STAMP = "${TMPDIR}/${PN}/stamps"
T = "${TMPDIR}/${PN}/work"
B = "${TMPDIR}/${PN}"
现在hello目录下的内容如下:
jw@X1C:~/code/OE/hello$ tree
.
└── conf
└── bitbake.conf
1 directory, 1 file
之后再执行bitbake命令:
jw@X1C:~/code/OE/hello$ bitbake
ERROR: ParseError in configuration INHERITs: Could not inherit file classes/base.bbclass
可以看到错误发生了变化,这次缺少的是base.bbclass文件,BitBake使用class文件来提供基本的代码和功能,最基础的就是base.bbclass文件,这里在hello目录下创建classes目录,并在其中增加base.bbclass文件,内容如下:
addtask build
之后再执行bitbake命令,得到的结果如下:
jw@X1C:~/code/OE/hello$ bitbake
Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.
这个时候bitbake本身已经正常工作了,只是因为没有可以做的事情,所以什么也没有发生。
之后要做的是增加Layer和HelloWorld配方,当然这里我们需要的是配方,之所以还要创建Layer,只是因为这是符合Yocto要求的一种做法。
这里在OE下创建Layer,名字是meta-mylayer,然后在里面创建conf目录,并在目录中增加layer.conf,内容如下:
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/*.bb"
BBFILE_COLLECTIONS += "meta-mylayer"
BBFILE_PATTERN_meta-mylayer := "^${LAYERDIR_RE}/"
以上内容是给Layer准备的,之后才是配方,名称是printhello.bb:
DESCRIPTION = "Prints Hello World"
PN = 'printhello'
PV = '1'
python do_build() {
bb.plain("********************");
bb.plain("* *");
bb.plain("* Hello, World! *");
bb.plain("* *");
bb.plain("********************");
}
之后再进入到hello目录,执行bitbake命令:
jw@X1C:~/code/OE/hello$ bitbake printhello
ERROR: no recipe files to build, check your BBPATH and BBFILES?
Loading cache: 100% | | ETA: --:--:--
Loaded 0 entries from dependency cache.
Summary: There was 1 ERROR message shown, returning a non-zero exit code.
这里的bitbake之后增加了配方的名称,但是该配方并没有执行,这需要将配方对应的Layer添加到全局配置文件hello/conf/bblayers.conf中,它的内容如下:
BBLAYERS ?= " \\
/home/jw/code/OE/meta-mylayer \\
"
注意这里需要使用全局的路径。
之后再执行bitbake printhello,结果如下:
jw@X1C:~/code/OE/hello$ bitbake printhello
WARNING: Layer meta-mylayer should set LAYERSERIES_COMPAT_meta-mylayer in its conf/layer.conf file to list the core layer names it is compatible with.
Loading cache: 100% |############################################| Time: 0:00:00
Loaded 1 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |#######################################| Time: 0:00:00
NOTE: No setscene tasks
NOTE: Executing Tasks
********************
* *
* Hello, World! *
* *
********************
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.
Summary: There was 1 WARNING message shown.
bitbake执行成功。
以上是关于YoctoBitBake入门之HelloWorld的主要内容,如果未能解决你的问题,请参考以下文章