Subversion Repositories HelenOS-historic

Rev

Rev 566 | Rev 568 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 566 Rev 567
1
#!/usr/bin/env python
1
#!/usr/bin/env python
2
"""
2
"""
3
Kernel configuration script
3
Kernel configuration script
4
"""
4
"""
5
import sys
5
import sys
6
import os
6
import os
7
import re
7
import re
8
import commands
8
import commands
9
 
9
 
10
INPUT = 'kernel.config'
10
INPUT = 'kernel.config'
11
OUTPUT = 'Makefile.config'
11
OUTPUT = 'Makefile.config'
12
TMPOUTPUT = 'Makefile.config.tmp'
12
TMPOUTPUT = 'Makefile.config.tmp'
13
 
13
 
14
class DefaultDialog:
14
class DefaultDialog:
15
    "Wrapper dialog that tries to return default values"
15
    "Wrapper dialog that tries to return default values"
16
    def __init__(self, dlg):
16
    def __init__(self, dlg):
17
        self.dlg = dlg
17
        self.dlg = dlg
18
 
18
 
19
    def set_title(self,text):
19
    def set_title(self,text):
20
        self.dlg.set_title(text)
20
        self.dlg.set_title(text)
21
       
21
       
22
    def yesno(self, text, default=None):
22
    def yesno(self, text, default=None):
23
        if default is not None:
23
        if default is not None:
24
            return default
24
            return default
25
        return self.dlg.yesno(text, default)
25
        return self.dlg.yesno(text, default)
26
    def noyes(self, text, default=None):
26
    def noyes(self, text, default=None):
27
        if default is not None:
27
        if default is not None:
28
            return default
28
            return default
29
        return self.dlg.noyes(text, default)
29
        return self.dlg.noyes(text, default)
30
   
30
   
31
    def choice(self, text, choices, defopt=None):
31
    def choice(self, text, choices, defopt=None):
32
        if defopt is not None:
32
        if defopt is not None:
33
            return choices[defopt][0]
33
            return choices[defopt][0]
34
        return self.dlg.choice(text, choices, defopt)
34
        return self.dlg.choice(text, choices, defopt)
35
 
35
 
36
class NoDialog:
36
class NoDialog:
37
    def __init__(self):
37
    def __init__(self):
38
        self.printed = None
38
        self.printed = None
39
        self.title = 'HelenOS Configuration'
39
        self.title = 'HelenOS Configuration'
40
 
40
 
41
    def print_title(self):
41
    def print_title(self):
42
        if not self.printed:
42
        if not self.printed:
43
            sys.stdout.write("\n*** %s ***\n" % self.title)
43
            sys.stdout.write("\n*** %s ***\n" % self.title)
44
            self.printed = True
44
            self.printed = True
45
 
45
 
46
    def set_title(self, text):
46
    def set_title(self, text):
47
        self.title = text
47
        self.title = text
48
        self.printed = False
48
        self.printed = False
49
   
49
   
50
    def noyes(self, text, default=None):
50
    def noyes(self, text, default=None):
51
        if not default:
51
        if not default:
52
            default = 'n'
52
            default = 'n'
53
        return self.yesno(text, default)
53
        return self.yesno(text, default)
54
   
54
   
55
    def yesno(self, text, default=None):
55
    def yesno(self, text, default=None):
56
        self.print_title()
56
        self.print_title()
57
       
57
       
58
        if default != 'n':
58
        if default != 'n':
59
            default = 'y'
59
            default = 'y'
60
        while 1:
60
        while 1:
61
            sys.stdout.write("%s (y/n)[%s]: " % (text,default))
61
            sys.stdout.write("%s (y/n)[%s]: " % (text,default))
62
            inp = sys.stdin.readline()
62
            inp = sys.stdin.readline()
63
            if not inp:
63
            if not inp:
64
                raise EOFError
64
                raise EOFError
65
            inp = inp.strip().lower()
65
            inp = inp.strip().lower()
66
            if not inp:
66
            if not inp:
67
                return default
67
                return default
68
            if inp == 'y':
68
            if inp == 'y':
69
                return 'y'
69
                return 'y'
70
            elif inp == 'n':
70
            elif inp == 'n':
