# It also has some file merging facilities.
#
# usage:
-# awk -v arch=%{_target_base_arch} -f path/to/kernel-config.awk \
+# awk -v basearch=%{_target_base_arch} -v arch=%{_target_cpu} -f path/to/kernel-config.awk \
# kernel-important.config kernel-multiarch.config \
# kernel-%{arch}.config kernel-%{some_feature}.config \
# > .config
#
# Authors:
# - Przemysław Iskra <sparky@pld-linux.org>
+# parts based on kernel-config.py, by:
+# - arekm@pld-linux.org
+# - glen@pld-linux.org
#
# TODO:
-# - smarter arch split, there could be strings with spaces
-# ( kernel-config.py does not suppoty it either )
# - use as many warnings as possible, we want our configs to be clean
# no:
-# CONFIG_SOMETHING=n -- should warn
-# SOMETHING=n -- should warn
-# CONFIG_SOMETHING all=n -- should warn
+# CONFIG_SOMETHING=n
+# SOMETHING=n
+# CONFIG_SOMETHING all=n
# SOMETHING all=n
-# # CONFIG_SOMETHING is not set -- special case
+# # CONFIG_SOMETHING is not set -- special case
# yes/module/other
# CONFIG_SOMETHING=y
-# SOMETHING=y -- should warn
-# CONFIG_SOMETHING all=y -- should warn
+# SOMETHING=y
+# CONFIG_SOMETHING all=y
# SOMETHING all=y
# return actual file name (without path) and line number
function fileLine() {
f = FILENAME
- gsub( /^.*\//, "", f ) # strip path
+ sub( /^.*\//, "", f ) # strip path
return f " (" FNR ")"
}
print "arch= must be specified" > "/dev/stderr"
exit 1
}
+ split( arch, Archs )
+ for (i = 1; i in Archs; i++) {
+ targetLevel[ Archs[ i ] ] = i
+ }
+
shouldDie = 0
+
+ lastFile = ""
}
function dieLater( code ) {
shouldDie = code
}
+{
+ f = FILENAME
+ sub( /^.*\//, "", f ) # strip path
+ if ( f != lastFile ) {
+ print "\n# file: " f
+ lastFile = f
+ }
+}
+
# convert special case:
# # CONFIG_SOMETHING it not set
# to:
# SOMETHING all=n
-/^# CONFIG_[A-Za-z0-9_-]+ is not set$/ {
- match( $0, /CONFIG_[A-Za-z0-9_-]+/ )
+/^# CONFIG_[A-Za-z0-9_]+ is not set$/ {
+ match( $0, /CONFIG_[A-Za-z0-9_]+/ )
option = substr( $0, RSTART, RLENGTH)
$0 = option " all=n"
}
-# ignore all the comments
+# ignore all the comments and empty lines
/^#/ || /^\s*$/ {
next
}
+!/^[A-Za-z0-9_]+(=|[ \t]+[A-Za-z0-9_-]+=)/ {
+ warn( "ERROR: Incorrect line: " $0 )
+ dieLater( 3 )
+ next
+}
+
!/^CONFIG_/ {
$0 = "CONFIG_" $0
}
line = $0
value = ""
if ( option ~ /=/ ) {
- gsub( /=.*$/, "", option )
- gsub( /^[^=]*=/, "", line )
+ sub( /=.*$/, "", option )
+ sub( /^[^=]*=/, "", line )
value = line
} else {
- gsub( "^" option IFS, "", line )
- split( line, archs )
+ sub( "^" option, "", line )
+ sub( /^[ \t]*/, "", line )
+
+ delete archs
+ if ( line ~ /"/ ) {
+ # there can be white spaces
+ i = 0
+ while ( match( line, /^[^=]+="([^"]|\\")*"/ ) ) {
+ archs[ (++i) ] = substr( line, RSTART, RLENGTH )
+ line = substr( line, RSTART + RLENGTH )
+ sub( /^[ \t]*/, "", line )
+ }
+ } else {
+ split( line, archs )
+ }
+
+ level = 0
for ( i in archs ) {
- split( archs[i], opt, "=" );
- if ( opt[1] == "all" )
- value = opt[2]
-
- if ( opt[1] == arch ) {
- # found best match, don't look further
- value = opt[2]
- break
+ arch = val = archs[ i ]
+ sub( /=.*$/, "", arch )
+ sub( /^[^=]*=/, "", val )
+ tl = targetLevel[ arch ]
+ if ( tl > level ) {
+ value = val
+ level = tl
}
}
}
+ # completely ignore lines with no value
+ if ( length( value ) == 0 )
+ next
+
+ fileOption = FILENAME "/" option
+ if ( fileOption in outputByFile ) {
+ warn( "ERROR: " option " already defined in this file at line " outputByFile[ fileOption ] )
+ dieLater( 2 )
+ next
+ } else
+ outputByFile[ fileOption ] = FNR
+
if ( option in outputArray ) {
- warn( option " already defined in: " outputArray[ option ] )
+ warn( "Warning: " option " already defined in: " outputArray[ option ] )
next
- }
+ } else
+ outputArray[ option ] = fileLine()
- if ( length( value ) ) {
- if ( value == "n" )
- out = "# " option " is not set"
+ if ( value == "n" )
+ out = "# " option " is not set"
+ else {
+ out = option "=" value
+
+ if ( value == "y" || value == "m" )
+ ; # OK
+ else if ( value ~ /^"([^"]|\\")*"$/ )
+ ; # OK
+ else if ( value ~ /^-?[0-9]+$/ || value ~ /^0x[0-9A-Fa-f]+$/ )
+ ; # OK
else {
- out = option "=" value
-
- if ( value == "y" || value == "m" )
- ;
- else if ( value ~ /^"[^"]*"$/ )
- ;
- else if ( value ~ /^-?[0-9]+$/ || value ~ /^0x[0-9A-Fa-f]+$/ )
- ;
- else {
- warn( "ERROR: Incorrect value: " $0 )
- dieLater( 1 )
- }
+ warn( "ERROR: Incorrect value: " $0 )
+ dieLater( 1 )
}
-
- print out
- outputArray[ option ] = fileLine()
}
+
+ print out
}
END {