yocto-第47篇-bb文件中如何获取源码或指定本地目录

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

bb文件中如何添加源码路径或者远程下载

本篇稍稍讲解下如何在bb文件中添加源码,包括本地源码的路径和通过http或git等方式获取网络开源的源码等。

bitbake在获取源代码或文件时需要几个步骤, fetch任务按顺序处理两个不同的过程:从某处(缓存的或其他方式)获取文件,然后以特定的方式将这些文件解包(unpacking)到特定的位置。Getting和Unpacking文件后,通常可以按需打补丁文件。

添加本地源码目录

使用EXTERNALSRC变量

现在假设一种情况,在我的poky(开源理解成自己yocto项目的根目录)目录之外有一个项目的源码,请先回顾下 yocto-第7篇-开发工具devtool实操(helloyocto) 文章,摘取bb文件中声明该helloyocto源码的内容:

build]$ cat workspace/appends/helloyocto.bbappend 
inherit externalsrc
EXTERNALSRC = "/home/peeta/code/helloyocto"
  • 1
  • 2
  • 3

这个很显然一个绝对路径,会导致其他用户或更换其他机器无法获取或访问到该项目。
这里我们可以这样做,将项目源码和bb文件都放到meta-mylayer目录下,参考步骤如下:

poky]$ mkdir -p meta-mylayer/recipes-myapps/helloyocto/
poky]$ cp -rf /home/peeta/code/helloyocto/ meta-mylayer/recipes-myapps/helloyocto/  #源码放到这个目录下
poky]$ cp build/workspace/recipes/helloyocto/helloyocto.bb meta-mylayer/recipes-myapps/helloyocto/ #复制bb文件到该目录下
  • 1
  • 2
  • 3

同时修改bb文件,最终bb文件内容如下:

poky]$ cat meta-mylayer/recipes-myapps/helloyocto/helloyocto.bb    
# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)

# Unable to find any files that looked like license statements. Check the accompanying
# documentation and source headers and set LICENSE and LIC_FILES_CHKSUM accordingly.
#
# NOTE: LICENSE is being set to "CLOSED" to allow you to at least start building - if
# this is not accurate with respect to the licensing of the software being built (it
# will not be in most cases) you must specify the correct value before using this
# recipe for anything other than initial testing/development!
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

# No information for SRC_URI yet (only an external source tree was specified)
SRC_URI = ""

inherit externalsrc
EXTERNALSRC = "${THISDIR}/helloyocto"

inherit cmake


# Specify any options you want to pass to cmake using EXTRA_OECMAKE:
EXTRA_OECMAKE = ""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这里用到了一个关键变量 THISDIR ,表示bb文件所在的当前路径,这里对应的路径就是

THISDIR=/home/peeta/poky/meta-mylayer/recipes-myapps/helloyocto/
  • 1

因此, EXTERNALSRC 变量对应的路径就是

EXTERNALSRC = "/home/peeta/poky/meta-mylayer/recipes-myapps/helloyocto/helloyocto"
  • 1

同时删除原先workspace目录下的helloyocto相关的bb文件

poky]$ rm build/workspace/appends/helloyocto.bbappend 
poky]$ rm build/workspace/recipes/helloyocto/ -rf
  • 1
  • 2

完整的目录结构如下,如果有不清楚的或者想知道文件内容的,可以在评论里告诉我~

poky]$ cd meta-mylayer/recipes-myapps/
recipes-myapps]$ tree
.
└── helloyocto
    ├── helloyocto
    │   ├── CMakeLists.txt
    │   └── main.c
    └── helloyocto.bb

2 directories, 3 files
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

编译验证

poky]$ source oe-init-build-env 
build]$ bitbake helloyocto
NOTE: helloyocto: compiling from external source tree /home/peeta/poky/meta-mylayer/recipes-myapps/helloyocto/helloyocto
NOTE: Tasks Summary: Attempted 576 tasks of which 566 didn't need to be rerun and all succeeded.
...

poky]$ bitbake -e helloyocto | grep EXTERNALSRC=
EXTERNALSRC="/home/peeta/poky/meta-mylayer/recipes-myapps/helloyocto/helloyocto"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这样一来只需要同步meta-mylayer这个总目录就可以在任意地方运行了。

workspace目录属于yocto的一部分

还有一种情况就是workspace目录也是属于自己yocto的一部分时,借鉴如下:

poky]$ vim build/conf/bblayers.conf
export WORKSPACE := "${@os.path.abspath(os.path.join(os.path.dirname(d.getVar('FILE', True)),'../../..'))}"
  • 1
  • 2

上面的语句声明了WORKSPACE的路径在poky之外。
参考一个项目的bb文件:

poky]$ cat meta-mylayer/recipes-myapps/xxx/xxx_1.0.bb
FILESPATH =+ "${WORKSPACE}/somedir/:"
SRC_URI = "file://xxx/"

SRC_DIR = "${WORKSPACE}/somedir/xxx"
S = "${WORKDIR}/xxx"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此时,该bb文件没有继承 externalsrc 所以通过指定一些变量的路径来引用项目源码。但是不推荐这种用法。

获取网络源码包

git方式获取