71
                return 'n'
71
                return 'n'
72
 
72
 
73
    def _print_choice(self, text, choices, defopt):
73
    def _print_choice(self, text, choices, defopt):
74
        sys.stdout.write('%s:\n' % text)
74
        sys.stdout.write('%s:\n' % text)
75
        for i,(text,descr) in enumerate(choices):
75
        for i,(text,descr) in enumerate(choices):
76
            sys.stdout.write('\t%2d. %s\n' % (i, descr))
76
            sys.stdout.write('\t%2d. %s\n' % (i, descr))
77
        if defopt is not None:
77
        if defopt is not None:
78
            sys.stdout.write('Enter choice number[%d]: ' % defopt)
78
            sys.stdout.write('Enter choice number[%d]: ' % defopt)
79
        else:
79
        else:
80
            sys.stdout.write('Enter choice number: ')
80
            sys.stdout.write('Enter choice number: ')
81
 
81
 
82
    def menu(self, text, choices, button, defopt=None):
82
    def menu(self, text, choices, button, defopt=None):
83
        menu = []
83
        menu = []
84
        for key, descr in choices:
84
        for key, descr in choices:
85
            txt = key + (45-len(key))*' ' + ': ' + descr
85
            txt = key + (45-len(key))*' ' + ': ' + descr
86
            menu.append((key, txt))
86
            menu.append((key, txt))
87
           
87
           
88
        return self.choice(text, [button] + menu)
88
        return self.choice(text, [button] + menu)
89
       
89
       
90
    def choice(self, text, choices, defopt=None):
90
    def choice(self, text, choices, defopt=None):
91
        self.print_title()
91
        self.print_title()
92
        while 1:
92
        while 1:
93
            self._print_choice(text, choices, defopt)
93
            self._print_choice(text, choices, defopt)
94
            inp = sys.stdin.readline()
94
            inp = sys.stdin.readline()
95
            if not inp:
95
            if not inp:
96
                raise EOFError
96
                raise EOFError
97
            if not inp.strip():
97
            if not inp.strip():
98
                if defopt is not None:
98
                if defopt is not None:
99
                    return choices[defopt][0]
99
                    return choices[defopt][0]
100
                continue
100
                continue
101
            try:
101
            try:
102
                number = int(inp.strip())
102
                number = int(inp.strip())
103
            except ValueError:
103
            except ValueError:
104
                continue
104
                continue
105
            if number < 0 or number >= len(choices):
105
            if number < 0 or number >= len(choices):
106
                continue
106
                continue
107
            return choices[number][0]
107
            return choices[number][0]
108
 
108
 
109
 
109
 
110
class Dialog(NoDialog):
110
class Dialog(NoDialog):
111
    def __init__(self):
111
    def __init__(self):
112
        NoDialog.__init__(self)
112
        NoDialog.__init__(self)
113
        self.dlgcmd = os.environ.get('DIALOG','dialog')
113
        self.dlgcmd = os.environ.get('DIALOG','dialog')
114
        self.title = ''
114
        self.title = ''
115
        self.backtitle = 'HelenOS Kernel Configuration'
115
        self.backtitle = 'HelenOS Kernel Configuration'
116
       
116
       
117
        if os.system('%s --print-maxsize >/dev/null 2>&1' % self.dlgcmd) != 0:
117
        if os.system('%s --print-maxsize >/dev/null 2>&1' % self.dlgcmd) != 0:
118
            raise NotImplementedError
118
            raise NotImplementedError
119
 
119
 
120
    def set_title(self,text):
120
    def set_title(self,text):
121
        self.title = text
121
        self.title = text
122
       
122
       
123
    def calldlg(self,*args,**kw):
123
    def calldlg(self,*args,**kw):
124
        "Wrapper for calling 'dialog' program"
124
        "Wrapper for calling 'dialog' program"
125
        indesc, outdesc = os.pipe()
125
        indesc, outdesc = os.pipe()
126
        pid = os.fork()
126
        pid = os.fork()
127
        if not pid:
127
        if not pid:
128
            os.close(2)
128
            os.close(2)
129
            os.dup(outdesc)
129
            os.dup(outdesc)
130
            os.close(indesc)
130
            os.close(indesc)
