diff options
| -rw-r--r-- | bitbake/lib/bb/cache.py | 12 | ||||
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 63 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 6 | ||||
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 2 |
4 files changed, 55 insertions, 28 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index da4546640a..b5c7043c64 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py | |||
| @@ -165,7 +165,7 @@ class Cache: | |||
| 165 | #bb.msg.debug(2, bb.msg.domain.Cache, "realfn2virtual %s and %s to %s" % (realfn, cls, "virtual:" + cls + ":" + realfn)) | 165 | #bb.msg.debug(2, bb.msg.domain.Cache, "realfn2virtual %s and %s to %s" % (realfn, cls, "virtual:" + cls + ":" + realfn)) |
| 166 | return "virtual:" + cls + ":" + realfn | 166 | return "virtual:" + cls + ":" + realfn |
| 167 | 167 | ||
| 168 | def loadDataFull(self, virtualfn, cfgData): | 168 | def loadDataFull(self, virtualfn, appends, cfgData): |
| 169 | """ | 169 | """ |
| 170 | Return a complete set of data for fn. | 170 | Return a complete set of data for fn. |
| 171 | To do this, we need to parse the file. | 171 | To do this, we need to parse the file. |
| @@ -175,10 +175,10 @@ class Cache: | |||
| 175 | 175 | ||
| 176 | bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s (full)" % fn) | 176 | bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s (full)" % fn) |
| 177 | 177 | ||
| 178 | bb_data = self.load_bbfile(fn, cfgData) | 178 | bb_data = self.load_bbfile(fn, appends, cfgData) |
| 179 | return bb_data[cls] | 179 | return bb_data[cls] |
| 180 | 180 | ||
| 181 | def loadData(self, fn, cfgData, cacheData): | 181 | def loadData(self, fn, appends, cfgData, cacheData): |
| 182 | """ | 182 | """ |
| 183 | Load a subset of data for fn. | 183 | Load a subset of data for fn. |
| 184 | If the cached data is valid we do nothing, | 184 | If the cached data is valid we do nothing, |
| @@ -206,7 +206,7 @@ class Cache: | |||
| 206 | 206 | ||
| 207 | bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn) | 207 | bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn) |
| 208 | 208 | ||
| 209 | bb_data = self.load_bbfile(fn, cfgData) | 209 | bb_data = self.load_bbfile(fn, appends, cfgData) |
| 210 | 210 | ||
| 211 | for data in bb_data: | 211 | for data in bb_data: |
| 212 | virtualfn = self.realfn2virtual(fn, data) | 212 | virtualfn = self.realfn2virtual(fn, data) |
| @@ -439,7 +439,7 @@ class Cache: | |||
| 439 | self.getVar('__BB_DONT_CACHE', file_name, True) | 439 | self.getVar('__BB_DONT_CACHE', file_name, True) |
| 440 | self.getVar('__VARIANTS', file_name, True) | 440 | self.getVar('__VARIANTS', file_name, True) |
| 441 | 441 | ||
| 442 | def load_bbfile( self, bbfile, config): | 442 | def load_bbfile(self, bbfile, appends, config): |
| 443 | """ | 443 | """ |
| 444 | Load and parse one .bb build file | 444 | Load and parse one .bb build file |
| 445 | Return the data and whether parsing resulted in the file being skipped | 445 | Return the data and whether parsing resulted in the file being skipped |
| @@ -463,6 +463,8 @@ class Cache: | |||
| 463 | chdir_back = True | 463 | chdir_back = True |
| 464 | data.setVar('TOPDIR', bbfile_loc, bb_data) | 464 | data.setVar('TOPDIR', bbfile_loc, bb_data) |
| 465 | try: | 465 | try: |
| 466 | if appends: | ||
| 467 | data.setVar('__BBAPPEND', " ".join(appends), bb_data) | ||
| 466 | bb_data = parse.handle(bbfile, bb_data) # read .bb data | 468 | bb_data = parse.handle(bbfile, bb_data) # read .bb data |
| 467 | if chdir_back: os.chdir(oldpath) | 469 | if chdir_back: os.chdir(oldpath) |
| 468 | return bb_data | 470 | return bb_data |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 52a402cd91..0992ec4c2e 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -226,7 +226,7 @@ class BBCooker: | |||
| 226 | 226 | ||
| 227 | if fn: | 227 | if fn: |
| 228 | try: | 228 | try: |
| 229 | envdata = self.bb_cache.loadDataFull(fn, self.configuration.data) | 229 | envdata = self.bb_cache.loadDataFull(fn, self.get_file_appends(fn), self.configuration.data) |
| 230 | except IOError as e: | 230 | except IOError as e: |
| 231 | bb.msg.error(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) | 231 | bb.msg.error(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) |
| 232 | raise | 232 | raise |
| @@ -637,7 +637,7 @@ class BBCooker: | |||
| 637 | self.buildSetVars() | 637 | self.buildSetVars() |
| 638 | 638 | ||
| 639 | # Load data into the cache for fn and parse the loaded cache data | 639 | # Load data into the cache for fn and parse the loaded cache data |
| 640 | the_data = self.bb_cache.loadDataFull(fn, self.configuration.data) | 640 | the_data = self.bb_cache.loadDataFull(fn, self.get_file_appends(fn), self.configuration.data) |
| 641 | self.bb_cache.setData(fn, buildfile, the_data) | 641 | self.bb_cache.setData(fn, buildfile, the_data) |
| 642 | self.bb_cache.handle_data(fn, self.status) | 642 | self.bb_cache.handle_data(fn, self.status) |
| 643 | 643 | ||
| @@ -778,7 +778,6 @@ class BBCooker: | |||
| 778 | 778 | ||
| 779 | self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) ) | 779 | self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) ) |
| 780 | 780 | ||
| 781 | bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") | ||
| 782 | (filelist, masked) = self.collect_bbfiles() | 781 | (filelist, masked) = self.collect_bbfiles() |
| 783 | bb.data.renameVar("__depends", "__base_depends", self.configuration.data) | 782 | bb.data.renameVar("__depends", "__base_depends", self.configuration.data) |
| 784 | 783 | ||
| @@ -817,7 +816,7 @@ class BBCooker: | |||
| 817 | return bbfiles | 816 | return bbfiles |
| 818 | 817 | ||
| 819 | def find_bbfiles( self, path ): | 818 | def find_bbfiles( self, path ): |
| 820 | """Find all the .bb files in a directory""" | 819 | """Find all the .bb and .bbappend files in a directory""" |
| 821 | from os.path import join | 820 | from os.path import join |
| 822 | 821 | ||
| 823 | found = [] | 822 | found = [] |
| @@ -825,7 +824,7 @@ class BBCooker: | |||
| 825 | for ignored in ('SCCS', 'CVS', '.svn'): | 824 | for ignored in ('SCCS', 'CVS', '.svn'): |
| 826 | if ignored in dirs: | 825 | if ignored in dirs: |
| 827 | dirs.remove(ignored) | 826 | dirs.remove(ignored) |
| 828 | found += [join(dir, f) for f in files if f.endswith('.bb')] | 827 | found += [join(dir, f) for f in files if (f.endswith('.bb') or f.endswith('.bbappend'))] |
| 829 | 828 | ||
| 830 | return found | 829 | return found |
| 831 | 830 | ||
| @@ -834,6 +833,8 @@ class BBCooker: | |||
| 834 | parsed, cached, skipped, masked = 0, 0, 0, 0 | 833 | parsed, cached, skipped, masked = 0, 0, 0, 0 |
| 835 | self.bb_cache = bb.cache.init(self) | 834 | self.bb_cache = bb.cache.init(self) |
| 836 | 835 | ||
| 836 | bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") | ||
| 837 | |||
| 837 | files = (data.getVar( "BBFILES", self.configuration.data, 1 ) or "").split() | 838 | files = (data.getVar( "BBFILES", self.configuration.data, 1 ) or "").split() |
| 838 | data.setVar("BBFILES", " ".join(files), self.configuration.data) | 839 | data.setVar("BBFILES", " ".join(files), self.configuration.data) |
| 839 | 840 | ||
| @@ -848,9 +849,7 @@ class BBCooker: | |||
| 848 | for f in files: | 849 | for f in files: |
| 849 | if os.path.isdir(f): | 850 | if os.path.isdir(f): |
| 850 | dirfiles = self.find_bbfiles(f) | 851 | dirfiles = self.find_bbfiles(f) |
| 851 | if dirfiles: | 852 | newfiles.update(dirfiles) |
| 852 | newfiles.update(dirfiles) | ||
| 853 | continue | ||
| 854 | else: | 853 | else: |
| 855 | globbed = glob.glob(f) | 854 | globbed = glob.glob(f) |
| 856 | if not globbed and os.path.exists(f): | 855 | if not globbed and os.path.exists(f): |
| @@ -859,23 +858,45 @@ class BBCooker: | |||
| 859 | 858 | ||
| 860 | bbmask = bb.data.getVar('BBMASK', self.configuration.data, 1) | 859 | bbmask = bb.data.getVar('BBMASK', self.configuration.data, 1) |
| 861 | 860 | ||
| 862 | if not bbmask: | 861 | if bbmask: |
| 863 | return (list(newfiles), 0) | 862 | try: |
| 864 | 863 | bbmask_compiled = re.compile(bbmask) | |
| 865 | try: | 864 | except sre_constants.error: |
| 866 | bbmask_compiled = re.compile(bbmask) | 865 | bb.msg.fatal(bb.msg.domain.Collection, "BBMASK is not a valid regular expression.") |
| 867 | except sre_constants.error: | ||
| 868 | bb.msg.fatal(bb.msg.domain.Collection, "BBMASK is not a valid regular expression.") | ||
| 869 | 866 | ||
| 870 | finalfiles = [] | 867 | bbfiles = [] |
| 868 | bbappend = [] | ||
| 871 | for f in newfiles: | 869 | for f in newfiles: |
| 872 | if bbmask_compiled.search(f): | 870 | if bbmask and bbmask_compiled.search(f): |
| 873 | bb.msg.debug(1, bb.msg.domain.Collection, "skipping masked file %s" % f) | 871 | bb.msg.debug(1, bb.msg.domain.Collection, "skipping masked file %s" % f) |
| 874 | masked += 1 | 872 | masked += 1 |
| 875 | continue | 873 | continue |
| 876 | finalfiles.append(f) | 874 | if f.endswith('.bb'): |
| 877 | 875 | bbfiles.append(f) | |
| 878 | return (finalfiles, masked) | 876 | elif f.endswith('.bbappend'): |
| 877 | bbappend.append(f) | ||
| 878 | else: | ||
| 879 | bb.msg.note(1, bb.msg.domain.Collection, "File %s of unknown filetype in BBFILES? Ignorning..." % f) | ||
| 880 | |||
| 881 | # Build a list of .bbappend files for each .bb file | ||
| 882 | self.appendlist = {} | ||
| 883 | for f in bbappend: | ||
| 884 | base = os.path.basename(f).replace('.bbappend', '.bb') | ||
| 885 | if not base in self.appendlist: | ||
| 886 | self.appendlist[base] = [] | ||
| 887 | self.appendlist[base].append(f) | ||
| 888 | |||
| 889 | return (bbfiles, masked) | ||
| 890 | |||
| 891 | def get_file_appends(self, fn): | ||
| 892 | """ | ||
| 893 | Returns a list of .bbappend files to apply to fn | ||
| 894 | NB: collect_files() must have been called prior to this | ||
| 895 | """ | ||
| 896 | f = os.path.basename(fn) | ||
| 897 | if f in self.appendlist: | ||
| 898 | return self.appendlist[f] | ||
| 899 | return [] | ||
| 879 | 900 | ||
| 880 | def serve(self): | 901 | def serve(self): |
| 881 | 902 | ||
| @@ -945,7 +966,7 @@ class CookerParser: | |||
| 945 | f = self.filelist[self.pointer] | 966 | f = self.filelist[self.pointer] |
| 946 | 967 | ||
| 947 | try: | 968 | try: |
| 948 | fromCache, skipped, virtuals = cooker.bb_cache.loadData(f, cooker.configuration.data, cooker.status) | 969 | fromCache, skipped, virtuals = cooker.bb_cache.loadData(f, cooker.get_file_appends(f), cooker.configuration.data, cooker.status) |
| 949 | if fromCache: | 970 | if fromCache: |
| 950 | self.cached += 1 | 971 | self.cached += 1 |
| 951 | else: | 972 | else: |
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index dae2e11154..eb24e0ddd4 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -357,8 +357,12 @@ def _expand_versions(versions): | |||
| 357 | versions = itertools.chain(newversions, versions) | 357 | versions = itertools.chain(newversions, versions) |
| 358 | 358 | ||
| 359 | def multi_finalize(fn, d): | 359 | def multi_finalize(fn, d): |
| 360 | safe_d = d | 360 | appends = (d.getVar("__BBAPPEND", True) or "").split() |
| 361 | for append in appends: | ||
| 362 | bb.msg.debug(2, bb.msg.domain.Parsing, "Appending .bbappend file " + append + " to " + fn) | ||
| 363 | bb.parse.BBHandler.handle(append, d, True) | ||
| 361 | 364 | ||
| 365 | safe_d = d | ||
| 362 | d = bb.data.createCopy(safe_d) | 366 | d = bb.data.createCopy(safe_d) |
| 363 | try: | 367 | try: |
| 364 | finalize(fn, d) | 368 | finalize(fn, d) |
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index f9acd9ca2d..2830bc4ad9 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -1067,7 +1067,7 @@ class RunQueue: | |||
| 1067 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY", self, self.cooker.configuration.data) | 1067 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY", self, self.cooker.configuration.data) |
| 1068 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY2", fn, self.cooker.configuration.data) | 1068 | bb.data.setVar("__RUNQUEUE_DO_NOT_USE_EXTERNALLY2", fn, self.cooker.configuration.data) |
| 1069 | try: | 1069 | try: |
| 1070 | the_data = self.cooker.bb_cache.loadDataFull(fn, self.cooker.configuration.data) | 1070 | the_data = self.cooker.bb_cache.loadDataFull(fn, self.cooker.get_file_appends(fn), self.cooker.configuration.data) |
| 1071 | 1071 | ||
| 1072 | if not self.cooker.configuration.dry_run: | 1072 | if not self.cooker.configuration.dry_run: |
| 1073 | bb.build.exec_task(taskname, the_data) | 1073 | bb.build.exec_task(taskname, the_data) |