请回顾下 yocto-第8篇-开发工具devtool实操(添加git项目learnyocto) ,在这个例子中learnyocto是一个在gitee服务器上的git项目,在bb文件中是通过如下声明来拉取代码的:

recipes-learnyocto]$ cat learnyocto/learnyocto_git.bb 
SRC_URI = "git://gitee.com/fulinux/learnyocto.git;protocol=https;branch=master \
           file://0001-learn-the-CFLAGS-variable-in-recipe.patch \
           "
  • 1
  • 2
  • 3
  • 4

SRC_URI变量,告知fetch任务使用git来获取代码,因为git可以通过ssh协议,也可以通过https等协议获取,这里通过protocol告知git工具用https方式获取。branch告知获取后切换到那个分支。file接的是另外的文件,通常是一个补丁。

对于有些git项目是多个git子项目一同构成的,就是我们理解的Git Submodule。可以使用这个协议 gitsm:// ,至于怎么用可以去meta*中查找相关的例子,这里就不赘述了~

downlaod目录

毕竟是网络下载的,难免因为网络原因下载速度很慢,总不能每次用的时候就下载吧,因此通过DL_DIR变量来指定下载换成的路径。通常 DL_DIR 在local.conf文件中声明:

poky]$ cat build/conf/local.conf
DL_DIR ?= "${TOPDIR}/downloads"
  • 1
  • 2

默认就是build/downloads/目录。
上面的git项目learnyocto项目下载下来后会在下面的目录下备份:

build]$ ls downloads/git2/gitee.com.fulinux.learnyocto.git*
downloads/git2/gitee.com.fulinux.learnyocto.git.done

downloads/git2/gitee.com.fulinux.learnyocto.git:
branches  config  description  HEAD  hooks  info  objects  packed-refs  refs
  • 1
  • 2
  • 3
  • 4
  • 5

可见git项目源码仓库都在build/downloads/git2目录下,而且也会创建一个“xxxx.git.done”文件。

wget方式获取源码包

根据SRC_URI值的区别,知道是用git还是wget获取源码,wget可以获取 http://, ftp://, https:// 协议的源码。
还有直接下载软件包的方式获取代码,比如下面的例子:

SRC_URI = "http://example.com/foobar.tar.bz2 \
		   http://example.com/abc.tar.bz2"
  • 1
  • 2

通常为了确保压缩包是我们需要的,还会带上文件MD5或者SHA-256值校验。比如上面的:

SRC_URI = "http://example.com/foobar.tar.bz2;md5sum=4a8e0f237e961fd7785d19d07fdb994d \
		   http://example.com/abc.tar.bz2;md5sum=131h42hjg37e961fd7785d19d07f432f"
  • 1
  • 2

当然如果SRC_URI接了多个下载链接文件。校验值也可以这样:

SRC_URI = "http://example.com/foobar.tar.bz2;name=foo"
SRC_URI += "http://example.com/abc.tar.bz2;name=abc"
SRC_URI[foo.md5sum] = 4a8e0f237e961fd7785d19d07fdb994d
SRC_URI[abc.md5sum] = 131h42hjg37e961fd7785d19d07f432f
  • 1
  • 2
  • 3
  • 4

当一个文件已经下载完成并且校验成功后,一个.done文件将在DL_DIR中被创建,下次bitbake就会使用该文件,来避免重复下载和校验。

还有其他一些fetch方式

还有很多其他的方式,例如 cvs:// svn:// repo:// ,居然还有P4的 p4:// 。这些我都还没有用过,不做演示了。
对于以下情况,也存在Fetch子模块:

  • Bazaar (bzr://)
  • Mercurial (hg://)
  • npm (npm://)
  • OSC (osc://)
  • Secure
  • FTP (sftp://)
  • Secure Shell (ssh://)
  • Trees using Git Annex(gitannex://)

解压缩包过程

解压(Unpacking)过程通常在下载之后立即进行。对于除Git之外的所有url, BitBake会使用通用的解包方法。支持的压缩包文件格式有: “.Z”, “.z”, “.gz”, “.xz”, “.zip”, “.jar”, “.ipk”, “.rpm”. “.srpm”, “.deb” 和 “.bz2”
下面这个:

SRC_URI = "http://example.com/foobar.tar.bz2;unpack=1"
  • 1

告知bitbake不用解压软包。

FILESEXTRAPATHS变量

还有一种将代码放在recipe里面的
该变量用来扩展构建系统在处理recipe和append文件时查找文件和补丁时使用的搜索路径。bitbake在处理recipe时默认使用的目录最初由FILESPATH变量定义。您可以通过使用FILESEXTRAPATHS变量来扩展搜索路径。
参考meta-mylayer/recipes-devtools/mkbootimg目录下内容

mkbootimg]$ ls
mkbootimg  mkbootimg-native_git.bb
mkbootimg]$ cat mkbootimg-native_git.bb
#省略部分内容
FILESEXTRAPATHS_prepend := "${THISDIR}/:"
SRC_DIR = "mkbootimg"

SRC_URI = "file://mkbootimg/"
S = "${WORKDIR}/mkbootimg"
... #省略部分内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

顶着颈椎疼痛写博客,你不给我点个赞嘛0.0
给我点个赞呗! 在这里插入图片描述