131
           
131
           
132
            dlgargs = [self.dlgcmd,'--title',self.title,
132
            dlgargs = [self.dlgcmd,'--title',self.title,
133
                       '--backtitle', self.backtitle]
133
                       '--backtitle', self.backtitle]
134
            for key,val in kw.items():
134
            for key,val in kw.items():
135
                dlgargs.append('--'+key)
135
                dlgargs.append('--'+key)
136
                dlgargs.append(val)
136
                dlgargs.append(val)
137
            dlgargs += args            
137
            dlgargs += args            
138
            os.execlp(self.dlgcmd,*dlgargs)
138
            os.execlp(self.dlgcmd,*dlgargs)
139
 
139
 
140
        os.close(outdesc)
140
        os.close(outdesc)
141
       
141
       
142
        try:
142
        try:
143
            errout = os.fdopen(indesc,'r')
143
            errout = os.fdopen(indesc,'r')
144
            data = errout.read()
144
            data = errout.read()
145
            errout.close()
145
            errout.close()
146
            pid,status = os.wait()
146
            pid,status = os.wait()
147
        except:
147
        except:
148
            os.system('reset') # Reset terminal
148
            os.system('reset') # Reset terminal
149
            raise
149
            raise
150
       
150
       
151
        if not os.WIFEXITED(status):
151
        if not os.WIFEXITED(status):
152
            os.system('reset') # Reset terminal
152
            os.system('reset') # Reset terminal
153
            raise EOFError
153
            raise EOFError
154
       
154
       
155
        status = os.WEXITSTATUS(status)
155
        status = os.WEXITSTATUS(status)
156
        if status == 255:
156
        if status == 255:
157
            raise EOFError
157
            raise EOFError
158
        return status,data
158
        return status,data
159
       
159
       
160
    def yesno(self, text, default=None):
160
    def yesno(self, text, default=None):
161
        if text[-1] not in ('?',':'):
161
        if text[-1] not in ('?',':'):
162
            text = text + ':'
162
            text = text + ':'
163
        width = '50'
163
        width = '50'
164
        height = '5'
164
        height = '5'
165
        if len(text) < 48:
165
        if len(text) < 48:
166
            text = ' '*int(((48-len(text))/2)) + text
166
            text = ' '*int(((48-len(text))/2)) + text
167
        else:
167
        else:
168
            width = '0'
168
            width = '0'
169
            height = '0'
169
            height = '0'
170
        if default == 'n':
170
        if default == 'n':
171
            res,data = self.calldlg('--defaultno','--yesno',text,height,width)
171
            res,data = self.calldlg('--defaultno','--yesno',text,height,width)
172
        else:
172
        else:
173
            res,data = self.calldlg('--yesno',text,height,width)
173
            res,data = self.calldlg('--yesno',text,height,width)
174
 
174
 
175
        if res == 0:
175
        if res == 0:
176
            return 'y'
176
            return 'y'
177
        return 'n'
177
        return 'n'
178
 
178
 
179
    def menu(self, text, choices, button, defopt=None):
179
    def menu(self, text, choices, button, defopt=None):
180
        text = text + ':'
180
        text = text + ':'
181
        width = '70'
181
        width = '70'
182
        height = str(8 + len(choices))
182
        height = str(8 + len(choices))
183
        args = []
183
        args = []
184
        for key,val in choices:
184
        for key,val in choices:
185
            args.append(key)
185
            args.append(key)
186
            args.append(val)
186
            args.append(val)
187
 
187
 
188
        kw = {}
188
        kw = {}
189
        if defopt:
189
        if defopt:
190
            kw['default-item'] = choices[defopt][0]
190
            kw['default-item'] = choices[defopt][0]
191
        res,data = self.calldlg('--extra-label',button[1],
191
        res,data = self.calldlg('--ok-label','Change',
-
 
192
                                '--extra-label',button[1],
192
                                '--extra-button',
193
                                '--extra-button',
193
                                '--menu',text,height,width,
194
                                '--menu',text,height,width,
194
                                str(len(choices)),*args,**kw)
195
                                str(len(choices)),*args,**kw)
195
        if res == 3:
196
        if res == 3:
196
            return button[0]
