物联网开发套件中Yocto软件版本的一些提示——样例:添加Java JRE

近来一些人问我要更多Yocto软件版本的文档。尤其是一位在将Java添加到自己的物联网Yocto软件版本时遇到困难的创客。与他的对话引发了下面的帖子:

为什么你不需要自己的Yocto软件版本

首先:通常情况下使用物联网开发套件时你不必接触Yocto软件版本。开发套件提供了一个事先编译好的SD卡启动镜像放入你的英特尔(R) Galileo开发板。然后你就可以着手开发了。另外还存在一个软件包集合,你能够从中安装更多的软件包到你的镜像,譬如在添加了下面几行代码:


	# cat >> /etc/opkg/iotdk.conf <<EOF

	src/gz all http://iotdk.intel.com/ipk/all

	src/gz i586 http://iotdk.intel.com/ipk/i586

	src/gz clanton http://iotdk.intel.com/ipk/clanton

	EOF

	

到你的/etc/opkg/iotdk.conf文件,就如http://software.intel.com/sites/default/files/managed/f1/49/building_yocto_and__ipks.pdf (“IOTDL软件版本使用软件包集合”部分)描述的那样,你可以使用 opkg从软件包集合中添加更多的软件包如下:


	# opkg install <package name>

	

你可以使用下面的代码获取软件包列表:


	# opkg list

	

此外在http://software.intel.com/en-us/iotdevkit上有一个镜像包含了编译你自己的Galileo目标机代码的所有步骤。

如何自己制作Yocto软件版本

然而,可能会有之前提到的方法无法完全满足你的需求的情况,你可能想要定制镜像或者简单地编译自己的ipk软件包……

这时你可能想要亲自制作Yocto软件版本。对于Yocto初学者,我想推荐Yocto项目的在线文档(目前是http://www.yoctoproject.org/docs/1.5.1/dev-manual/dev-manual.html)。这里不是教Yocto概念的地方。不过我想尝试做到的是分享一些提示来帮助你开始。

初始化Yocto软件版本

如果想要制作一个镜像,你至少应该有40 GB的可用磁盘空间。你需要安装多种譬如git的开发工具来开始使用Yocto。要着手intel-iot-devkit,访问http://git.yoctoproject.org/cgit/cgit.cgi/meta-intel-iot-devkit/能够让你为一个git复制找到git细节。在我的系统里Yocto软件版本从下面启动:

 YBR = /Quark/meta-intel-iot-devkit/ 
 
 

注意:

除了master之外还有其它的分支。

你可以按照下面的步骤来制作镜像:

  1. 检查${YBR}/build/conf/local.conf配置。你可能需要修改并行软件版本的设置。
  2. 通过sourcing
     source ${YBR}/iot-devkit-init-build-env 
    设置Yocto软件版本环境。
  3. 这将直接将你的pwd变为${YBR}/build。你现在可以使用bitbake开始创建,譬如
     bitbake iot-devkit 
  4. 现在休息一下(或者喝杯咖啡)——如果没有问题你会在${YBR}/build/tmp/deploy/images找到准备好的镜像,而ipk软件包在${YBR}/build/tmp/deploy/ipk。取决于你的工作系统,这个过程可能用时几个小时。

 

检查可用的分层

Yocto使用多种所谓分层来组织软件包。你能够从下面找到多种分层:http://layers.openembedded.org/layerindex/branch/master/layers/

在我们的例子中你能够找到一个meta-oracle-java层作为我们即将编译的Java软件包的好起点。我们将按照下面的步骤使用并修改这个分层。如何写你自己的分层,请查看Yocto手册。

  1. git复制分层到${YBR}。
  2. 添加分层到${YBR}/build/conf/bblayers.conf中的BBLAYERS变量。 
  3. 因为Oracle Java拥有专利许可,你需要通过添加LICENSE_FLAGS_WHITELIST += "oracle_java"将${YBR}/build/conf/local.conf中的许可列入白名单。 
  4. 不幸的是meta-oracle-java层看起来稍微有点过时——特别是JRE的直接下载链接不再有效。看上去你需要在从Oracle下载JRE之前接受一个软件许可。因此我下载了tgz并将其放在一个本地文件夹内。很显然需要相应地修改meta-oracle-java/recipes-devtools/oracle-java/oracle-jse-jre-i586_1.7.0.bb中的URI入口(在我的例子中SRC_URI = "file:///Quark/meta-intel-iot-devkit/meta-oracle-java/jre-7u51-linux-i586.tgz")。同时也需要相应地修改md5 checksums和meta-oracle-java/recipes-devtools/oracle-java/oracle-jse.inc中的LIC_FILES_CHKSUM许可。最简单的是先不做任何修改,随后bitbake程序将打印一条包含正确的新hashs的错误信息。

之后你应该看到类似下面的情形:


	$ bitbake-layers show-layers

	layer                 path                                      priority

	==========================================================================

	meta                  /Quark/meta-intel-iot-devkit/meta         5

	meta-oe               /Quark/meta-intel-iot-devkit/meta-oe      6

	meta-iot-devkit       /Quark/meta-intel-iot-devkit/meta-iot-devkit  6

	meta-yocto            /Quark/meta-intel-iot-devkit/meta-yocto   5

	meta-intel            /Quark/meta-intel-iot-devkit/meta-intel   5

	meta-clanton-bsp      /Quark/meta-intel-iot-devkit/meta-clanton-bsp  6

	meta-galileo          /Quark/meta-intel-iot-devkit/meta-galileo  9

	meta-hob              /Quark/meta-intel-iot-devkit/meta-hob     1

	meta-oracle-java      /Quark/meta-intel-iot-devkit/meta-oracle-java  6

	

你应该可以继续。

 $ ${YBR}/bitbake oracle-jse-jre-i586 

成功后你将能从${YBR}/build/tmp/deploy/ipk中找到新的软件包。你能够将这个软件包拷贝到你的系统中并用opkg进行安装。

安装成功后我们现在可以在目标机上运行Java——在这里使用Java类强制起点:


	# /usr/jre1.7.0_51/bin/java hello      

	Hello World