Rev 567 | Rev 573 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 567 | Rev 568 | ||
|---|---|---|---|
| Line 228... | Line 228... | ||
| 228 | res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line) |
228 | res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line) |
| 229 | if res: |
229 | if res: |
| 230 | defaults[res.group(1)] = res.group(2) |
230 | defaults[res.group(1)] = res.group(2) |
| 231 | f.close() |
231 | f.close() |
| 232 | 232 | ||
| 233 | def check_condition(text, defaults): |
233 | def check_condition(text, defaults, asked_names): |
| - | 234 | seen_vars = [ x[0] for x in asked_names ] |
|
| 234 | result = True |
235 | ctype = 'cnf' |
| - | 236 | if ')|' in text or '|(' in text: |
|
| - | 237 | ctype = 'dnf' |
|
| - | 238 | ||
| - | 239 | if ctype == 'cnf': |
|
| 235 | conds = text.split('&') |
240 | conds = text.split('&') |
| - | 241 | else: |
|
| - | 242 | conds = text.split('|') |
|
| - | 243 | ||
| 236 | for cond in conds: |
244 | for cond in conds: |
| 237 | if cond.startswith('(') and cond.endswith(')'): |
245 | if cond.startswith('(') and cond.endswith(')'): |
| 238 | cond = cond[1:-1] |
246 | cond = cond[1:-1] |
| - | 247 | ||
| 239 | if not check_dnf(cond, defaults): |
248 | inside = check_inside(cond, defaults, ctype, seen_vars) |
| - | 249 | ||
| - | 250 | if ctype == 'cnf' and not inside: |
|
| 240 | return False |
251 | return False |
| - | 252 | if ctype == 'dnf' and inside: |
|
| 241 | return True |
253 | return True |
| 242 | 254 | ||
| - | 255 | if ctype == 'cnf': |
|
| - | 256 | return True |
|
| - | 257 | return False |
|
| - | 258 | ||
| 243 | def check_dnf(text, defaults): |
259 | def check_inside(text, defaults, ctype, seen_vars): |
| 244 | """ |
260 | """ |
| 245 | Check that the condition specified on input line is True |
261 | Check that the condition specified on input line is True |
| 246 | 262 | ||
| 247 | only CNF is supported |
263 | only CNF is supported |
| 248 | """ |
264 | """ |
| - | 265 | if ctype == 'cnf': |
|
| 249 | conds = text.split('|') |
266 | conds = text.split('|') |
| - | 267 | else: |
|
| - | 268 | conds = text.split('&') |
|
| 250 | for cond in conds: |
269 | for cond in conds: |
| 251 | res = re.match(r'^(.*?)(!?=)(.*)$', cond) |
270 | res = re.match(r'^(.*?)(!?=)(.*)$', cond) |
| 252 | if not res: |
271 | if not res: |
| 253 | raise RuntimeError("Invalid condition: %s" % cond) |
272 | raise RuntimeError("Invalid condition: %s" % cond) |
| 254 | condname = res.group(1) |
273 | condname = res.group(1) |
| 255 | oper = res.group(2) |
274 | oper = res.group(2) |
| 256 | condval = res.group(3) |
275 | condval = res.group(3) |
| - | 276 | if condname not in seen_vars: |
|
| - | 277 | raise RuntimeError("Variable %s not defined before being asked." %\ |
|
| - | 278 | condname) |
|
| 257 | if not defaults.has_key(condname): |
279 | if not defaults.has_key(condname): |
| 258 | raise RuntimeError("Condition var %s does not exist: %s" % \ |
280 | raise RuntimeError("Condition var %s does not exist: %s" % \ |
| 259 | (condname,text)) |
281 | (condname,text)) |
| 260 | 282 | ||
| - | 283 | if ctype == 'cnf': |
|
| 261 | if oper=='=' and condval == defaults[condname]: |
284 | if oper == '=' and condval == defaults[condname]: |
| 262 | return True |
285 | return True |
| 263 | if oper == '!=' and condval != defaults[condname]: |
286 | if oper == '!=' and condval != defaults[condname]: |
| 264 | return True |
287 | return True |
| - | 288 | else: |
|
| - | 289 | if oper== '=' and condval != defaults[condname]: |
|
| - | 290 | return False |
|
| - | 291 | if oper== '!=' and condval == defaults[condname]: |
|
| - | 292 | print 2 |
|
| - | 293 | return False |
|
| - | 294 | if ctype=='cnf': |
|
| 265 | return False |
295 | return False |
| - | 296 | return True |
|
| 266 | 297 | ||
| 267 | def parse_config(input, output, dlg, defaults={}, askonly=None): |
298 | def parse_config(input, output, dlg, defaults={}, askonly=None): |
| 268 | "Parse configuration file and create Makefile.config on the fly" |
299 | "Parse configuration file and create Makefile.config on the fly" |
| 269 | def ask_the_question(dialog): |
300 | def ask_the_question(dialog): |
| 270 | "Ask question based on the type of variables to ask" |
301 | "Ask question based on the type of variables to ask" |
| Line 302... | Line 333... | ||
| 302 | if line.startswith('%'): |
333 | if line.startswith('%'): |
| 303 | res = re.match(r'^%\s*(?:\[(.*?)\])?\s*(.*)$', line) |
334 | res = re.match(r'^%\s*(?:\[(.*?)\])?\s*(.*)$', line) |
| 304 | if not res: |
335 | if not res: |
| 305 | raise RuntimeError('Invalid command: %s' % line) |
336 | raise RuntimeError('Invalid command: %s' % line) |
| 306 | if res.group(1): |
337 | if res.group(1): |
| 307 | if not check_condition(res.group(1), defaults): |
338 | if not check_condition(res.group(1), defaults, |
| - | 339 | asked_names): |
|
| 308 | continue |
340 | continue |
| 309 | args = res.group(2).strip().split(' ') |
341 | args = res.group(2).strip().split(' ') |
| 310 | cmd = args[0].lower() |
342 | cmd = args[0].lower() |
| 311 | args = args[1:] |
343 | args = args[1:] |
| 312 | if cmd == 'saveas': |
344 | if cmd == 'saveas': |
| Line 332... | Line 364... | ||
| 332 | vartype = res.group(3) |
364 | vartype = res.group(3) |
| 333 | 365 | ||
| 334 | default = defaults.get(varname,None) |
366 | default = defaults.get(varname,None) |
| 335 | 367 | ||
| 336 | if res.group(1): |
368 | if res.group(1): |
| 337 | if not check_condition(res.group(1), defaults): |
369 | if not check_condition(res.group(1), defaults, |
| - | 370 | asked_names): |
|
| 338 | if default is not None: |
371 | if default is not None: |
| 339 | outf.write('#!# %s = %s\n' % (varname, default)) |
372 | outf.write('#!# %s = %s\n' % (varname, default)) |
| 340 | # Clear cumulated values |
373 | # Clear cumulated values |
| 341 | comment = '' |
374 | comment = '' |
| 342 | default = None |
375 | default = None |
| Line 363... | Line 396... | ||
| 363 | # Add new line into the 'choice array' |
396 | # Add new line into the 'choice array' |
| 364 | res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line) |
397 | res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line) |
| 365 | if not res: |
398 | if not res: |
| 366 | raise RuntimeError("Bad line: %s" % line) |
399 | raise RuntimeError("Bad line: %s" % line) |
| 367 | if res.group(1): |
400 | if res.group(1): |
| 368 | if not check_condition(res.group(1),defaults): |
401 | if not check_condition(res.group(1),defaults, |
| - | 402 | asked_names): |
|
| 369 | continue |
403 | continue |
| 370 | choices.append((res.group(2), res.group(3))) |
404 | choices.append((res.group(2), res.group(3))) |
| 371 | continue |
405 | continue |
| 372 | 406 | ||
| 373 | # All other things print to output file |
407 | # All other things print to output file |
| Line 431... | Line 465... | ||
| 431 | if os.path.exists(OUTPUT): |
465 | if os.path.exists(OUTPUT): |
| 432 | os.unlink(OUTPUT) |
466 | os.unlink(OUTPUT) |
| 433 | os.rename(TMPOUTPUT, OUTPUT) |
467 | os.rename(TMPOUTPUT, OUTPUT) |
| 434 | 468 | ||
| 435 | if not defmode and dlg.yesno('Rebuild kernel?') == 'y': |
469 | if not defmode and dlg.yesno('Rebuild kernel?') == 'y': |
| 436 | os.execlp('make','make','clean','all') |
470 | os.execlp('make','make','clean','build') |
| 437 | 471 | ||
| 438 | if __name__ == '__main__': |
472 | if __name__ == '__main__': |
| 439 | main() |
473 | main() |