197
            return button[0]
197
        if res == 1: # Cancel
198
        if res == 1: # Cancel
198
            sys.exit(1)
199
            sys.exit(1)
199
        elif res:
200
        elif res:
200
            print data
201
            print data
201
            raise EOFError
202
            raise EOFError
202
        return data
203
        return data
203
   
204
   
204
    def choice(self, text, choices, defopt=None):
205
    def choice(self, text, choices, defopt=None):
205
        text = text + ':'
206
        text = text + ':'
206
        width = '50'
207
        width = '50'
207
        height = str(8 + len(choices))
208
        height = str(8 + len(choices))
208
        args = []
209
        args = []
209
        for key,val in choices:
210
        for key,val in choices:
210
            args.append(key)
211
            args.append(key)
211
            args.append(val)
212
            args.append(val)
212
 
213
 
213
        kw = {}
214
        kw = {}
214
        if defopt:
215
        if defopt:
215
            kw['default-item'] = choices[defopt][0]
216
            kw['default-item'] = choices[defopt][0]
216
        res,data = self.calldlg('--nocancel','--menu',text,height,width,
217
        res,data = self.calldlg('--nocancel','--menu',text,height,width,
217
                                str(len(choices)),*args, **kw)
218
                                str(len(choices)),*args, **kw)
218
        if res:
219
        if res:
219
            print data
220
            print data
220
            raise EOFError
221
            raise EOFError
221
        return data
222
        return data
222
   
223
   
223
def read_defaults(fname,defaults):
224
def read_defaults(fname,defaults):
224
    "Read saved values from last configuration run"
225
    "Read saved values from last configuration run"
225
    f = file(fname,'r')
226
    f = file(fname,'r')
226
    for line in f:
227
    for line in f:
227
        res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line)
228
        res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line)
228
        if res:
229
        if res:
229
            defaults[res.group(1)] = res.group(2)
230
            defaults[res.group(1)] = res.group(2)
230
    f.close()
231
    f.close()
231
 
232
 
232
def check_condition(text, defaults):
233
def check_condition(text, defaults):
233
    result = True
234
    result = True
234
    conds = text.split('&')
235
    conds = text.split('&')
235
    for cond in conds:
236
    for cond in conds:
236
        if cond.startswith('(') and cond.endswith(')'):
237
        if cond.startswith('(') and cond.endswith(')'):
237
            cond = cond[1:-1]
238
            cond = cond[1:-1]
238
        if not check_dnf(cond, defaults):
239
        if not check_dnf(cond, defaults):
239
            return False
240
            return False
240
    return True
241
    return True
241
 
242
 
242
def check_dnf(text, defaults):
243
def check_dnf(text, defaults):
243
    """
244
    """
244
    Check that the condition specified on input line is True
245
    Check that the condition specified on input line is True
245
 
246
 
246
    only CNF is supported
247
    only CNF is supported
247
    """
248
    """
248
    conds = text.split('|')
249
    conds = text.split('|')
249
    for cond in conds:
250
    for cond in conds:
250
        res = re.match(r'^(.*?)(!?=)(.*)$', cond)
251
        res = re.match(r'^(.*?)(!?=)(.*)$', cond)
251
        if not res:
252
        if not res:
252
            raise RuntimeError("Invalid condition: %s" % cond)
253
            raise RuntimeError("Invalid condition: %s" % cond)
253
        condname = res.group(1)
254
        condname = res.group(1)
254
        oper = res.group(2)
255
        oper = res.group(2)
255
        condval = res.group(3)
256
        condval = res.group(3)
256
        if not defaults.has_key(condname):
257
        if not defaults.has_key(condname):
257
            raise RuntimeError("Condition var %s does not exist: %s" % \
258
            raise RuntimeError("Condition var %s does not exist: %s" % \
258
                               (condname,text))
259
                               (condname,text))
259
 
260
 
260
        if oper=='=' and  condval == defaults[condname]:
261
        if oper=='=' and  condval == defaults[condname]:
261
            return True
262
            return True
262
        if oper == '!=' and condval != defaults[condname]:
263
        if oper == '!=' and condval != defaults[condname]:
263
            return True
264
            return True
264
    return False
265
    return False
265
 
