hc
2024-08-12 0517ab8c70e05fc5877c0c6dae1a5f42a16dcf88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#
# Small script that refreshes the kernel feature support status in place.
#
 
for F_FILE in Documentation/features/*/*/arch-support.txt; do
   F=$(grep "^#         Kconfig:" "$F_FILE" | cut -c26-)
 
   #
   # Each feature F is identified by a pair (O, K), where 'O' can
   # be either the empty string (for 'nop') or "not" (the logical
   # negation operator '!'); other operators are not supported.
   #
   O=""
   K=$F
   if [[ "$F" == !* ]]; then
       O="not"
       K=$(echo $F | sed -e 's/^!//g')
   fi
 
   #
   # F := (O, K) is 'valid' iff there is a Kconfig file (for some
   # arch) which contains K.
   #
   # Notice that this definition entails an 'asymmetry' between
   # the case 'O = ""' and the case 'O = "not"'. E.g., F may be
   # _invalid_ if:
   #
   # [case 'O = ""']
   #   1) no arch provides support for F,
   #   2) K does not exist (e.g., it was renamed/mis-typed);
   #
   # [case 'O = "not"']
   #   3) all archs provide support for F,
   #   4) as in (2).
   #
   # The rationale for adopting this definition (and, thus, for
   # keeping the asymmetry) is:
   #
   #       We want to be able to 'detect' (2) (or (4)).
   #
   # (1) and (3) may further warn the developers about the fact
   # that K can be removed.
   #
   F_VALID="false"
   for ARCH_DIR in arch/*/; do
       K_FILES=$(find $ARCH_DIR -name "Kconfig*")
       K_GREP=$(grep "$K" $K_FILES)
       if [ ! -z "$K_GREP" ]; then
           F_VALID="true"
           break
       fi
   done
   if [ "$F_VALID" = "false" ]; then
       printf "WARNING: '%s' is not a valid Kconfig\n" "$F"
   fi
 
   T_FILE="$F_FILE.tmp"
   grep "^#" $F_FILE > $T_FILE
   echo "    -----------------------" >> $T_FILE
   echo "    |         arch |status|" >> $T_FILE
   echo "    -----------------------" >> $T_FILE
   for ARCH_DIR in arch/*/; do
       ARCH=$(echo $ARCH_DIR | sed -e 's/arch//g' | sed -e 's/\///g')
       K_FILES=$(find $ARCH_DIR -name "Kconfig*")
       K_GREP=$(grep "$K" $K_FILES)
       #
       # Arch support status values for (O, K) are updated according
       # to the following rules.
       #
       #   - ("", K) is 'supported by a given arch', if there is a
       #     Kconfig file for that arch which contains K;
       #
       #   - ("not", K) is 'supported by a given arch', if there is
       #     no Kconfig file for that arch which contains K;
       #
       #   - otherwise: preserve the previous status value (if any),
       #                default to 'not yet supported'.
       #
       # Notice that, according these rules, invalid features may be
       # updated/modified.
       #
       if [ "$O" = "" ] && [ ! -z "$K_GREP" ]; then
           printf "    |%12s: |  ok  |\n" "$ARCH" >> $T_FILE
       elif [ "$O" = "not" ] && [ -z "$K_GREP" ]; then
           printf "    |%12s: |  ok  |\n" "$ARCH" >> $T_FILE
       else
           S=$(grep -v "^#" "$F_FILE" | grep " $ARCH:")
           if [ ! -z "$S" ]; then
               echo "$S" >> $T_FILE
           else
               printf "    |%12s: | TODO |\n" "$ARCH" \
                   >> $T_FILE
           fi
       fi
   done
   echo "    -----------------------" >> $T_FILE
   mv $T_FILE $F_FILE
done