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
给我点个赞呗!