266
 
266
def parse_config(input, output, dlg, defaults={}, askonly=None):
267
def parse_config(input, output, dlg, defaults={}, askonly=None):
267
    "Parse configuration file and create Makefile.config on the fly"
268
    "Parse configuration file and create Makefile.config on the fly"
268
    def ask_the_question(dialog):
269
    def ask_the_question(dialog):
269
        "Ask question based on the type of variables to ask"
270
        "Ask question based on the type of variables to ask"
270
        # This is quite a hack, this thingy is written just to
271
        # This is quite a hack, this thingy is written just to
271
        # have access to local variables..
272
        # have access to local variables..
272
        if vartype == 'y/n':
273
        if vartype == 'y/n':
273
            return dialog.yesno(comment, default)
274
            return dialog.yesno(comment, default)
274
        elif vartype == 'n/y':
275
        elif vartype == 'n/y':
275
            return dialog.noyes(comment, default)
276
            return dialog.noyes(comment, default)
276
        elif vartype == 'choice':
277
        elif vartype == 'choice':
277
            defopt = None
278
            defopt = None
278
            if default is not None:
279
            if default is not None:
279
                for i,(key,val) in enumerate(choices):
280
                for i,(key,val) in enumerate(choices):
280
                    if key == default:
281
                    if key == default:
281
                        defopt = i
282
                        defopt = i
282
                        break
283
                        break
283
            return dialog.choice(comment, choices, defopt)
284
            return dialog.choice(comment, choices, defopt)
284
        else:
285
        else:
285
            raise RuntimeError("Bad method: %s" % vartype)
286
            raise RuntimeError("Bad method: %s" % vartype)
286
 
287
 
287
   
288
   
288
    f = file(input, 'r')
289
    f = file(input, 'r')
289
    outf = file(output, 'w')
290
    outf = file(output, 'w')
290
 
291
 
291
    outf.write('#########################################\n')
292
    outf.write('#########################################\n')
292
    outf.write('## AUTO-GENERATED FILE, DO NOT EDIT!!! ##\n')
293
    outf.write('## AUTO-GENERATED FILE, DO NOT EDIT!!! ##\n')
293
    outf.write('#########################################\n\n')
294
    outf.write('#########################################\n\n')
294
 
295
 
295
    asked_names = []
296
    asked_names = []
296
 
297
 
297
    comment = ''
298
    comment = ''
298
    default = None
299
    default = None
299
    choices = []
300
    choices = []
300
    for line in f:
301
    for line in f:
301
        if line.startswith('%'):
302
        if line.startswith('%'):
302
            res = re.match(r'^%\s*(?:\[(.*?)\])?\s*(.*)$', line)
303
            res = re.match(r'^%\s*(?:\[(.*?)\])?\s*(.*)$', line)
303
            if not res:
304
            if not res:
304
                raise RuntimeError('Invalid command: %s' % line)
305
                raise RuntimeError('Invalid command: %s' % line)
305
            if res.group(1):
306
            if res.group(1):
306
                if not check_condition(res.group(1), defaults):
307
                if not check_condition(res.group(1), defaults):
307
                    continue
308
                    continue
308
            args = res.group(2).strip().split(' ')
309
            args = res.group(2).strip().split(' ')
309
            cmd = args[0].lower()
310
            cmd = args[0].lower()
310
            args = args[1:]
311
            args = args[1:]
311
            if cmd == 'saveas':
312
            if cmd == 'saveas':
312
                outf.write('%s = %s\n' % (args[1],defaults[args[0]]))
313
                outf.write('%s = %s\n' % (args[1],defaults[args[0]]))
313
            elif cmd == 'shellcmd':
314
            elif cmd == 'shellcmd':
314
                varname = args[0]
315
                varname = args[0]
315
                args = args[1:]
316
                args = args[1:]
316
                for i,arg in enumerate(args):
317
                for i,arg in enumerate(args):
317
                    if arg.startswith('$'):
318
                    if arg.startswith('$'):
318
                        args[i] = defaults[arg[1:]]
319
                        args[i] = defaults[arg[1:]]
319
                data,status = commands.getstatusoutput(' '.join(args))
320
                data,status = commands.getstatusoutput(' '.join(args))
