0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 set -e
0017
0018 clean_up() {
0019 rm -f $TMP_FILE
0020 rm -f $MERGE_FILE
0021 }
0022
0023 usage() {
0024 echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
0025 echo " -h display this help text"
0026 echo " -m only merge the fragments, do not execute the make command"
0027 echo " -n use allnoconfig instead of alldefconfig"
0028 echo " -r list redundant entries when merging fragments"
0029 echo " -y make builtin have precedence over modules"
0030 echo " -O dir to put generated output files. Consider setting \$KCONFIG_CONFIG instead."
0031 echo " -s strict mode. Fail if the fragment redefines any value."
0032 echo
0033 echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable."
0034 }
0035
0036 RUNMAKE=true
0037 ALLTARGET=alldefconfig
0038 WARNREDUN=false
0039 BUILTIN=false
0040 OUTPUT=.
0041 STRICT=false
0042 CONFIG_PREFIX=${CONFIG_-CONFIG_}
0043
0044 while true; do
0045 case $1 in
0046 "-n")
0047 ALLTARGET=allnoconfig
0048 shift
0049 continue
0050 ;;
0051 "-m")
0052 RUNMAKE=false
0053 shift
0054 continue
0055 ;;
0056 "-h")
0057 usage
0058 exit
0059 ;;
0060 "-r")
0061 WARNREDUN=true
0062 shift
0063 continue
0064 ;;
0065 "-y")
0066 BUILTIN=true
0067 shift
0068 continue
0069 ;;
0070 "-O")
0071 if [ -d $2 ];then
0072 OUTPUT=$(echo $2 | sed 's/\/*$//')
0073 else
0074 echo "output directory $2 does not exist" 1>&2
0075 exit 1
0076 fi
0077 shift 2
0078 continue
0079 ;;
0080 "-s")
0081 STRICT=true
0082 shift
0083 continue
0084 ;;
0085 *)
0086 break
0087 ;;
0088 esac
0089 done
0090
0091 if [ "$#" -lt 1 ] ; then
0092 usage
0093 exit
0094 fi
0095
0096 if [ -z "$KCONFIG_CONFIG" ]; then
0097 if [ "$OUTPUT" != . ]; then
0098 KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
0099 else
0100 KCONFIG_CONFIG=.config
0101 fi
0102 fi
0103
0104 INITFILE=$1
0105 shift;
0106
0107 if [ ! -r "$INITFILE" ]; then
0108 echo "The base file '$INITFILE' does not exist. Exit." >&2
0109 exit 1
0110 fi
0111
0112 MERGE_LIST=$*
0113 SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
0114 SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
0115
0116 TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
0117 MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX)
0118
0119 echo "Using $INITFILE as base"
0120
0121 trap clean_up EXIT
0122
0123 cat $INITFILE > $TMP_FILE
0124
0125
0126 for ORIG_MERGE_FILE in $MERGE_LIST ; do
0127 echo "Merging $ORIG_MERGE_FILE"
0128 if [ ! -r "$ORIG_MERGE_FILE" ]; then
0129 echo "The merge file '$ORIG_MERGE_FILE' does not exist. Exit." >&2
0130 exit 1
0131 fi
0132 cat $ORIG_MERGE_FILE > $MERGE_FILE
0133 CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
0134
0135 for CFG in $CFG_LIST ; do
0136 grep -q -w $CFG $TMP_FILE || continue
0137 PREV_VAL=$(grep -w $CFG $TMP_FILE)
0138 NEW_VAL=$(grep -w $CFG $MERGE_FILE)
0139 BUILTIN_FLAG=false
0140 if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then
0141 echo Previous value: $PREV_VAL
0142 echo New value: $NEW_VAL
0143 echo -y passed, will not demote y to m
0144 echo
0145 BUILTIN_FLAG=true
0146 elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
0147 echo Value of $CFG is redefined by fragment $ORIG_MERGE_FILE:
0148 echo Previous value: $PREV_VAL
0149 echo New value: $NEW_VAL
0150 echo
0151 if [ "$STRICT" = "true" ]; then
0152 STRICT_MODE_VIOLATED=true
0153 fi
0154 elif [ "$WARNREDUN" = "true" ]; then
0155 echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE:
0156 fi
0157 if [ "$BUILTIN_FLAG" = "false" ]; then
0158 sed -i "/$CFG[ =]/d" $TMP_FILE
0159 else
0160 sed -i "/$CFG[ =]/d" $MERGE_FILE
0161 fi
0162 done
0163 cat $MERGE_FILE >> $TMP_FILE
0164 done
0165
0166 if [ "$STRICT_MODE_VIOLATED" = "true" ]; then
0167 echo "The fragment redefined a value and strict mode had been passed."
0168 exit 1
0169 fi
0170
0171 if [ "$RUNMAKE" = "false" ]; then
0172 cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
0173 echo "#"
0174 echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
0175 echo "#"
0176 exit
0177 fi
0178
0179
0180
0181 OUTPUT_ARG=""
0182 if [ "$OUTPUT" != "." ] ; then
0183 OUTPUT_ARG="O=$OUTPUT"
0184 fi
0185
0186
0187
0188
0189
0190 make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
0191
0192
0193
0194 for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
0195
0196 REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
0197 ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true)
0198 if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
0199 echo "Value requested for $CFG not in final .config"
0200 echo "Requested value: $REQUESTED_VAL"
0201 echo "Actual value: $ACTUAL_VAL"
0202 echo ""
0203 fi
0204 done