通过openeuler_fetch使用openEuler软件包¶
特性介绍¶
openeuler_fetch是匹配openEuler Embedded构建镜像时按需从上游源码包自动下载软件包的功能函数,该功能省去了在构建openeuler-image镜像时需要提前下载所有软件包的步骤,因为openEuler Embedded由上百个软件包构成,完全下载耗时耗力,例如,如果你只想编译busybox这一个软件包,你其实是不需要将其他软件包全部下载,你关注的只是构建busybox的依赖软件包下载即可,而openeuler_fetch即可实现按需下载,你只需要初始化完环境即可进入编译环节。
openeuler_fetch运行机制¶
openeuler_fetch在classes/openeuler.bbclass中实现,函数名为do_openeuler_fetch,该函数在base_do_fetch_prepend中通过bb.build.exec_func()函数调用,即openeuler_fetch运行完还会继续执行do_fetch,这样做的原因是不管openeuler_fetch运行成功与否都可以让fetch继续补充,例如有一款软件包在gitee中不存在,或在配置中配置错误,或者源码目录有相关的改动导致openeuler_fetch运行失败,则do_fetch可以继续完成文件的查找。
openeuler_fetch运行逻辑¶
openeuler_fetch通过以下相关控制变量来完成相关包下载:
OPENEULER_GIT_URL: 远程仓库前缀,默认为https://gitee.com/src-openeuler,该值在.oebuild/local.conf.sample中设置,全局生效,也可以在bb或bbappend文件中设置使之局部生效
OPENEULER_BRANCH: 软件包分支,在下载软件包时会通过该值指定分支名称,该值在.oebuild/local.conf.sample中设置,全局生效,也可以在bb或bbappend文件中设置使之局部生效
OPENEULER_REPO_NAME: 软件包名,该名一般和构建包名一致,但在特殊情况下需要改动,例如构建libtool-cross时,构建包名为libtool-cross,因此默认OPENEULER_REPO_NAME为libtool-cross,但是依赖包路径是libtool,则需要将OPENEULER_REPO_NAME改为libtool
OPENEULER_LOCAL_NAME: 软件包本地名称,即软件包在本地路径名称,一般该变量如果不设置则在系统处理时默认和OPENEULER_REPO_NAME一样,该变量意在解决软件包名和本地存储路径不一致问题
OPENEULER_SRC_URI_REMOVE: SRC_URI过滤变量,设置该变量可以在bitbake执行fetch之前移除设定的相关uri文件路径,该变量匹配规则时前缀匹配,例如设定OPENEULER_SRC_URI_REMOVE=”https git”,则openeuler_fetch在处理时遇到以https和git开头的uri则会去除
整体openeuler_fetch下载就是依靠以上相关变量完成,由以上变量最终组成git下载参数:
remote: 默认为https://gitee.com/src-openeuler/xxx,由OPENEULER_GIT_URL/OPENEULER_REPO_NAME组成
branch: 默认为OPENEULER_BRANCH
依据remote和branch,openeuler_fetch完成下载
- openeuler_fetch 运行原理图如下:
- repo_init 运行原理图如下:
如何适配其他软件包¶
在构建openEuler Embedded时经常会引入其他相关包或修改非指定包版本,那么此时该如何做呢?从上文中已经得知openeuler_fetch依赖5个变量来进行下载,内核是例外,因此我们只需要关注其他五个变量即可,接下来我们以busybox为例进行讲解:
如果想要某一个版本的busybox参与构建:在busybox的bbappend文件中设定OPENEULER_BRANCH值为相关版本即可
如果想要使用自有仓库busybox参与构建:在busybox的bbappend文件中设定OPENEULER_GIT_URL为自有空间即可,注意:如果busybox已经下载在本地,则需要手动删除,然后再执行构建
如果需要其他代码仓的busybox参与构建,则修改OPENEULER_GIT_URL为其他平台仓域名即可,例如https://github.com/xxx
另外,当构建busybox时需要的依赖并不会是某一款特定包,即不能直接通过depends添加依赖,而仅仅是需要某个路径下的文件,此时需要在bbappend中添加do_fetch_prepend,在该函数中添加需要依赖的包,例如:
python do_fetch_prepend() {
repoList = [{
"repo_name": "yocto-embedded-tools",
"git_url": "https://gitee.com/openeuler",
"branch": "master"
},{
"repo_name": "libboundscheck",
"git_url": "https://gitee.com/openeuler",
"branch": "openEuler-22.09"
},{
"repo_name": "dsoftbus_standard",
"git_url": "https://gitee.com/openeuler",
"branch": "v3.1"
},{
"repo_name": "embedded-ipc",
"git_url": "https://gitee.com/openeuler",
"branch": "master"
}]
d.setVar("PKG_REPO_LIST", repoList)
dd.build.exec_func("do_openeuler_fetchs", d)
}
通过repoList设置好需要依赖的包,包结构格式不可更改,PKG_REPO_LIST变量的设定是为在do_openeuler_fetchs中获取依赖的包列表,do_openeuler_fetchs将依次解析PKG_REPO_LIST,并调用do_openeuler_fetch完成相关包的下载。
如果想要下载的busybox包在本地用其他路径,比如busyboyy,则在busybox的bb文件或bbappend文件设定OPENEULER_LOCAL_NAME=”busyboyy”,则在clone busybox时本地路径会变成busyboyy,注意,如果本地已经有busybox,但是依然设置了OPENEULER_LOCAL_NAME,则原本地仓将不会做任何操作,openeuler_fetch将直接新建一个busyboyy
如果在编译busybox中所依赖的某些文件不想要,而想要统一去除,则可以在bb文件或bbappend文件中设定OPENEULER_SRC_URI_REMOVE变量,比如busybox的SRC_URI中有https或git开头的文件路径,但是我们会自己下载而不需要系统默认设定的,则可以设置OPENEULER_SRC_URI_REMOVE=”https git”,这样openeuler_fetch在处理时就会去除以https和git开头的文件
如何关闭openeuler_fetch功能¶
OPENEULER_FETCH有两种关闭方式:
在meta-openeuler/conf/layer.conf中有一个全局变量OPENEULER_FETCH,该值默认设置为enable,即openeuler_fetch是开启状态,如果想要关闭openeuler_fetch则设置该值为disable,
在oebuild执行generate指令是将参数-df带上,也可以关闭openeuelr_fetch功能
另外 OPENEULER_FETCH
该值的作用域是全局的,我们在开发中可能会针对某一些或某几个包不需要运行openeuler_fetch,则可以在相关包的bb或bbappend中设定该值为disable