从源码阐述Bitbake Collections

BBFILES := "${OEDIR}/openembedded/packages/*/*.bb ${LOCALDIR}/packages/*/*.bb"
BBFILE_COLLECTIONS = "upstream local"
BBFILE_PATTERN_upstream = "^${OEDIR}/openembedded/packages/"
BBFILE_PATTERN_local = "^${LOCALDIR}/packages/"
BBFILE_PRIORITY_upstream = "5"
BBFILE_PRIORITY_local = "10"
官方OE有一个分支,这算成third party,我们自己需要开发自己的oe package,所以我们也需要一个分支,但是又不希望更改OE的分支,这也就是bitbake collections的来历吧

BBFILE_COLLECTIONS定义有多少个分支,这里有upstream和local
BBFILE_PATTERN,为每个分支定义正则表达式,
BBFILE_PRIORITY为每个分支定义优先级

我们来看源码


def handleCollections( self, collections ):
        """Handle collections"""
        if collections:
            collection_list = collections.split()
            for c in collection_list:
                regex = bb.data.getVar("BBFILE_PATTERN_%s" % c, self.configuration.data, 1)
                if regex == None:
                    bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PATTERN_%s not defined" % c)
                    continue
                priority = bb.data.getVar("BBFILE_PRIORITY_%s" % c, self.configuration.data, 1)
                if priority == None:
                    bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PRIORITY_%s not defined" % c)
                    continue
                try:
                    cre = re.compile(regex)
                except re.error:
                    bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PATTERN_%s \"%s\" is not a valid regular expression" % (c, regex))
                    continue
                try:
                    pri = int(priority)
                    self.status.bbfile_config_priorities.append((cre, pri))
                except ValueError:
                    bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority))

传进来的参数就是BBFILE_COLLECTIONS 变量值,函数的主要功能就是为每个分支计算出正则表达式匹配和优先级,填充bbfile_config_priorities,比如如上面说定义的BBFILE_COLLECTIONS,
bbfile_config_priorities[(re.compile("^${OEDIR}/openembedded/packages/"),5),(re.compile("^${LOCALDIR}/packages/"),10)]
这就是这个函数的task
我们继续看如何计算每个bbfile 的priorities
def calc_bbfile_priority(filename):
            for (regex, pri) in self.status.bbfile_config_priorities:
                if regex.match(filename):
                    return pri
            return 0
每个bb文件,如果能够和bbfile_config_priorities里的正则表达式匹配,那么就赋予这个bb文件伴随的priorities