320
                if status:
321
                if status:
321
                    raise RuntimeError('Error running: %s' % ' '.join(args))
322
                    raise RuntimeError('Error running: %s' % ' '.join(args))
322
                outf.write('%s = %s\n' % (varname,data.strip()))
323
                outf.write('%s = %s\n' % (varname,data.strip()))
323
            continue
324
            continue
324
           
325
           
325
        if line.startswith('!'):
326
        if line.startswith('!'):
326
            # Ask a question
327
            # Ask a question
327
            res = re.search(r'!\s*(?:\[(.*?)\])?\s*([^\s]+)\s*\((.*)\)\s*$', line)
328
            res = re.search(r'!\s*(?:\[(.*?)\])?\s*([^\s]+)\s*\((.*)\)\s*$', line)
328
            if not res:
329
            if not res:
329
                raise RuntimeError("Weird line: %s" % line)
330
                raise RuntimeError("Weird line: %s" % line)
330
            varname = res.group(2)
331
            varname = res.group(2)
331
            vartype = res.group(3)
332
            vartype = res.group(3)
332
 
333
 
333
            default = defaults.get(varname,None)
334
            default = defaults.get(varname,None)
334
           
335
           
335
            if res.group(1):
336
            if res.group(1):
336
                if not check_condition(res.group(1), defaults):
337
                if not check_condition(res.group(1), defaults):
337
                    if default is not None:
338
                    if default is not None:
338
                        outf.write('#!# %s = %s\n' % (varname, default))
339
                        outf.write('#!# %s = %s\n' % (varname, default))
339
                    # Clear cumulated values
340
                    # Clear cumulated values
340
                    comment = ''
341
                    comment = ''
341
                    default = None
342
                    default = None
342
                    choices = []
343
                    choices = []
343
                    continue
344
                    continue
344
               
345
               
345
            asked_names.append((varname,comment))
346
            asked_names.append((varname,comment))
346
 
347
 
347
            if default is None or not askonly or askonly == varname:
348
            if default is None or not askonly or askonly == varname:
348
                default = ask_the_question(dlg)
349
                default = ask_the_question(dlg)
349
            else:
350
            else:
350
                default = ask_the_question(DefaultDialog(dlg))
351
                default = ask_the_question(DefaultDialog(dlg))
351
 
352
 
352
            outf.write('%s = %s\n' % (varname, default))
353
            outf.write('%s = %s\n' % (varname, default))
353
            # Remeber the selected value
354
            # Remeber the selected value
354
            defaults[varname] = default
355
            defaults[varname] = default
355
            # Clear cumulated values
356
            # Clear cumulated values
356
            comment = ''
357
            comment = ''
357
            default = None
358
            default = None
358
            choices = []
359
            choices = []
359
            continue
360
            continue
360
       
361
       
361
        if line.startswith('@'):
362
        if line.startswith('@'):
362
            # Add new line into the 'choice array' 
363
            # Add new line into the 'choice array' 
363
            res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line)
364
            res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line)
364
            if not res:
365
            if not res:
365
                raise RuntimeError("Bad line: %s" % line)
366
                raise RuntimeError("Bad line: %s" % line)
366
            if res.group(1):
367
            if res.group(1):
367
                if not check_condition(res.group(1),defaults):
368
                if not check_condition(res.group(1),defaults):
368
                    continue
369
                    continue
369
            choices.append((res.group(2), res.group(3)))
370
            choices.append((res.group(2), res.group(3)))
370
            continue
371
            continue
371
 
372
 
372
        # All other things print to output file
373
        # All other things print to output file
373
        outf.write(line)
374
        outf.write(line)
374
        if re.match(r'^#[^#]', line):
375
        if re.match(r'^#[^#]', line):
375
            # Last comment before question will be displayed to the user
376
            # Last comment before question will be displayed to the user
376
            comment = line[1:].strip()
377
            comment = line[1:].strip()
377
        elif line.startswith('## '):
378
        elif line.startswith('## '):
378
            # Set title of the dialog window
379
            # Set title of the dialog window
379
            dlg.set_title(line[2:].strip())
380
            dlg.set_title(line[2:].strip())
380
 
381
 
