.. | .. |
---|
1 | 1 | #!/bin/sh |
---|
| 2 | +# SPDX-License-Identifier: GPL-2.0 |
---|
| 3 | +# |
---|
2 | 4 | # merge_config.sh - Takes a list of config fragment values, and merges |
---|
3 | 5 | # them one by one. Provides warnings on overridden values, and specified |
---|
4 | 6 | # values that did not make it to the resulting .config file (due to missed |
---|
.. | .. |
---|
10 | 12 | # |
---|
11 | 13 | # Copyright (c) 2009-2010 Wind River Systems, Inc. |
---|
12 | 14 | # Copyright 2011 Linaro |
---|
13 | | -# |
---|
14 | | -# This program is free software; you can redistribute it and/or modify |
---|
15 | | -# it under the terms of the GNU General Public License version 2 as |
---|
16 | | -# published by the Free Software Foundation. |
---|
17 | | -# |
---|
18 | | -# This program is distributed in the hope that it will be useful, |
---|
19 | | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
20 | | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
---|
21 | | -# See the GNU General Public License for more details. |
---|
| 15 | + |
---|
| 16 | +set -e |
---|
22 | 17 | |
---|
23 | 18 | clean_up() { |
---|
24 | 19 | rm -f $TMP_FILE |
---|
25 | | - exit |
---|
| 20 | + rm -f $MERGE_FILE |
---|
26 | 21 | } |
---|
27 | | -trap clean_up HUP INT TERM |
---|
28 | 22 | |
---|
29 | 23 | usage() { |
---|
30 | 24 | echo "Usage: $0 [OPTIONS] [CONFIG [...]]" |
---|
.. | .. |
---|
32 | 26 | echo " -m only merge the fragments, do not execute the make command" |
---|
33 | 27 | echo " -n use allnoconfig instead of alldefconfig" |
---|
34 | 28 | echo " -r list redundant entries when merging fragments" |
---|
| 29 | + echo " -y make builtin have precedence over modules" |
---|
35 | 30 | echo " -O dir to put generated output files. Consider setting \$KCONFIG_CONFIG instead." |
---|
| 31 | + echo " -s strict mode. Fail if the fragment redefines any value." |
---|
| 32 | + echo |
---|
| 33 | + echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable." |
---|
36 | 34 | } |
---|
37 | 35 | |
---|
38 | 36 | RUNMAKE=true |
---|
39 | 37 | ALLTARGET=alldefconfig |
---|
40 | 38 | WARNREDUN=false |
---|
| 39 | +BUILTIN=false |
---|
41 | 40 | OUTPUT=. |
---|
| 41 | +STRICT=false |
---|
| 42 | +CONFIG_PREFIX=${CONFIG_-CONFIG_} |
---|
42 | 43 | |
---|
43 | 44 | while true; do |
---|
44 | 45 | case $1 in |
---|
.. | .. |
---|
61 | 62 | shift |
---|
62 | 63 | continue |
---|
63 | 64 | ;; |
---|
| 65 | + "-y") |
---|
| 66 | + BUILTIN=true |
---|
| 67 | + shift |
---|
| 68 | + continue |
---|
| 69 | + ;; |
---|
64 | 70 | "-O") |
---|
65 | 71 | if [ -d $2 ];then |
---|
66 | 72 | OUTPUT=$(echo $2 | sed 's/\/*$//') |
---|
.. | .. |
---|
69 | 75 | exit 1 |
---|
70 | 76 | fi |
---|
71 | 77 | shift 2 |
---|
| 78 | + continue |
---|
| 79 | + ;; |
---|
| 80 | + "-s") |
---|
| 81 | + STRICT=true |
---|
| 82 | + shift |
---|
72 | 83 | continue |
---|
73 | 84 | ;; |
---|
74 | 85 | *) |
---|
.. | .. |
---|
99 | 110 | fi |
---|
100 | 111 | |
---|
101 | 112 | MERGE_LIST=$* |
---|
102 | | -SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p" |
---|
| 113 | +SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p" |
---|
| 114 | +SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p" |
---|
| 115 | + |
---|
103 | 116 | TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX) |
---|
| 117 | +MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX) |
---|
104 | 118 | |
---|
105 | 119 | echo "Using $INITFILE as base" |
---|
| 120 | + |
---|
| 121 | +trap clean_up EXIT |
---|
| 122 | + |
---|
106 | 123 | cat $INITFILE > $TMP_FILE |
---|
107 | 124 | |
---|
108 | 125 | # Merge files, printing warnings on overridden values |
---|
109 | | -for MERGE_FILE in $MERGE_LIST ; do |
---|
110 | | - echo "Merging $MERGE_FILE" |
---|
111 | | - if [ ! -r "$MERGE_FILE" ]; then |
---|
112 | | - echo "The merge file '$MERGE_FILE' does not exist. Exit." >&2 |
---|
| 126 | +for ORIG_MERGE_FILE in $MERGE_LIST ; do |
---|
| 127 | + echo "Merging $ORIG_MERGE_FILE" |
---|
| 128 | + if [ ! -r "$ORIG_MERGE_FILE" ]; then |
---|
| 129 | + echo "The merge file '$ORIG_MERGE_FILE' does not exist. Exit." >&2 |
---|
113 | 130 | exit 1 |
---|
114 | 131 | fi |
---|
115 | | - CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE) |
---|
| 132 | + cat $ORIG_MERGE_FILE > $MERGE_FILE |
---|
| 133 | + CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE) |
---|
116 | 134 | |
---|
117 | 135 | for CFG in $CFG_LIST ; do |
---|
118 | 136 | grep -q -w $CFG $TMP_FILE || continue |
---|
119 | 137 | PREV_VAL=$(grep -w $CFG $TMP_FILE) |
---|
120 | 138 | NEW_VAL=$(grep -w $CFG $MERGE_FILE) |
---|
121 | | - if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then |
---|
122 | | - echo Value of $CFG is redefined by fragment $MERGE_FILE: |
---|
| 139 | + BUILTIN_FLAG=false |
---|
| 140 | + if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then |
---|
| 141 | + echo Previous value: $PREV_VAL |
---|
| 142 | + echo New value: $NEW_VAL |
---|
| 143 | + echo -y passed, will not demote y to m |
---|
| 144 | + echo |
---|
| 145 | + BUILTIN_FLAG=true |
---|
| 146 | + elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then |
---|
| 147 | + echo Value of $CFG is redefined by fragment $ORIG_MERGE_FILE: |
---|
123 | 148 | echo Previous value: $PREV_VAL |
---|
124 | 149 | echo New value: $NEW_VAL |
---|
125 | 150 | echo |
---|
| 151 | + if [ "$STRICT" = "true" ]; then |
---|
| 152 | + STRICT_MODE_VIOLATED=true |
---|
| 153 | + fi |
---|
126 | 154 | elif [ "$WARNREDUN" = "true" ]; then |
---|
127 | | - echo Value of $CFG is redundant by fragment $MERGE_FILE: |
---|
| 155 | + echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE: |
---|
128 | 156 | fi |
---|
129 | | - sed -i "/$CFG[ =]/d" $TMP_FILE |
---|
| 157 | + if [ "$BUILTIN_FLAG" = "false" ]; then |
---|
| 158 | + sed -i "/$CFG[ =]/d" $TMP_FILE |
---|
| 159 | + else |
---|
| 160 | + sed -i "/$CFG[ =]/d" $MERGE_FILE |
---|
| 161 | + fi |
---|
130 | 162 | done |
---|
131 | 163 | cat $MERGE_FILE >> $TMP_FILE |
---|
132 | 164 | done |
---|
| 165 | + |
---|
| 166 | +if [ "$STRICT_MODE_VIOLATED" = "true" ]; then |
---|
| 167 | + echo "The fragment redefined a value and strict mode had been passed." |
---|
| 168 | + exit 1 |
---|
| 169 | +fi |
---|
133 | 170 | |
---|
134 | 171 | if [ "$RUNMAKE" = "false" ]; then |
---|
135 | 172 | cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG" |
---|
136 | 173 | echo "#" |
---|
137 | 174 | echo "# merged configuration written to $KCONFIG_CONFIG (needs make)" |
---|
138 | 175 | echo "#" |
---|
139 | | - clean_up |
---|
140 | 176 | exit |
---|
141 | 177 | fi |
---|
142 | 178 | |
---|
.. | .. |
---|
155 | 191 | |
---|
156 | 192 | |
---|
157 | 193 | # Check all specified config values took (might have missed-dependency issues) |
---|
158 | | -for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do |
---|
| 194 | +for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do |
---|
159 | 195 | |
---|
160 | 196 | REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) |
---|
161 | | - ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG") |
---|
| 197 | + ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true) |
---|
162 | 198 | if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then |
---|
163 | 199 | echo "Value requested for $CFG not in final .config" |
---|
164 | 200 | echo "Requested value: $REQUESTED_VAL" |
---|
.. | .. |
---|
166 | 202 | echo "" |
---|
167 | 203 | fi |
---|
168 | 204 | done |
---|
169 | | - |
---|
170 | | -clean_up |
---|