OPENEULER_SRC_URI_REMOVE

在我们开发过程中,在添加新包时总是需要替换成openEuler源的包,并且在manifest.yaml基线文件中添加该包的基线信息,openEuler Embedded的包下载方式是预先下载然后以本地文件方式引入,即在do_fetch前将包下载好,然后在SRC_URI中以 file:// 方式将源码包引入,此时我们就需要将上游原bb文件中指向远程地址的链接去除,本文即为介绍如何快速去除上游原远程链接。

OPENEULER_SRC_URI_REMOVE的使用

该变量应用在bb/bbappend文件中,如果需要移除某些远程链接,只需要将远程链接的协议在该变量中设置即可。以下是一个范例:

上游audit.bb文件的SRC_URI是这样的

SRC_URI = "git://github.com/linux-audit/${BPN}-userspace.git;branch=master;protocol=https \
       file://Fixed-swig-host-contamination-issue.patch \
       file://0001-Replace-__attribute_malloc__-with-__attribute__-__ma.patch \
       file://auditd \
       file://auditd.service \
       file://audit-volatile.conf \
"

那么在audit.bbappend文件中SRC_URI是这样设置的

OPENEULER_SRC_URI_REMOVE = "git"

SRC_URI += " \
    file://audit-${PV}.tar.gz \
    file://bugfix-audit-support-armv7b.patch \
    file://bugfix-audit-userspace-missing-syscalls-for-aarm64.patch \
    file://bugfix-audit-reload-coredump.patch \
    file://audit-Add-sw64-architecture.patch \
    file://auditd.conf \
    file://audit.rules \
    file://backport-auditswig.i-avoid-setter-generation-for-audit_rule_d.patch \
    "

从以上的改动可以看到,即使将 git://github.com/linux-audit/${BPN}-userspace.git;branch=master;protocol=https`改为 `file://audit-${PV}.tar.gz 并没有使用

SRC_URI:remove += "git://github.com/linux-audit/${BPN}-userspace.git;branch=master;protocol=https"

而是直接用 OPENEULER_SRC_URI_REMOVE = “git”,这也是我们推荐的做法。

Note

一旦设置了那么针对该协议的远程链接都将不再生效,意思是如果SRC_URI中有两个远程链接都是以https开头,如果希望某个远程链接生效,那么还是需要用remove来移除指定的远程链接,这样就不会影响其他的远程链接。

该变量的处理是在openeuler.bbclass中以匿名函数进行的,因此在解析阶段会将SRC_URI的值处理好,因此其作用域是构建全流程的,以下是其处理代码,打开yocto-meta-openeuler/meta-openeuler/classes/openeuler.classes

# src_uri_set is used to remove some URLs from SRC_URI through
# OPENEULER_SRC_URI_REMOVE, because we don't want to download from
# these URLs
python () {
    if d.getVar('OPENEULER_SRC_URI_REMOVE'):
        REMOVELIST = d.getVar('OPENEULER_SRC_URI_REMOVE').split(' ')
        URI = []
        for line in d.getVar('SRC_URI').split(' '):
            URI.append(line)
            for removeItem in REMOVELIST:
                if line.strip().startswith(removeItem.strip()):
                    URI.pop()
                    break
        URI = ' '.join(URI)
        d.setVar('SRC_URI', URI)
}