381
    outf.write('\n')
382
    outf.write('\n')
382
    outf.write('REVISION=%s\n' % commands.getoutput('svnversion . 2> /dev/null'))
383
    outf.write('REVISION=%s\n' % commands.getoutput('svnversion . 2> /dev/null'))
383
    outf.write('TIMESTAMP=%s\n' % commands.getoutput('date "+%Y-%m-%d %H:%M:%S"'))
384
    outf.write('TIMESTAMP=%s\n' % commands.getoutput('date "+%Y-%m-%d %H:%M:%S"'))
384
    outf.close()
385
    outf.close()
385
    f.close()
386
    f.close()
386
    return asked_names
387
    return asked_names
387
 
388
 
388
def main():
389
def main():
389
    defaults = {}
390
    defaults = {}
390
    try:
391
    try:
391
        dlg = Dialog()
392
        dlg = Dialog()
392
    except NotImplementedError:
393
    except NotImplementedError:
393
        dlg = NoDialog()
394
        dlg = NoDialog()
394
 
395
 
395
    if len(sys.argv) == 2 and sys.argv[1]=='default':
396
    if len(sys.argv) == 2 and sys.argv[1]=='default':
396
        defmode = True
397
        defmode = True
397
    else:
398
    else:
398
        defmode = False
399
        defmode = False
399
 
400
 
400
    # Default run will update the configuration file
401
    # Default run will update the configuration file
401
    # with newest options
402
    # with newest options
402
    if os.path.exists(OUTPUT):
403
    if os.path.exists(OUTPUT):
403
        read_defaults(OUTPUT, defaults)
404
        read_defaults(OUTPUT, defaults)
404
 
405
 
405
    # Dry run only with defaults
406
    # Dry run only with defaults
406
    varnames = parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults)
407
    varnames = parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults)
407
    # If not in default mode, present selection of all possibilities
408
    # If not in default mode, present selection of all possibilities
408
    if not defmode:
409
    if not defmode:
409
        defopt = 0
410
        defopt = 0
410
        while 1:
411
        while 1:
411
            # varnames contains variable names that were in the
412
            # varnames contains variable names that were in the
412
            # last question set
413
            # last question set
413
            choices = [ (x[1],defaults[x[0]]) for x in varnames ]
414
            choices = [ (x[1],defaults[x[0]]) for x in varnames ]
414
            res = dlg.menu('Configuration',choices,('save','Save'),defopt)
415
            res = dlg.menu('Configuration',choices,('save','Save'),defopt)
415
            if res == 'save':
416
            if res == 'save':
416
                parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults)
417
                parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults)
417
                break
418
                break
418
            # transfer description back to varname
419
            # transfer description back to varname
419
            for i,(vname,descr) in enumerate(varnames):
420
            for i,(vname,descr) in enumerate(varnames):
420
                if res == descr:
421
                if res == descr:
421
                    defopt = i
422
                    defopt = i
422
                    break
423
                    break
423
            # Ask the user a simple question, produce output
424
            # Ask the user a simple question, produce output
424
            # as if the user answered all the other questions
425
            # as if the user answered all the other questions
425
            # with default answer
426
            # with default answer
426
            varnames = parse_config(INPUT, TMPOUTPUT, dlg, defaults,
427
            varnames = parse_config(INPUT, TMPOUTPUT, dlg, defaults,
427
                                    askonly=varnames[i][0])
428
                                    askonly=varnames[i][0])
428
       
429
       
429
   
430
   
430
    if os.path.exists(OUTPUT):
431
    if os.path.exists(OUTPUT):
431
        os.unlink(OUTPUT)
432
        os.unlink(OUTPUT)
432
    os.rename(TMPOUTPUT, OUTPUT)
433
    os.rename(TMPOUTPUT, OUTPUT)
433
   
434
   
434
    if not defmode and dlg.yesno('Rebuild kernel?') == 'y':
435
    if not defmode and dlg.yesno('Rebuild kernel?') == 'y':
435
        os.execlp('make','make','clean','all')
436
        os.execlp('make','make','clean','all')
436
 
437
 
437
if __name__ == '__main__':
438
if __name__ == '__main__':
438
    main()
439
    main()
439
 
440