diff options
author | Richard Purdie <richard@openedhand.com> | 2007-08-16 09:55:21 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2007-08-16 09:55:21 +0000 |
commit | 7611768e23d9809f458691454c2aeb60d7b26e7d (patch) | |
tree | 050786d6475e1d0ed219d01dac1f02b1ebbdbb81 | |
parent | 11ce59b501b5c82f6705db4d76e468fcbe3412db (diff) | |
download | openembedded-core-7611768e23d9809f458691454c2aeb60d7b26e7d.tar.gz openembedded-core-7611768e23d9809f458691454c2aeb60d7b26e7d.tar.bz2 openembedded-core-7611768e23d9809f458691454c2aeb60d7b26e7d.zip |
bitbake: Sync with 1.8 head. Adds locking to the fetcher to prevent parallel downloads, fixes key expansion issues and occasional missing dependency graph links
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@2502 311d38ba-8fff-0310-9ca6-ca027cbcb966
-rw-r--r-- | bitbake/ChangeLog | 6 | ||||
-rw-r--r-- | bitbake/lib/bb/data.py | 33 | ||||
-rw-r--r-- | bitbake/lib/bb/data_smart.py | 22 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/__init__.py | 15 | ||||
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 16 |
5 files changed, 65 insertions, 27 deletions
diff --git a/bitbake/ChangeLog b/bitbake/ChangeLog index 1fbbd710bb..878afadb43 100644 --- a/bitbake/ChangeLog +++ b/bitbake/ChangeLog @@ -18,8 +18,14 @@ Changes in Bitbake 1.8.x: - Fix local fetcher's localpath return values - Apply OVERRIDES before performing immediate expansions - Allow the -b -e option combination to take regular expressions + - Add plain message function to bb.msg + - Sort the list of providers before processing so dependency problems are + reproducible rather than effectively random + - Add locking for fetchers so only one tries to fetch a given file at a given time + - Fix int(0)/None confusion in runqueue.py which causes random gaps in dependency chains - Fix handling of variables with expansion in the name using _append/_prepend e.g. RRECOMMENDS_${PN}_append_xyz = "abc" + Changes in Bitbake 1.8.6: - Correctly redirect stdin when forking diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index b2025f0694..21cdde04a8 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -96,6 +96,19 @@ def getVar(var, d, exp = 0): """ return d.getVar(var,exp) + +def renameVar(key, newkey, d): + """Renames a variable from key to newkey + + Example: + >>> d = init() + >>> setVar('TEST', 'testcontents', d) + >>> renameVar('TEST', 'TEST2', d) + >>> print getVar('TEST2', d) + testcontents + """ + d.renameVar(key, newkey) + def delVar(var, d): """Removes a variable from the data set @@ -276,24 +289,8 @@ def expandKeys(alterdata, readdata = None): ekey = expand(key, readdata) if key == ekey: continue - val = getVar(key, alterdata) - if val is None: - continue -# import copy -# setVarFlags(ekey, copy.copy(getVarFlags(key, readdata)), alterdata) - setVar(ekey, val, alterdata) - - for i in ('_append', '_prepend'): - dest = getVarFlag(ekey, i, alterdata) or [] - 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) + + renameVar(key, ekey, alterdata) def expandData(alterdata, readdata = None): """For each variable in alterdata, expand it, and update the var contents. diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index ef1e9dda07..e879343f5d 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -170,6 +170,28 @@ class DataSmart: return self.expand(value,var) return value + def renameVar(self, key, newkey): + """ + Rename the variable key to newkey + """ + val = self.getVar(key, 0) + if val is None: + return + + self.setVar(newkey, val) + + for i in ('_append', '_prepend'): + dest = self.getVarFlag(newkey, i) or [] + src = self.getVarFlag(key, i) or [] + dest.extend(src) + self.setVarFlag(newkey, i, dest) + + if self._special_values.has_key(i) and key in self._special_values[i]: + self._special_values[i].remove(key) + self._special_values[i].add(newkey) + + self.delVar(key) + def delVar(self,var): self.expand_cache = {} self.dict[var] = {} diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index 229b28c19d..bbff516ffc 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py @@ -24,7 +24,7 @@ BitBake build tools. # # Based on functions from the base bb module, Copyright 2003 Holger Schurig -import os, re +import os, re, fcntl import bb from bb import data from bb import persist_data @@ -140,9 +140,21 @@ def go(d): # Touch md5 file to show activity os.utime(ud.md5, None) continue + lf = open(ud.lockfile, "a+") + fcntl.flock(lf.fileno(), fcntl.LOCK_EX) + if ud.localfile and not m.forcefetch(u, ud, d) and os.path.exists(ud.md5): + # If someone else fetched this before we got the lock, + # notice and don't try again + os.utime(ud.md5, None) + fcntl.flock(lf.fileno(), fcntl.LOCK_UN) + lf.close + continue m.go(u, ud, d) if ud.localfile and not m.forcefetch(u, ud, d): Fetch.write_md5sum(u, ud, d) + fcntl.flock(lf.fileno(), fcntl.LOCK_UN) + lf.close + def localpaths(d): """ @@ -264,6 +276,7 @@ class FetchData(object): else: self.localpath = self.method.localpath(self.url, self, d) self.md5 = self.localpath + '.md5' + self.lockfile = self.localpath + '.lock' # if user sets localpath for file, use it instead. diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 21383f4206..c55a58da2b 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -22,7 +22,7 @@ Handles preparation and execution of a queue of tasks # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -from bb import msg, data, fetch, event, mkdirhier, utils +from bb import msg, data, event, mkdirhier, utils from sets import Set import bb, os, sys import signal @@ -113,7 +113,7 @@ class RunQueue: # Won't be in build_targets if ASSUME_PROVIDED if depid in taskData.build_targets: depdata = taskData.build_targets[depid][0] - if depdata: + if depdata is not None: dep = taskData.fn_index[depdata] depends.append(taskData.gettask_id(dep, taskname)) @@ -123,7 +123,7 @@ class RunQueue: for depid in taskData.rdepids[fnid]: if depid in taskData.run_targets: depdata = taskData.run_targets[depid][0] - if depdata: + if depdata is not None: dep = taskData.fn_index[depdata] depends.append(taskData.gettask_id(dep, taskname)) @@ -133,7 +133,7 @@ class RunQueue: if depid in taskData.build_targets: # Won't be in build_targets if ASSUME_PROVIDED depdata = taskData.build_targets[depid][0] - if depdata: + if depdata is not None: dep = taskData.fn_index[depdata] depends.append(taskData.gettask_id(dep, idepend.split(":")[1])) @@ -148,11 +148,11 @@ class RunQueue: dep_seen.append(depid) if depid in taskData.build_targets: depdata = taskData.build_targets[depid][0] - if depdata: + if depdata is not None: dep = taskData.fn_index[depdata] # Need to avoid creating new tasks here taskid = taskData.gettask_id(dep, taskname, False) - if taskid: + if taskid is not None: depends.append(taskid) fnid = taskData.tasks_fnid[taskid] else: @@ -180,11 +180,11 @@ class RunQueue: rdep_seen.append(rdepid) if rdepid in taskData.run_targets: depdata = taskData.run_targets[rdepid][0] - if depdata: + if depdata is not None: dep = taskData.fn_index[depdata] # Need to avoid creating new tasks here taskid = taskData.gettask_id(dep, taskname, False) - if taskid: + if taskid is not None: depends.append(taskid) fnid = taskData.tasks_fnid[taskid] else: |