| .. | .. |
|---|
| 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 |
|---|