diff options
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 127 | ||||
| -rw-r--r-- | bitbake/lib/bb/cookerdata.py | 130 |
2 files changed, 139 insertions, 118 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index ca544558f0..daf37ebd45 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -93,15 +93,6 @@ class BBCooker: | |||
| 93 | 93 | ||
| 94 | self.configuration = configuration | 94 | self.configuration = configuration |
| 95 | 95 | ||
| 96 | # Keep a datastore of the initial environment variables and their | ||
| 97 | # values from when BitBake was launched to enable child processes | ||
| 98 | # to use environment variables which have been cleaned from the | ||
| 99 | # BitBake processes env | ||
| 100 | self.savedenv = bb.data.init() | ||
| 101 | savedenv = configuration.params.environment | ||
| 102 | for k in savedenv: | ||
| 103 | self.savedenv.setVar(k, savedenv[k]) | ||
| 104 | |||
| 105 | self.caches_array = [] | 96 | self.caches_array = [] |
| 106 | # Currently, only Image Creator hob ui needs extra cache. | 97 | # Currently, only Image Creator hob ui needs extra cache. |
| 107 | # So, we save Extra Cache class name and container file | 98 | # So, we save Extra Cache class name and container file |
| @@ -170,16 +161,12 @@ class BBCooker: | |||
| 170 | self.parser = None | 161 | self.parser = None |
| 171 | 162 | ||
| 172 | def initConfigurationData(self): | 163 | def initConfigurationData(self): |
| 173 | self.configuration.data = bb.data.init() | 164 | worker = False |
| 174 | if self.configuration.tracking: | ||
| 175 | self.configuration.data.enableTracking() | ||
| 176 | |||
| 177 | if not self.configuration.server_register_idlecallback: | 165 | if not self.configuration.server_register_idlecallback: |
| 178 | self.configuration.data.setVar("BB_WORKERCONTEXT", "1") | 166 | worker = True |
| 179 | 167 | ||
| 180 | filtered_keys = bb.utils.approved_variables() | 168 | self.databuilder = bb.cookerdata.CookerDataBuilder(self.configuration.params, worker) |
| 181 | bb.data.inheritFromOS(self.configuration.data, self.savedenv, filtered_keys) | 169 | self.configuration.data = self.databuilder.data |
| 182 | self.configuration.data.setVar("BB_ORIGENV", self.savedenv) | ||
| 183 | 170 | ||
| 184 | def enableDataTracking(self): | 171 | def enableDataTracking(self): |
| 185 | self.configuration.data.enableTracking() | 172 | self.configuration.data.enableTracking() |
| @@ -189,15 +176,9 @@ class BBCooker: | |||
| 189 | 176 | ||
| 190 | def loadConfigurationData(self): | 177 | def loadConfigurationData(self): |
| 191 | self.initConfigurationData() | 178 | self.initConfigurationData() |
| 192 | 179 | self.databuilder.parseBaseConfiguration() | |
| 193 | try: | 180 | self.configuration.data = self.databuilder.data |
| 194 | self.parseConfigurationFiles(self.configuration.prefile, | 181 | self.configuration.data_hash = self.databuilder.data_hash |
| 195 | self.configuration.postfile) | ||
| 196 | except SyntaxError: | ||
| 197 | sys.exit(1) | ||
| 198 | except Exception: | ||
| 199 | logger.exception("Error parsing configuration files") | ||
| 200 | sys.exit(1) | ||
| 201 | 182 | ||
| 202 | def saveConfigurationVar(self, var, val, default_file): | 183 | def saveConfigurationVar(self, var, val, default_file): |
| 203 | 184 | ||
| @@ -260,7 +241,7 @@ class BBCooker: | |||
| 260 | self.configuration.data.varhistory.del_var_history(var) | 241 | self.configuration.data.varhistory.del_var_history(var) |
| 261 | 242 | ||
| 262 | #add var to the end of default_file | 243 | #add var to the end of default_file |
| 263 | default_file = self._findConfigFile(default_file) | 244 | default_file = bb.cookerdata.findConfigFile(default_file) |
| 264 | 245 | ||
| 265 | with open(default_file, 'r') as f: | 246 | with open(default_file, 'r') as f: |
| 266 | contents = f.readlines() | 247 | contents = f.readlines() |
| @@ -700,7 +681,7 @@ class BBCooker: | |||
| 700 | Find the location on disk of configfile and if it exists and was parsed by BitBake | 681 | Find the location on disk of configfile and if it exists and was parsed by BitBake |
| 701 | emit the ConfigFilePathFound event with the path to the file. | 682 | emit the ConfigFilePathFound event with the path to the file. |
| 702 | """ | 683 | """ |
| 703 | path = self._findConfigFile(configfile) | 684 | path = bb.cookerdata.findConfigFile(configfile) |
| 704 | if not path: | 685 | if not path: |
| 705 | return | 686 | return |
| 706 | 687 | ||
| @@ -835,76 +816,6 @@ class BBCooker: | |||
| 835 | else: | 816 | else: |
| 836 | shell.start( self ) | 817 | shell.start( self ) |
| 837 | 818 | ||
| 838 | def _findConfigFile(self, configfile): | ||
| 839 | path = os.getcwd() | ||
| 840 | while path != "/": | ||
| 841 | confpath = os.path.join(path, "conf", configfile) | ||
| 842 | if os.path.exists(confpath): | ||
| 843 | return confpath | ||
| 844 | |||
| 845 | path, _ = os.path.split(path) | ||
| 846 | return None | ||
| 847 | |||
| 848 | def _findLayerConf(self): | ||
| 849 | return self._findConfigFile("bblayers.conf") | ||
| 850 | |||
| 851 | def parseConfigurationFiles(self, prefiles, postfiles): | ||
| 852 | data = self.configuration.data | ||
| 853 | bb.parse.init_parser(data) | ||
| 854 | |||
| 855 | # Parse files for loading *before* bitbake.conf and any includes | ||
| 856 | for f in prefiles: | ||
| 857 | data = _parse(f, data) | ||
| 858 | |||
| 859 | layerconf = self._findLayerConf() | ||
| 860 | if layerconf: | ||
| 861 | parselog.debug(2, "Found bblayers.conf (%s)", layerconf) | ||
| 862 | data = _parse(layerconf, data) | ||
| 863 | |||
| 864 | layers = (data.getVar('BBLAYERS', True) or "").split() | ||
| 865 | |||
| 866 | data = bb.data.createCopy(data) | ||
| 867 | for layer in layers: | ||
| 868 | parselog.debug(2, "Adding layer %s", layer) | ||
| 869 | data.setVar('LAYERDIR', layer) | ||
| 870 | data = _parse(os.path.join(layer, "conf", "layer.conf"), data) | ||
| 871 | data.expandVarref('LAYERDIR') | ||
| 872 | |||
| 873 | data.delVar('LAYERDIR') | ||
| 874 | |||
| 875 | if not data.getVar("BBPATH", True): | ||
| 876 | raise SystemExit("The BBPATH variable is not set") | ||
| 877 | |||
| 878 | data = _parse(os.path.join("conf", "bitbake.conf"), data) | ||
| 879 | |||
| 880 | # Parse files for loading *after* bitbake.conf and any includes | ||
| 881 | for p in postfiles: | ||
| 882 | data = _parse(p, data) | ||
| 883 | |||
| 884 | # Handle any INHERITs and inherit the base class | ||
| 885 | bbclasses = ["base"] + (data.getVar('INHERIT', True) or "").split() | ||
| 886 | for bbclass in bbclasses: | ||
| 887 | data = _inherit(bbclass, data) | ||
| 888 | |||
| 889 | # Nomally we only register event handlers at the end of parsing .bb files | ||
| 890 | # We register any handlers we've found so far here... | ||
| 891 | for var in data.getVar('__BBHANDLERS') or []: | ||
| 892 | bb.event.register(var, data.getVar(var)) | ||
| 893 | |||
| 894 | if data.getVar("BB_WORKERCONTEXT", False) is None: | ||
| 895 | bb.fetch.fetcher_init(data) | ||
| 896 | bb.codeparser.parser_cache_init(data) | ||
| 897 | bb.event.fire(bb.event.ConfigParsed(), data) | ||
| 898 | |||
| 899 | if data.getVar("BB_INVALIDCONF") is True: | ||
| 900 | data.setVar("BB_INVALIDCONF", False) | ||
| 901 | self.parseConfigurationFiles(self.configuration.prefile, | ||
| 902 | self.configuration.postfile) | ||
| 903 | else: | ||
| 904 | bb.parse.init_parser(data) | ||
| 905 | data.setVar('BBINCLUDED',bb.parse.get_file_depends(data)) | ||
| 906 | self.configuration.data = data | ||
| 907 | self.configuration.data_hash = data.get_hash() | ||
| 908 | 819 | ||
| 909 | def handleCollections( self, collections ): | 820 | def handleCollections( self, collections ): |
| 910 | """Handle collections""" | 821 | """Handle collections""" |
| @@ -1501,26 +1412,6 @@ class CookerCollectFiles(object): | |||
| 1501 | 1412 | ||
| 1502 | return priorities | 1413 | return priorities |
| 1503 | 1414 | ||
| 1504 | def catch_parse_error(func): | ||
| 1505 | """Exception handling bits for our parsing""" | ||
| 1506 | @wraps(func) | ||
| 1507 | def wrapped(fn, *args): | ||
| 1508 | try: | ||
| 1509 | return func(fn, *args) | ||
| 1510 | except (IOError, bb.parse.ParseError, bb.data_smart.ExpansionError) as exc: | ||
| 1511 | parselog.critical("Unable to parse %s: %s" % (fn, exc)) | ||
| 1512 | sys.exit(1) | ||
| 1513 | return wrapped | ||
| 1514 | |||
| 1515 | @catch_parse_error | ||
| 1516 | def _parse(fn, data, include=True): | ||
| 1517 | return bb.parse.handle(fn, data, include) | ||
| 1518 | |||
| 1519 | @catch_parse_error | ||
| 1520 | def _inherit(bbclass, data): | ||
| 1521 | bb.parse.BBHandler.inherit(bbclass, "configuration INHERITs", 0, data) | ||
| 1522 | return data | ||
| 1523 | |||
| 1524 | class ParsingFailure(Exception): | 1415 | class ParsingFailure(Exception): |
| 1525 | def __init__(self, realexception, recipe): | 1416 | def __init__(self, realexception, recipe): |
| 1526 | self.realexception = realexception | 1417 | self.realexception = realexception |
diff --git a/bitbake/lib/bb/cookerdata.py b/bitbake/lib/bb/cookerdata.py index 3c2469ef87..0b436b37e6 100644 --- a/bitbake/lib/bb/cookerdata.py +++ b/bitbake/lib/bb/cookerdata.py | |||
| @@ -126,3 +126,133 @@ class CookerConfiguration(object): | |||
| 126 | def setServerRegIdleCallback(self, srcb): | 126 | def setServerRegIdleCallback(self, srcb): |
| 127 | self.server_register_idlecallback = srcb | 127 | self.server_register_idlecallback = srcb |
| 128 | 128 | ||
| 129 | def catch_parse_error(func): | ||
| 130 | """Exception handling bits for our parsing""" | ||
| 131 | @wraps(func) | ||
| 132 | def wrapped(fn, *args): | ||
| 133 | try: | ||
| 134 | return func(fn, *args) | ||
| 135 | except (IOError, bb.parse.ParseError, bb.data_smart.ExpansionError) as exc: | ||
| 136 | parselog.critical("Unable to parse %s: %s" % (fn, exc)) | ||
| 137 | sys.exit(1) | ||
| 138 | return wrapped | ||
| 139 | |||
| 140 | @catch_parse_error | ||
| 141 | def _parse(fn, data, include=True): | ||
| 142 | return bb.parse.handle(fn, data, include) | ||
| 143 | |||
| 144 | @catch_parse_error | ||
| 145 | def _inherit(bbclass, data): | ||
| 146 | bb.parse.BBHandler.inherit(bbclass, "configuration INHERITs", 0, data) | ||
| 147 | return data | ||
| 148 | |||
| 149 | def findConfigFile(configfile): | ||
| 150 | path = os.getcwd() | ||
| 151 | while path != "/": | ||
| 152 | confpath = os.path.join(path, "conf", configfile) | ||
| 153 | if os.path.exists(confpath): | ||
| 154 | return confpath | ||
| 155 | |||
| 156 | path, _ = os.path.split(path) | ||
| 157 | return None | ||
| 158 | |||
| 159 | class CookerDataBuilder(object): | ||
| 160 | |||
| 161 | def __init__(self, params, worker = False): | ||
| 162 | |||
| 163 | self.prefiles = params.prefile | ||
| 164 | self.postfiles = params.postfile | ||
| 165 | self.tracking = params.tracking | ||
| 166 | |||
| 167 | self.data = bb.data.init() | ||
| 168 | if self.tracking: | ||
| 169 | self.data.enableTracking() | ||
| 170 | |||
| 171 | # Keep a datastore of the initial environment variables and their | ||
| 172 | # values from when BitBake was launched to enable child processes | ||
| 173 | # to use environment variables which have been cleaned from the | ||
| 174 | # BitBake processes env | ||
| 175 | self.savedenv = bb.data.init() | ||
| 176 | savedenv = params.environment | ||
| 177 | for k in savedenv: | ||
| 178 | self.savedenv.setVar(k, savedenv[k]) | ||
| 179 | |||
| 180 | filtered_keys = bb.utils.approved_variables() | ||
| 181 | bb.data.inheritFromOS(self.data, self.savedenv, filtered_keys) | ||
| 182 | self.data.setVar("BB_ORIGENV", self.savedenv) | ||
| 183 | |||
| 184 | if worker: | ||
| 185 | self.data.setVar("BB_WORKERCONTEXT", "1") | ||
| 186 | |||
| 187 | def parseBaseConfiguration(self): | ||
| 188 | try: | ||
| 189 | self.parseConfigurationFiles(self.prefiles, self.postfiles) | ||
| 190 | except SyntaxError: | ||
| 191 | sys.exit(1) | ||
| 192 | except Exception: | ||
| 193 | logger.exception("Error parsing configuration files") | ||
| 194 | sys.exit(1) | ||
| 195 | |||
| 196 | def _findLayerConf(self): | ||
| 197 | return findConfigFile("bblayers.conf") | ||
| 198 | |||
| 199 | def parseConfigurationFiles(self, prefiles, postfiles): | ||
| 200 | data = self.data | ||
| 201 | bb.parse.init_parser(data) | ||
| 202 | |||
| 203 | # Parse files for loading *before* bitbake.conf and any includes | ||
| 204 | for f in prefiles: | ||
| 205 | data = _parse(f, data) | ||
| 206 | |||
| 207 | layerconf = self._findLayerConf() | ||
| 208 | if layerconf: | ||
| 209 | parselog.debug(2, "Found bblayers.conf (%s)", layerconf) | ||
| 210 | data = _parse(layerconf, data) | ||
| 211 | |||
| 212 | layers = (data.getVar('BBLAYERS', True) or "").split() | ||
| 213 | |||
| 214 | data = bb.data.createCopy(data) | ||
| 215 | for layer in layers: | ||
| 216 | parselog.debug(2, "Adding layer %s", layer) | ||
| 217 | data.setVar('LAYERDIR', layer) | ||
| 218 | data = _parse(os.path.join(layer, "conf", "layer.conf"), data) | ||
| 219 | data.expandVarref('LAYERDIR') | ||
| 220 | |||
| 221 | data.delVar('LAYERDIR') | ||
| 222 | |||
| 223 | if not data.getVar("BBPATH", True): | ||
| 224 | raise SystemExit("The BBPATH variable is not set") | ||
| 225 | |||
| 226 | data = _parse(os.path.join("conf", "bitbake.conf"), data) | ||
| 227 | |||
| 228 | # Parse files for loading *after* bitbake.conf and any includes | ||
| 229 | for p in postfiles: | ||
| 230 | data = _parse(p, data) | ||
| 231 | |||
| 232 | # Handle any INHERITs and inherit the base class | ||
| 233 | bbclasses = ["base"] + (data.getVar('INHERIT', True) or "").split() | ||
| 234 | for bbclass in bbclasses: | ||
| 235 | data = _inherit(bbclass, data) | ||
| 236 | |||
| 237 | # Nomally we only register event handlers at the end of parsing .bb files | ||
| 238 | # We register any handlers we've found so far here... | ||
| 239 | for var in data.getVar('__BBHANDLERS') or []: | ||
| 240 | bb.event.register(var, data.getVar(var)) | ||
| 241 | |||
| 242 | if data.getVar("BB_WORKERCONTEXT", False) is None: | ||
| 243 | bb.fetch.fetcher_init(data) | ||
| 244 | bb.codeparser.parser_cache_init(data) | ||
| 245 | bb.event.fire(bb.event.ConfigParsed(), data) | ||
| 246 | |||
| 247 | if data.getVar("BB_INVALIDCONF") is True: | ||
| 248 | data.setVar("BB_INVALIDCONF", False) | ||
| 249 | self.parseConfigurationFiles(self.prefiles, self.postfiles) | ||
| 250 | return | ||
| 251 | |||
| 252 | bb.parse.init_parser(data) | ||
| 253 | data.setVar('BBINCLUDED',bb.parse.get_file_depends(data)) | ||
| 254 | self.data = data | ||
| 255 | self.data_hash = data.get_hash() | ||
| 256 | |||
| 257 | |||
| 258 | |||
