]> git.pld-linux.org Git - packages/kernel.git/blobdiff - kernel-config.awk
up to 5.19.4
[packages/kernel.git] / kernel-config.awk
index 9408ad0cf6fea5fe7d73cc337d6e7b729c9dc895..9ac5a946b00117568d519758f1526ee61f09f207 100644 (file)
@@ -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 <sparky@pld-linux.org>
+# 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
 }
This page took 0.043225 seconds and 4 git commands to generate.