summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorCristiana Voicu <cristiana.voicu@intel.com>2013-01-25 16:10:12 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-01-31 12:46:19 +0000
commitf0aef9953d3504e673c8572f1ae64cefdf678b0f (patch)
tree51ff6cfd3d4d307074eb5ffd9956ee177c75717c /bitbake/lib
parent33c6c411ea7ada066122b758b05abf7472ca0a16 (diff)
downloadpoky-f0aef9953d3504e673c8572f1ae64cefdf678b0f.tar.gz
bitbake: bitbake & hob: implement functions to assure consistency for configuration files
Added a new command in bitbake to save a variable in a file; added a function in cooker which is called by this command. Added new command in bitbake to enable/disable data tracking. The function saveConfigurationVar from cooker.py saves a variable in the file that is received by argument. It checks all the operations made on that variable, using the history. If it's the first time when it does some changes on a variable,it comments the lines where an operation is made on it, and it sets it in a line to the end of file. If it's not the first time(it has a comment before), it replaces the line. Made some changes in hob to save the variables from bblayers.conf and local.conf using the bitbake command. [YOCTO #2934] (Bitbake rev: 55b814ccfa413d461d12956896364ab63eed70a8) Signed-off-by: Cristiana Voicu <cristiana.voicu@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-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