diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/__init__.py | 20 | ||||
-rw-r--r-- | bitbake/lib/bb/cooker.py | 21 | ||||
-rw-r--r-- | bitbake/lib/bb/data.py | 4 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/__init__.py | 17 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/local.py | 4 |
5 files changed, 50 insertions, 16 deletions
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index e601eda469..1bfecc49ec 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py @@ -345,14 +345,20 @@ def encodeurl(decoded): ####################################################################### def which(path, item, direction = 0): - """Useful function for locating a file in a PATH""" - found = "" + """ + Locate a file in a PATH + """ + + paths = (path or "").split(':') + if direction != 0: + paths.reverse() + for p in (path or "").split(':'): - if os.path.exists(os.path.join(p, item)): - found = os.path.join(p, item) - if direction == 0: - break - return found + next = os.path.join(p, item) + if os.path.exists(next): + return next + + return "" ####################################################################### diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 7db3529bb4..955fbb434c 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -143,10 +143,11 @@ class BBCooker: if self.configuration.buildfile: self.cb = None self.bb_cache = bb.cache.init(self) + bf = self.matchFile(self.configuration.buildfile) try: - self.configuration.data = self.bb_cache.loadDataFull(self.configuration.buildfile, self.configuration.data) + self.configuration.data = self.bb_cache.loadDataFull(bf, self.configuration.data) except IOError, e: - bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % ( self.configuration.buildfile, e )) + bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % (bf, e)) except Exception, e: bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e) # emit variables and shell functions @@ -377,14 +378,15 @@ class BBCooker: bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data) bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()),self.configuration.data) - def buildFile(self, buildfile): + def matchFile(self, buildfile): """ - Build the file matching regexp buildfile + Convert the fragment buildfile into a real file + Error if there are too many matches """ - bf = os.path.abspath(buildfile) try: os.stat(bf) + return bf except OSError: (filelist, masked) = self.collect_bbfiles() regexp = re.compile(buildfile) @@ -398,7 +400,14 @@ class BBCooker: for f in matches: bb.msg.error(bb.msg.domain.Parsing, " %s" % f) sys.exit(1) - bf = matches[0] + return matches[0] + + def buildFile(self, buildfile): + """ + Build the file matching regexp buildfile + """ + + bf = self.matchFile(buildfile) bbfile_data = bb.parse.handle(bf, self.configuration.data) diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index 9782c9f546..b2025f0694 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -288,6 +288,10 @@ def expandKeys(alterdata, readdata = None): src = getVarFlag(key, i, readdata) or [] dest.extend(src) setVarFlag(ekey, i, dest, alterdata) + + if key in alterdata._special_values[i]: + alterdata._special_values[i].remove(key) + alterdata._special_values[i].add(ekey) delVar(key, alterdata) diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index f739245bd1..229b28c19d 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py @@ -182,8 +182,21 @@ def get_srcrev(d): if len(scms) == 1: return urldata[scms[0]].method.sortable_revision(scms[0], urldata[scms[0]], d) - bb.msg.error(bb.msg.domain.Fetcher, "Sorry, support for SRCREV_FORMAT still needs to be written") - raise ParameterError + # + # Mutiple SCMs are in SRC_URI so we resort to SRCREV_FORMAT + # + format = bb.data.getVar('SRCREV_FORMAT', d, 1) + if not format: + bb.msg.error(bb.msg.domain.Fetcher, "The SRCREV_FORMAT variable must be set when multiple SCMs are used.") + raise ParameterError + + for scm in scms: + if 'name' in urldata[scm].parm: + name = urldata[scm].parm["name"] + rev = urldata[scm].method.sortable_revision(scm, urldata[scm], d) + format = format.replace(name, rev) + + return format def localpath(url, d, cache = True): """ diff --git a/bitbake/lib/bb/fetch/local.py b/bitbake/lib/bb/fetch/local.py index 9be8f1ce4b..5e480a208e 100644 --- a/bitbake/lib/bb/fetch/local.py +++ b/bitbake/lib/bb/fetch/local.py @@ -38,9 +38,11 @@ class Local(Fetch): return urldata.type in ['file','patch'] def localpath(self, url, urldata, d): - """Return the local filename of a given url assuming a successful fetch. + """ + Return the local filename of a given url assuming a successful fetch. """ path = url.split("://")[1] + path = path.split(";")[0] newpath = path if path[0] != "/": filespath = data.getVar('FILESPATH', d, 1) |