1*0a9064fbSMasahiro Yamada#!/bin/sh 2*0a9064fbSMasahiro Yamada# merge_config.sh - Takes a list of config fragment values, and merges 3*0a9064fbSMasahiro Yamada# them one by one. Provides warnings on overridden values, and specified 4*0a9064fbSMasahiro Yamada# values that did not make it to the resulting .config file (due to missed 5*0a9064fbSMasahiro Yamada# dependencies or config symbol removal). 6*0a9064fbSMasahiro Yamada# 7*0a9064fbSMasahiro Yamada# Portions reused from kconf_check and generate_cfg: 8*0a9064fbSMasahiro Yamada# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check 9*0a9064fbSMasahiro Yamada# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg 10*0a9064fbSMasahiro Yamada# 11*0a9064fbSMasahiro Yamada# Copyright (c) 2009-2010 Wind River Systems, Inc. 12*0a9064fbSMasahiro Yamada# Copyright 2011 Linaro 13*0a9064fbSMasahiro Yamada# 14*0a9064fbSMasahiro Yamada# This program is free software; you can redistribute it and/or modify 15*0a9064fbSMasahiro Yamada# it under the terms of the GNU General Public License version 2 as 16*0a9064fbSMasahiro Yamada# published by the Free Software Foundation. 17*0a9064fbSMasahiro Yamada# 18*0a9064fbSMasahiro Yamada# This program is distributed in the hope that it will be useful, 19*0a9064fbSMasahiro Yamada# but WITHOUT ANY WARRANTY; without even the implied warranty of 20*0a9064fbSMasahiro Yamada# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 21*0a9064fbSMasahiro Yamada# See the GNU General Public License for more details. 22*0a9064fbSMasahiro Yamada 23*0a9064fbSMasahiro Yamadaclean_up() { 24*0a9064fbSMasahiro Yamada rm -f $TMP_FILE 25*0a9064fbSMasahiro Yamada exit 26*0a9064fbSMasahiro Yamada} 27*0a9064fbSMasahiro Yamadatrap clean_up HUP INT TERM 28*0a9064fbSMasahiro Yamada 29*0a9064fbSMasahiro Yamadausage() { 30*0a9064fbSMasahiro Yamada echo "Usage: $0 [OPTIONS] [CONFIG [...]]" 31*0a9064fbSMasahiro Yamada echo " -h display this help text" 32*0a9064fbSMasahiro Yamada echo " -m only merge the fragments, do not execute the make command" 33*0a9064fbSMasahiro Yamada echo " -n use allnoconfig instead of alldefconfig" 34*0a9064fbSMasahiro Yamada echo " -r list redundant entries when merging fragments" 35*0a9064fbSMasahiro Yamada echo " -O dir to put generated output files" 36*0a9064fbSMasahiro Yamada} 37*0a9064fbSMasahiro Yamada 38*0a9064fbSMasahiro YamadaMAKE=true 39*0a9064fbSMasahiro YamadaALLTARGET=alldefconfig 40*0a9064fbSMasahiro YamadaWARNREDUN=false 41*0a9064fbSMasahiro YamadaOUTPUT=. 42*0a9064fbSMasahiro Yamada 43*0a9064fbSMasahiro Yamadawhile true; do 44*0a9064fbSMasahiro Yamada case $1 in 45*0a9064fbSMasahiro Yamada "-n") 46*0a9064fbSMasahiro Yamada ALLTARGET=allnoconfig 47*0a9064fbSMasahiro Yamada shift 48*0a9064fbSMasahiro Yamada continue 49*0a9064fbSMasahiro Yamada ;; 50*0a9064fbSMasahiro Yamada "-m") 51*0a9064fbSMasahiro Yamada MAKE=false 52*0a9064fbSMasahiro Yamada shift 53*0a9064fbSMasahiro Yamada continue 54*0a9064fbSMasahiro Yamada ;; 55*0a9064fbSMasahiro Yamada "-h") 56*0a9064fbSMasahiro Yamada usage 57*0a9064fbSMasahiro Yamada exit 58*0a9064fbSMasahiro Yamada ;; 59*0a9064fbSMasahiro Yamada "-r") 60*0a9064fbSMasahiro Yamada WARNREDUN=true 61*0a9064fbSMasahiro Yamada shift 62*0a9064fbSMasahiro Yamada continue 63*0a9064fbSMasahiro Yamada ;; 64*0a9064fbSMasahiro Yamada "-O") 65*0a9064fbSMasahiro Yamada if [ -d $2 ];then 66*0a9064fbSMasahiro Yamada OUTPUT=$(echo $2 | sed 's/\/*$//') 67*0a9064fbSMasahiro Yamada else 68*0a9064fbSMasahiro Yamada echo "output directory $2 does not exist" 1>&2 69*0a9064fbSMasahiro Yamada exit 1 70*0a9064fbSMasahiro Yamada fi 71*0a9064fbSMasahiro Yamada shift 2 72*0a9064fbSMasahiro Yamada continue 73*0a9064fbSMasahiro Yamada ;; 74*0a9064fbSMasahiro Yamada *) 75*0a9064fbSMasahiro Yamada break 76*0a9064fbSMasahiro Yamada ;; 77*0a9064fbSMasahiro Yamada esac 78*0a9064fbSMasahiro Yamadadone 79*0a9064fbSMasahiro Yamada 80*0a9064fbSMasahiro YamadaINITFILE=$1 81*0a9064fbSMasahiro Yamadashift; 82*0a9064fbSMasahiro Yamada 83*0a9064fbSMasahiro YamadaMERGE_LIST=$* 84*0a9064fbSMasahiro YamadaSED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p" 85*0a9064fbSMasahiro YamadaTMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX) 86*0a9064fbSMasahiro Yamada 87*0a9064fbSMasahiro Yamadaecho "Using $INITFILE as base" 88*0a9064fbSMasahiro Yamadacat $INITFILE > $TMP_FILE 89*0a9064fbSMasahiro Yamada 90*0a9064fbSMasahiro Yamada# Merge files, printing warnings on overrided values 91*0a9064fbSMasahiro Yamadafor MERGE_FILE in $MERGE_LIST ; do 92*0a9064fbSMasahiro Yamada echo "Merging $MERGE_FILE" 93*0a9064fbSMasahiro Yamada CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE) 94*0a9064fbSMasahiro Yamada 95*0a9064fbSMasahiro Yamada for CFG in $CFG_LIST ; do 96*0a9064fbSMasahiro Yamada grep -q -w $CFG $TMP_FILE 97*0a9064fbSMasahiro Yamada if [ $? -eq 0 ] ; then 98*0a9064fbSMasahiro Yamada PREV_VAL=$(grep -w $CFG $TMP_FILE) 99*0a9064fbSMasahiro Yamada NEW_VAL=$(grep -w $CFG $MERGE_FILE) 100*0a9064fbSMasahiro Yamada if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then 101*0a9064fbSMasahiro Yamada echo Value of $CFG is redefined by fragment $MERGE_FILE: 102*0a9064fbSMasahiro Yamada echo Previous value: $PREV_VAL 103*0a9064fbSMasahiro Yamada echo New value: $NEW_VAL 104*0a9064fbSMasahiro Yamada echo 105*0a9064fbSMasahiro Yamada elif [ "$WARNREDUN" = "true" ]; then 106*0a9064fbSMasahiro Yamada echo Value of $CFG is redundant by fragment $MERGE_FILE: 107*0a9064fbSMasahiro Yamada fi 108*0a9064fbSMasahiro Yamada sed -i "/$CFG[ =]/d" $TMP_FILE 109*0a9064fbSMasahiro Yamada fi 110*0a9064fbSMasahiro Yamada done 111*0a9064fbSMasahiro Yamada cat $MERGE_FILE >> $TMP_FILE 112*0a9064fbSMasahiro Yamadadone 113*0a9064fbSMasahiro Yamada 114*0a9064fbSMasahiro Yamadaif [ "$MAKE" = "false" ]; then 115*0a9064fbSMasahiro Yamada cp $TMP_FILE $OUTPUT/.config 116*0a9064fbSMasahiro Yamada echo "#" 117*0a9064fbSMasahiro Yamada echo "# merged configuration written to $OUTPUT/.config (needs make)" 118*0a9064fbSMasahiro Yamada echo "#" 119*0a9064fbSMasahiro Yamada clean_up 120*0a9064fbSMasahiro Yamada exit 121*0a9064fbSMasahiro Yamadafi 122*0a9064fbSMasahiro Yamada 123*0a9064fbSMasahiro Yamada# If we have an output dir, setup the O= argument, otherwise leave 124*0a9064fbSMasahiro Yamada# it blank, since O=. will create an unnecessary ./source softlink 125*0a9064fbSMasahiro YamadaOUTPUT_ARG="" 126*0a9064fbSMasahiro Yamadaif [ "$OUTPUT" != "." ] ; then 127*0a9064fbSMasahiro Yamada OUTPUT_ARG="O=$OUTPUT" 128*0a9064fbSMasahiro Yamadafi 129*0a9064fbSMasahiro Yamada 130*0a9064fbSMasahiro Yamada 131*0a9064fbSMasahiro Yamada# Use the merged file as the starting point for: 132*0a9064fbSMasahiro Yamada# alldefconfig: Fills in any missing symbols with Kconfig default 133*0a9064fbSMasahiro Yamada# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set 134*0a9064fbSMasahiro Yamadamake KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET 135*0a9064fbSMasahiro Yamada 136*0a9064fbSMasahiro Yamada 137*0a9064fbSMasahiro Yamada# Check all specified config values took (might have missed-dependency issues) 138*0a9064fbSMasahiro Yamadafor CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do 139*0a9064fbSMasahiro Yamada 140*0a9064fbSMasahiro Yamada REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) 141*0a9064fbSMasahiro Yamada ACTUAL_VAL=$(grep -w -e "$CFG" $OUTPUT/.config) 142*0a9064fbSMasahiro Yamada if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then 143*0a9064fbSMasahiro Yamada echo "Value requested for $CFG not in final .config" 144*0a9064fbSMasahiro Yamada echo "Requested value: $REQUESTED_VAL" 145*0a9064fbSMasahiro Yamada echo "Actual value: $ACTUAL_VAL" 146*0a9064fbSMasahiro Yamada echo "" 147*0a9064fbSMasahiro Yamada fi 148*0a9064fbSMasahiro Yamadadone 149*0a9064fbSMasahiro Yamada 150*0a9064fbSMasahiro Yamadaclean_up 151