]> git.pld-linux.org Git - packages/kernel.git/blob - kernel-config.awk
- fixed bug where script was using value from last option
[packages/kernel.git] / kernel-config.awk
1 # $Id$
2 # A script for building kernel config from multiarch config file.
3 # It also has some file merging facilities.
4 #
5 # usage:
6 #  awk -v basearch=%{_target_base_arch} -v arch=%{_target_cpu} -f path/to/kernel-config.awk \
7 #    kernel-important.config kernel-multiarch.config \
8 #    kernel-%{arch}.config kernel-%{some_feature}.config \
9 #     > .config
10 #
11 # Authors:
12 # - Przemysław Iskra <sparky@pld-linux.org>
13 # parts based on kernel-config.py, by:
14 # - arekm@pld-linux.org
15 # - glen@pld-linux.org
16
17 # TODO:
18 #  - use as many warnings as possible, we want our configs to be clean
19
20 # no:
21 # CONFIG_SOMETHING=n
22 # SOMETHING=n
23 # CONFIG_SOMETHING all=n
24 # SOMETHING all=n
25 # # CONFIG_SOMETHING is not set -- special case
26
27 # yes/module/other
28 # CONFIG_SOMETHING=y
29 # SOMETHING=y
30 # CONFIG_SOMETHING all=y
31 # SOMETHING all=y
32
33
34 # return actual file name (without path) and line number
35 function fileLine() {
36         f = FILENAME
37         sub( /^.*\//, "", f ) # strip path
38
39         return f " (" FNR ")"
40 }
41
42 function warn( msg ) {
43         print fileLine() ": " msg > "/dev/stderr"
44 }
45
46 BEGIN {
47         if ( ! arch ) {
48                 print "arch= must be specified" > "/dev/stderr"
49                 exit 1
50         }
51         if ( ! basearch )
52                 basearch = arch
53
54         targetLevel[ "all" ] = 1
55         targetLevel[ basearch ] = 2
56         targetLevel[ arch ] = 3
57
58         shouldDie = 0
59 }
60
61 function dieLater( code ) {
62         if ( shouldDie < code )
63                 shouldDie = code
64 }
65
66 # convert special case:
67 # # CONFIG_SOMETHING it not set
68 # to:
69 # SOMETHING all=n
70 /^# CONFIG_[A-Za-z0-9_]+ is not set$/ {
71         match( $0, /CONFIG_[A-Za-z0-9_]+/ )
72         option = substr( $0, RSTART, RLENGTH)
73         $0 = option " all=n"
74 }
75
76 # ignore all the comments and empty lines
77 /^#/ || /^\s*$/ {
78         next
79 }
80
81 !/^[A-Za-z0-9_]+(=|[ \t]+[A-Za-z0-9_-]+=)/ {
82         warn( "ERROR: Incorrect line: " $0 )
83         dieLater( 3 )
84         next
85 }
86
87 !/^CONFIG_/ {
88         $0 = "CONFIG_" $0
89 }
90
91 {
92         option = $1
93         line = $0
94         value = ""
95         if ( option ~ /=/ ) {
96                 sub( /=.*$/, "", option )
97                 sub( /^[^=]*=/, "", line )
98                 value = line
99         } else {
100                 sub( "^" option, "", line )
101                 sub( /^[ \t]*/, "", line )
102
103                 delete archs
104                 if ( line ~ /"/ ) {
105                         # there can be white spaces
106                         i = 0
107                         while ( match( line, /^[^=]+="([^"]|\\")*"/ ) ) {
108                                 archs[ (++i) ] = substr( line, RSTART, RLENGTH )
109                                 line = substr( line, RSTART + RLENGTH )
110                                 sub( /^[ \t]*/, "", line )
111                         }
112                 } else {
113                         split( line, archs )
114                 }
115
116                 level = 0
117                 for ( i in archs ) {
118                         arch = val = archs[ i ]
119                         sub( /=.*$/, "", arch )
120                         sub( /^[^=]*=/, "", val )
121                         tl = targetLevel[ arch ]
122                         if ( tl > level ) {
123                                 value = val
124                                 level = tl
125                         }
126                 }
127         }
128
129         # completely ignore lines with no value
130         if ( length( value ) == 0 )
131                 next
132
133         fileOption = FILENAME "/" option
134         if ( fileOption in outputByFile ) {
135                 warn( "ERROR: " option " already defined in this file at line " outputByFile[ fileOption ] )
136                 dieLater( 2 )
137                 next
138         } else
139                 outputByFile[ fileOption ] = FNR
140
141         if ( option in outputArray ) {
142                 warn( "Warning: " option " already defined in: " outputArray[ option ] )
143                 next
144         } else
145                 outputArray[ option ] = fileLine()
146
147         if ( value == "n" )
148                 out = "# " option " is not set"
149         else {
150                 out = option "=" value
151
152                 if ( value == "y" || value == "m" )
153                         ; # OK
154                 else if ( value ~ /^"([^"]|\\")*"$/ )
155                         ; # OK
156                 else if ( value ~ /^-?[0-9]+$/ || value ~ /^0x[0-9A-Fa-f]+$/ )
157                         ; # OK
158                 else {
159                         warn( "ERROR: Incorrect value: " $0 )
160                         dieLater( 1 )
161                 }
162         }
163         
164         print out
165 }
166
167 END {
168         exit shouldDie
169 }
This page took 0.204234 seconds and 4 git commands to generate.