X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=kernel-config.awk;h=9ac5a946b00117568d519758f1526ee61f09f207;hb=96f9c67f08faa78b1f5f4ad8404e371d811a1108;hp=9408ad0cf6fea5fe7d73cc337d6e7b729c9dc895;hpb=c5f08860f43022dceccb77d6650b147bed3eed85;p=packages%2Fkernel.git diff --git a/kernel-config.awk b/kernel-config.awk index 9408ad0c..9ac5a946 100644 --- a/kernel-config.awk +++ b/kernel-config.awk @@ -3,39 +3,38 @@ # 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 +# parts based on kernel-config.py, by: +# - arekm@pld-linux.org +# - glen@pld-linux.org # # TODO: -# - check value correctness, should allow only: -# y, m, n, -[0-9]+, 0x[0-9A-Fa-f]+, ".*" -# - 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 ")" } @@ -49,23 +48,51 @@ BEGIN { 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 ) { + if ( shouldDie < 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 } @@ -75,40 +102,77 @@ BEGIN { 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 } } } - if ( option in outputArray ) { - warn( option " already defined in: " outputArray[ option ] ) + # completely ignore lines with no value + if ( length( value ) == 0 ) next - } - if ( length( value ) ) { - if ( value == "n" ) - out = "# " option " is not set" - else - out = option "=" value - - print out + 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( "Warning: " option " already defined in: " outputArray[ option ] ) + next + } else outputArray[ option ] = fileLine() + + 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 { + warn( "ERROR: Incorrect value: " $0 ) + dieLater( 1 ) + } } + + print out } END { + exit shouldDie }