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