summaryrefslogtreecommitdiff
path: root/bitbake/lib/bb
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb')
-rw-r--r--bitbake/lib/bb/__init__.py20
-rw-r--r--bitbake/lib/bb/cooker.py21
-rw-r--r--bitbake/lib/bb/data.py4
-rw-r--r--bitbake/lib/bb/fetch/__init__.py17
-rw-r--r--bitbake/lib/bb/fetch/local.py4
5 files changed, 50 insertions, 16 deletions
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py
index e601eda46..1bfecc49e 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 7db3529bb..955fbb434 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 9782c9f54..b2025f069 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 f739245bd..229b28c19 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 9be8f1ce4..5e480a208 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)