summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/command.py18
-rw-r--r--bitbake/lib/bb/cooker.py89
-rw-r--r--bitbake/lib/bb/data_smart.py22
-rwxr-xr-xbitbake/lib/bb/ui/crumbs/builder.py32
-rw-r--r--bitbake/lib/bb/ui/crumbs/hobeventhandler.py5
-rw-r--r--bitbake/lib/bb/ui/crumbs/template.py24
6 files changed, 153 insertions, 37 deletions
diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py
index 0fed25a3ed..59336bbee7 100644
--- a/bitbake/lib/bb/command.py
+++ b/bitbake/lib/bb/command.py
@@ -174,6 +174,18 @@ class CommandsSync:
174 value = str(params[1]) 174 value = str(params[1])
175 command.cooker.configuration.data.setVar(varname, value) 175 command.cooker.configuration.data.setVar(varname, value)
176 176
177 def enableDataTracking(self, command, params):
178 """
179 Enable history tracking for variables
180 """
181 command.cooker.enableDataTracking()
182
183 def disableDataTracking(self, command, params):
184 """
185 Disable history tracking for variables
186 """
187 command.cooker.disableDataTracking()
188
177 def initCooker(self, command, params): 189 def initCooker(self, command, params):
178 """ 190 """
179 Init the cooker to initial state with nothing parsed 191 Init the cooker to initial state with nothing parsed
@@ -210,6 +222,12 @@ class CommandsSync:
210 package_queue = params[2] 222 package_queue = params[2]
211 return command.cooker.generateNewImage(image, base_image, package_queue) 223 return command.cooker.generateNewImage(image, base_image, package_queue)
212 224
225 def setVarFile(self, command, params):
226 var = params[0]
227 val = params[1]
228 default_file = params[2]
229 command.cooker.saveConfigurationVar(var, val, default_file)
230
213class CommandsAsync: 231class CommandsAsync:
214 """ 232 """
215 A class of asynchronous commands 233 A class of asynchronous commands
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index 80710fb97d..34fbfb0701 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -186,6 +186,12 @@ class BBCooker:
186 filtered_keys = bb.utils.approved_variables() 186 filtered_keys = bb.utils.approved_variables()
187 bb.data.inheritFromOS(self.configuration.data, self.savedenv, filtered_keys) 187 bb.data.inheritFromOS(self.configuration.data, self.savedenv, filtered_keys)
188 188
189 def enableDataTracking(self):
190 self.configuration.data.enableTracking()
191
192 def disableDataTracking(self):
193 self.configuration.data.disableTracking()
194
189 def loadConfigurationData(self): 195 def loadConfigurationData(self):
190 self.initConfigurationData() 196 self.initConfigurationData()
191 197
@@ -201,6 +207,89 @@ class BBCooker:
201 if not self.configuration.cmd: 207 if not self.configuration.cmd:
202 self.configuration.cmd = self.configuration.data.getVar("BB_DEFAULT_TASK", True) or "build" 208 self.configuration.cmd = self.configuration.data.getVar("BB_DEFAULT_TASK", True) or "build"
203 209
210 def saveConfigurationVar(self, var, val, default_file):
211
212 replaced = False
213 #do not save if nothing changed
214 if str(val) == self.configuration.data.getVar(var):
215 return
216
217 conf_files = self.configuration.data.varhistory.get_variable_files(var)
218
219 #format the value when it is a list
220 if isinstance(val, list):
221 listval = ""
222 for value in val:
223 listval += "%s " % value
224 val = listval
225
226 topdir = self.configuration.data.getVar("TOPDIR")
227
228 #comment or replace operations made on var
229 for conf_file in conf_files:
230 if topdir in conf_file:
231 with open(conf_file, 'r') as f:
232 contents = f.readlines()
233 f.close()
234
235 lines = self.configuration.data.varhistory.get_variable_lines(var, conf_file)
236 for line in lines:
237 total = ""
238 i = 0
239 for c in contents:
240 total += c
241 i = i + 1
242 if i==int(line):
243 end_index = len(total)
244 index = total.rfind(var, 0, end_index)
245
246 begin_line = total.count("\n",0,index)
247 end_line = int(line)
248
249 #check if the variable was saved before in the same way
250 #if true it replace the place where the variable was declared
251 #else it comments it
252 if contents[begin_line-1]== "#added by bitbake\n":
253 contents[begin_line] = "%s = \"%s\"\n" % (var, val)
254 replaced = True
255 else:
256 for ii in range(begin_line, end_line):
257 contents[ii] = "#" + contents[ii]
258
259 total = ""
260 for c in contents:
261 total += c
262 with open(conf_file, 'w') as f:
263 f.write(total)
264 f.close()
265
266 if replaced == False:
267 #remove var from history
268 self.configuration.data.varhistory.del_var_history(var)
269
270 #add var to the end of default_file
271 default_file = self._findConfigFile(default_file)
272
273 with open(default_file, 'r') as f:
274 contents = f.readlines()
275 f.close()
276
277 total = ""
278 for c in contents:
279 total += c
280
281 #add the variable on a single line, to be easy to replace the second time
282 total += "#added by bitbake"
283 total += "\n%s = \"%s\"\n" % (var, val)
284
285 with open(default_file, 'w') as f:
286 f.write(total)
287 f.close()
288
289 #add to history
290 loginfo = {"op":set, "file":default_file, "line":total.count("\n")}
291 self.configuration.data.setVar(var, val, **loginfo)
292
204 def parseConfiguration(self): 293 def parseConfiguration(self):
205 294
206 # Set log file verbosity 295 # Set log file verbosity
diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py
index ddf98e6a2e..5bf11e5e0d 100644
--- a/bitbake/lib/bb/data_smart.py
+++ b/bitbake/lib/bb/data_smart.py
@@ -259,6 +259,27 @@ class VariableHistory(object):
259 o.write("#\n# $%s\n# [no history recorded]\n#\n" % var) 259 o.write("#\n# $%s\n# [no history recorded]\n#\n" % var)
260 o.write('# "%s"\n' % (commentVal)) 260 o.write('# "%s"\n' % (commentVal))
261 261
262 def get_variable_files(self, var):
263 """Get the files where operations are made on a variable"""
264 var_history = self.variable(var)
265 files = []
266 for event in var_history:
267 files.append(event['file'])
268 return files
269
270 def get_variable_lines(self, var, f):
271 """Get the line where a operation is made on a variable in file f"""
272 var_history = self.variable(var)
273 lines = []
274 for event in var_history:
275 if f== event['file']:
276 line = event['line']
277 lines.append(line)
278 return lines
279
280 def del_var_history(self, var):
281 if var in self.variables:
282 self.variables[var] = []
262 283
263class DataSmart(MutableMapping): 284class DataSmart(MutableMapping):
264 def __init__(self, special = COWDictBase.copy(), seen = COWDictBase.copy() ): 285 def __init__(self, special = COWDictBase.copy(), seen = COWDictBase.copy() ):
@@ -429,6 +450,7 @@ class DataSmart(MutableMapping):
429 450
430 451
431 def setVar(self, var, value, **loginfo): 452 def setVar(self, var, value, **loginfo):
453 #print("var=" + str(var) + " val=" + str(value))
432 if 'op' not in loginfo: 454 if 'op' not in loginfo:
433 loginfo['op'] = "set" 455 loginfo['op'] = "set"
434 self.expand_cache = {} 456 self.expand_cache = {}
diff --git a/bitbake/lib/bb/ui/crumbs/builder.py b/bitbake/lib/bb/ui/crumbs/builder.py
index 9da926dd14..e9cfa2197c 100755
--- a/bitbake/lib/bb/ui/crumbs/builder.py
+++ b/bitbake/lib/bb/ui/crumbs/builder.py
@@ -217,26 +217,32 @@ class Configuration:
217 self.split_proxy("git", template.getVar("GIT_PROXY_HOST") + ":" + template.getVar("GIT_PROXY_PORT")) 217 self.split_proxy("git", template.getVar("GIT_PROXY_HOST") + ":" + template.getVar("GIT_PROXY_PORT"))
218 self.split_proxy("cvs", template.getVar("CVS_PROXY_HOST") + ":" + template.getVar("CVS_PROXY_PORT")) 218 self.split_proxy("cvs", template.getVar("CVS_PROXY_HOST") + ":" + template.getVar("CVS_PROXY_PORT"))
219 219
220 def save(self, template, defaults=False): 220 def save(self, handler, template, defaults=False):
221 template.setVar("VERSION", "%s" % hobVer) 221 template.setVar("VERSION", "%s" % hobVer)
222 # bblayers.conf 222 # bblayers.conf
223 template.setVar("BBLAYERS", " ".join(self.layers)) 223 handler.set_var_in_file("BBLAYERS", self.layers, "bblayers.conf")
224 # local.conf 224 # local.conf
225 if not defaults: 225 if not defaults:
226 template.setVar("MACHINE", self.curr_mach) 226 handler.set_var_in_file("MACHINE", self.curr_mach, "local.conf")
227 template.setVar("DISTRO", self.curr_distro) 227 handler.set_var_in_file("DISTRO", self.curr_distro, "local.conf")
228 template.setVar("DL_DIR", self.dldir) 228 handler.set_var_in_file("DL_DIR", self.dldir, "local.conf")
229 template.setVar("SSTATE_DIR", self.sstatedir) 229 handler.set_var_in_file("SSTATE_DIR", self.sstatedir, "local.conf")
230 template.setVar("SSTATE_MIRRORS", self.sstatemirror) 230 sstate_mirror_list = self.sstatemirror.split("\\n ")
231 template.setVar("PARALLEL_MAKE", "-j %s" % self.pmake) 231 sstate_mirror_list_modified = []
232 template.setVar("BB_NUMBER_THREADS", self.bbthread) 232 for mirror in sstate_mirror_list:
233 template.setVar("PACKAGE_CLASSES", " ".join(["package_" + i for i in self.curr_package_format.split()])) 233 if mirror != "":
234 mirror = mirror + "\\n"
235 sstate_mirror_list_modified.append(mirror)
236 handler.set_var_in_file("SSTATE_MIRRORS", sstate_mirror_list_modified, "local.conf")
237 handler.set_var_in_file("PARALLEL_MAKE", "-j %s" % self.pmake, "local.conf")
238 handler.set_var_in_file("BB_NUMBER_THREADS", self.bbthread, "local.conf")
239 handler.set_var_in_file("PACKAGE_CLASSES", " ".join(["package_" + i for i in self.curr_package_format.split()]), "local.conf")
234 template.setVar("IMAGE_ROOTFS_SIZE", self.image_rootfs_size) 240 template.setVar("IMAGE_ROOTFS_SIZE", self.image_rootfs_size)
235 template.setVar("IMAGE_EXTRA_SPACE", self.image_extra_size) 241 template.setVar("IMAGE_EXTRA_SPACE", self.image_extra_size)
236 template.setVar("INCOMPATIBLE_LICENSE", self.incompat_license) 242 template.setVar("INCOMPATIBLE_LICENSE", self.incompat_license)
237 template.setVar("SDKMACHINE", self.curr_sdk_machine) 243 template.setVar("SDKMACHINE", self.curr_sdk_machine)
238 template.setVar("CONF_VERSION", self.conf_version) 244 handler.set_var_in_file("CONF_VERSION", self.conf_version, "local.conf")
239 template.setVar("LCONF_VERSION", self.lconf_version) 245 handler.set_var_in_file("LCONF_VERSION", self.lconf_version, "bblayers.conf")
240 template.setVar("EXTRA_SETTING", self.extra_setting) 246 template.setVar("EXTRA_SETTING", self.extra_setting)
241 template.setVar("TOOLCHAIN_BUILD", self.toolchain_build) 247 template.setVar("TOOLCHAIN_BUILD", self.toolchain_build)
242 template.setVar("IMAGE_FSTYPES", self.image_fstypes) 248 template.setVar("IMAGE_FSTYPES", self.image_fstypes)
@@ -670,7 +676,7 @@ class Builder(gtk.Window):
670 self.template = TemplateMgr() 676 self.template = TemplateMgr()
671 try: 677 try:
672 self.template.open(filename, path) 678 self.template.open(filename, path)
673 self.configuration.save(self.template, defaults) 679 self.configuration.save(self.handler, self.template, defaults)
674 680
675 self.template.save() 681 self.template.save()
676 except Exception as e: 682 except Exception as e:
diff --git a/bitbake/lib/bb/ui/crumbs/hobeventhandler.py b/bitbake/lib/bb/ui/crumbs/hobeventhandler.py
index 41022ef8eb..d953f3497c 100644
--- a/bitbake/lib/bb/ui/crumbs/hobeventhandler.py
+++ b/bitbake/lib/bb/ui/crumbs/hobeventhandler.py
@@ -146,7 +146,9 @@ class HobHandler(gobject.GObject):
146 elif next_command == self.SUB_MATCH_CLASS: 146 elif next_command == self.SUB_MATCH_CLASS:
147 self.runCommand(["findFilesMatchingInDir", "rootfs_", "classes"]) 147 self.runCommand(["findFilesMatchingInDir", "rootfs_", "classes"])
148 elif next_command == self.SUB_PARSE_CONFIG: 148 elif next_command == self.SUB_PARSE_CONFIG:
149 self.runCommand(["enableDataTracking"])
149 self.runCommand(["parseConfigurationFiles", "", ""]) 150 self.runCommand(["parseConfigurationFiles", "", ""])
151 self.runCommand(["disableDataTracking"])
150 elif next_command == self.SUB_GNERATE_TGTS: 152 elif next_command == self.SUB_GNERATE_TGTS:
151 self.runCommand(["generateTargetsTree", "classes/image.bbclass", []]) 153 self.runCommand(["generateTargetsTree", "classes/image.bbclass", []])
152 elif next_command == self.SUB_GENERATE_PKGINFO: 154 elif next_command == self.SUB_GENERATE_PKGINFO:
@@ -451,6 +453,9 @@ class HobHandler(gobject.GObject):
451 ret.append(i) 453 ret.append(i)
452 return " ".join(ret) 454 return " ".join(ret)
453 455
456 def set_var_in_file(self, var, val, default_file=None):
457 self.server.runCommand(["setVarFile", var, val, default_file])
458
454 def get_parameters(self): 459 def get_parameters(self):
455 # retrieve the parameters from bitbake 460 # retrieve the parameters from bitbake
456 params = {} 461 params = {}
diff --git a/bitbake/lib/bb/ui/crumbs/template.py b/bitbake/lib/bb/ui/crumbs/template.py
index e303c3a6b8..92c438f000 100644
--- a/bitbake/lib/bb/ui/crumbs/template.py
+++ b/bitbake/lib/bb/ui/crumbs/template.py
@@ -137,8 +137,6 @@ class RecipeFile(ConfigFile):
137 137
138class TemplateMgr(gobject.GObject): 138class TemplateMgr(gobject.GObject):
139 139
140 __gLocalVars__ = ["MACHINE", "PACKAGE_CLASSES", "DISTRO", "DL_DIR", "SSTATE_DIR", "SSTATE_MIRRORS", "PARALLEL_MAKE", "BB_NUMBER_THREADS", "CONF_VERSION"]
141 __gBBLayersVars__ = ["BBLAYERS", "LCONF_VERSION"]
142 __gRecipeVars__ = ["DEPENDS", "IMAGE_INSTALL"] 140 __gRecipeVars__ = ["DEPENDS", "IMAGE_INSTALL"]
143 141
144 def __init__(self): 142 def __init__(self):
@@ -153,36 +151,20 @@ class TemplateMgr(gobject.GObject):
153 return "%s/%s%s%s" % (path, "template-", filename, ".hob") 151 return "%s/%s%s%s" % (path, "template-", filename, ".hob")
154 152
155 @classmethod 153 @classmethod
156 def convert_to_bblayers_pathfilename(cls, filename, path):
157 return "%s/%s%s%s" % (path, "bblayers-", filename, ".conf")
158
159 @classmethod
160 def convert_to_local_pathfilename(cls, filename, path):
161 return "%s/%s%s%s" % (path, "local-", filename, ".conf")
162
163 @classmethod
164 def convert_to_image_pathfilename(cls, filename, path): 154 def convert_to_image_pathfilename(cls, filename, path):
165 return "%s/%s%s%s" % (path, "hob-image-", filename, ".bb") 155 return "%s/%s%s%s" % (path, "hob-image-", filename, ".bb")
166 156
167 def open(self, filename, path): 157 def open(self, filename, path):
168 self.template_hob = HobTemplateFile(TemplateMgr.convert_to_template_pathfilename(filename, path)) 158 self.template_hob = HobTemplateFile(TemplateMgr.convert_to_template_pathfilename(filename, path))
169 self.bblayers_conf = ConfigFile(TemplateMgr.convert_to_bblayers_pathfilename(filename, path))
170 self.local_conf = ConfigFile(TemplateMgr.convert_to_local_pathfilename(filename, path))
171 self.image_bb = RecipeFile(TemplateMgr.convert_to_image_pathfilename(filename, path)) 159 self.image_bb = RecipeFile(TemplateMgr.convert_to_image_pathfilename(filename, path))
172 160
173 def setVar(self, var, val): 161 def setVar(self, var, val):
174 if var in TemplateMgr.__gLocalVars__:
175 self.local_conf.setVar(var, val)
176 if var in TemplateMgr.__gBBLayersVars__:
177 self.bblayers_conf.setVar(var, val)
178 if var in TemplateMgr.__gRecipeVars__: 162 if var in TemplateMgr.__gRecipeVars__:
179 self.image_bb.setVar(var, val) 163 self.image_bb.setVar(var, val)
180 164
181 self.template_hob.setVar(var, val) 165 self.template_hob.setVar(var, val)
182 166
183 def save(self): 167 def save(self):
184 self.local_conf.save()
185 self.bblayers_conf.save()
186 self.image_bb.save() 168 self.image_bb.save()
187 self.template_hob.save() 169 self.template_hob.save()
188 170
@@ -200,12 +182,6 @@ class TemplateMgr(gobject.GObject):
200 if self.template_hob: 182 if self.template_hob:
201 del self.template_hob 183 del self.template_hob
202 template_hob = None 184 template_hob = None
203 if self.bblayers_conf:
204 del self.bblayers_conf
205 self.bblayers_conf = None
206 if self.local_conf:
207 del self.local_conf
208 self.local_conf = None
209 if self.image_bb: 185 if self.image_bb:
210 del self.image_bb 186 del self.image_bb
211 self.image_bb = None 187 self.image_bb = None