10a9064fbSMasahiro Yamada#!/bin/sh 20a9064fbSMasahiro Yamada# merge_config.sh - Takes a list of config fragment values, and merges 30a9064fbSMasahiro Yamada# them one by one. Provides warnings on overridden values, and specified 40a9064fbSMasahiro Yamada# values that did not make it to the resulting .config file (due to missed 50a9064fbSMasahiro Yamada# dependencies or config symbol removal). 60a9064fbSMasahiro Yamada# 70a9064fbSMasahiro Yamada# Portions reused from kconf_check and generate_cfg: 80a9064fbSMasahiro Yamada# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check 90a9064fbSMasahiro Yamada# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg 100a9064fbSMasahiro Yamada# 110a9064fbSMasahiro Yamada# Copyright (c) 2009-2010 Wind River Systems, Inc. 120a9064fbSMasahiro Yamada# Copyright 2011 Linaro 130a9064fbSMasahiro Yamada# 140a9064fbSMasahiro Yamada# This program is free software; you can redistribute it and/or modify 150a9064fbSMasahiro Yamada# it under the terms of the GNU General Public License version 2 as 160a9064fbSMasahiro Yamada# published by the Free Software Foundation. 170a9064fbSMasahiro Yamada# 180a9064fbSMasahiro Yamada# This program is distributed in the hope that it will be useful, 190a9064fbSMasahiro Yamada# but WITHOUT ANY WARRANTY; without even the implied warranty of 200a9064fbSMasahiro Yamada# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 210a9064fbSMasahiro Yamada# See the GNU General Public License for more details. 220a9064fbSMasahiro Yamada 230a9064fbSMasahiro Yamadaclean_up() { 240a9064fbSMasahiro Yamada rm -f $TMP_FILE 250a9064fbSMasahiro Yamada exit 260a9064fbSMasahiro Yamada} 270a9064fbSMasahiro Yamadatrap clean_up HUP INT TERM 280a9064fbSMasahiro Yamada 290a9064fbSMasahiro Yamadausage() { 300a9064fbSMasahiro Yamada echo "Usage: $0 [OPTIONS] [CONFIG [...]]" 310a9064fbSMasahiro Yamada echo " -h display this help text" 320a9064fbSMasahiro Yamada echo " -m only merge the fragments, do not execute the make command" 330a9064fbSMasahiro Yamada echo " -n use allnoconfig instead of alldefconfig" 340a9064fbSMasahiro Yamada echo " -r list redundant entries when merging fragments" 35*bf7ab1e7SMasahiro Yamada echo " -O dir to put generated output files. Consider setting \$KCONFIG_CONFIG instead." 360a9064fbSMasahiro Yamada} 370a9064fbSMasahiro Yamada 389b5f0b1dSMasahiro YamadaRUNMAKE=true 390a9064fbSMasahiro YamadaALLTARGET=alldefconfig 400a9064fbSMasahiro YamadaWARNREDUN=false 410a9064fbSMasahiro YamadaOUTPUT=. 420a9064fbSMasahiro Yamada 430a9064fbSMasahiro Yamadawhile true; do 440a9064fbSMasahiro Yamada case $1 in 450a9064fbSMasahiro Yamada "-n") 460a9064fbSMasahiro Yamada ALLTARGET=allnoconfig 470a9064fbSMasahiro Yamada shift 480a9064fbSMasahiro Yamada continue 490a9064fbSMasahiro Yamada ;; 500a9064fbSMasahiro Yamada "-m") 519b5f0b1dSMasahiro Yamada RUNMAKE=false 520a9064fbSMasahiro Yamada shift 530a9064fbSMasahiro Yamada continue 540a9064fbSMasahiro Yamada ;; 550a9064fbSMasahiro Yamada "-h") 560a9064fbSMasahiro Yamada usage 570a9064fbSMasahiro Yamada exit 580a9064fbSMasahiro Yamada ;; 590a9064fbSMasahiro Yamada "-r") 600a9064fbSMasahiro Yamada WARNREDUN=true 610a9064fbSMasahiro Yamada shift 620a9064fbSMasahiro Yamada continue 630a9064fbSMasahiro Yamada ;; 640a9064fbSMasahiro Yamada "-O") 650a9064fbSMasahiro Yamada if [ -d $2 ];then 660a9064fbSMasahiro Yamada OUTPUT=$(echo $2 | sed 's/\/*$//') 670a9064fbSMasahiro Yamada else 680a9064fbSMasahiro Yamada echo "output directory $2 does not exist" 1>&2 690a9064fbSMasahiro Yamada exit 1 700a9064fbSMasahiro Yamada fi 710a9064fbSMasahiro Yamada shift 2 720a9064fbSMasahiro Yamada continue 730a9064fbSMasahiro Yamada ;; 740a9064fbSMasahiro Yamada *) 750a9064fbSMasahiro Yamada break 760a9064fbSMasahiro Yamada ;; 770a9064fbSMasahiro Yamada esac 780a9064fbSMasahiro Yamadadone 790a9064fbSMasahiro Yamada 80*bf7ab1e7SMasahiro Yamadaif [ "$#" -lt 1 ] ; then 819b5f0b1dSMasahiro Yamada usage 829b5f0b1dSMasahiro Yamada exit 839b5f0b1dSMasahiro Yamadafi 849b5f0b1dSMasahiro Yamada 85*bf7ab1e7SMasahiro Yamadaif [ -z "$KCONFIG_CONFIG" ]; then 86*bf7ab1e7SMasahiro Yamada if [ "$OUTPUT" != . ]; then 87*bf7ab1e7SMasahiro Yamada KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config") 88*bf7ab1e7SMasahiro Yamada else 89*bf7ab1e7SMasahiro Yamada KCONFIG_CONFIG=.config 90*bf7ab1e7SMasahiro Yamada fi 91*bf7ab1e7SMasahiro Yamadafi 92*bf7ab1e7SMasahiro Yamada 930a9064fbSMasahiro YamadaINITFILE=$1 940a9064fbSMasahiro Yamadashift; 950a9064fbSMasahiro Yamada 969b5f0b1dSMasahiro Yamadaif [ ! -r "$INITFILE" ]; then 979b5f0b1dSMasahiro Yamada echo "The base file '$INITFILE' does not exist. Exit." >&2 989b5f0b1dSMasahiro Yamada exit 1 999b5f0b1dSMasahiro Yamadafi 1009b5f0b1dSMasahiro Yamada 1010a9064fbSMasahiro YamadaMERGE_LIST=$* 1020a9064fbSMasahiro YamadaSED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p" 1030a9064fbSMasahiro YamadaTMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX) 1040a9064fbSMasahiro Yamada 1050a9064fbSMasahiro Yamadaecho "Using $INITFILE as base" 1060a9064fbSMasahiro Yamadacat $INITFILE > $TMP_FILE 1070a9064fbSMasahiro Yamada 1085699ea6dSRobert P. J. Day# Merge files, printing warnings on overridden values 1090a9064fbSMasahiro Yamadafor MERGE_FILE in $MERGE_LIST ; do 1100a9064fbSMasahiro Yamada echo "Merging $MERGE_FILE" 111*bf7ab1e7SMasahiro Yamada if [ ! -r "$MERGE_FILE" ]; then 112*bf7ab1e7SMasahiro Yamada echo "The merge file '$MERGE_FILE' does not exist. Exit." >&2 113*bf7ab1e7SMasahiro Yamada exit 1 114*bf7ab1e7SMasahiro Yamada fi 1150a9064fbSMasahiro Yamada CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE) 1160a9064fbSMasahiro Yamada 1170a9064fbSMasahiro Yamada for CFG in $CFG_LIST ; do 1189b5f0b1dSMasahiro Yamada grep -q -w $CFG $TMP_FILE || continue 1190a9064fbSMasahiro Yamada PREV_VAL=$(grep -w $CFG $TMP_FILE) 1200a9064fbSMasahiro Yamada NEW_VAL=$(grep -w $CFG $MERGE_FILE) 1210a9064fbSMasahiro Yamada if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then 1220a9064fbSMasahiro Yamada echo Value of $CFG is redefined by fragment $MERGE_FILE: 1230a9064fbSMasahiro Yamada echo Previous value: $PREV_VAL 1240a9064fbSMasahiro Yamada echo New value: $NEW_VAL 1250a9064fbSMasahiro Yamada echo 1260a9064fbSMasahiro Yamada elif [ "$WARNREDUN" = "true" ]; then 1270a9064fbSMasahiro Yamada echo Value of $CFG is redundant by fragment $MERGE_FILE: 1280a9064fbSMasahiro Yamada fi 1290a9064fbSMasahiro Yamada sed -i "/$CFG[ =]/d" $TMP_FILE 1300a9064fbSMasahiro Yamada done 1310a9064fbSMasahiro Yamada cat $MERGE_FILE >> $TMP_FILE 1320a9064fbSMasahiro Yamadadone 1330a9064fbSMasahiro Yamada 1349b5f0b1dSMasahiro Yamadaif [ "$RUNMAKE" = "false" ]; then 135*bf7ab1e7SMasahiro Yamada cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG" 1360a9064fbSMasahiro Yamada echo "#" 137*bf7ab1e7SMasahiro Yamada echo "# merged configuration written to $KCONFIG_CONFIG (needs make)" 1380a9064fbSMasahiro Yamada echo "#" 1390a9064fbSMasahiro Yamada clean_up 1400a9064fbSMasahiro Yamada exit 1410a9064fbSMasahiro Yamadafi 1420a9064fbSMasahiro Yamada 1430a9064fbSMasahiro Yamada# If we have an output dir, setup the O= argument, otherwise leave 1440a9064fbSMasahiro Yamada# it blank, since O=. will create an unnecessary ./source softlink 1450a9064fbSMasahiro YamadaOUTPUT_ARG="" 1460a9064fbSMasahiro Yamadaif [ "$OUTPUT" != "." ] ; then 1470a9064fbSMasahiro Yamada OUTPUT_ARG="O=$OUTPUT" 1480a9064fbSMasahiro Yamadafi 1490a9064fbSMasahiro Yamada 1500a9064fbSMasahiro Yamada 1510a9064fbSMasahiro Yamada# Use the merged file as the starting point for: 1520a9064fbSMasahiro Yamada# alldefconfig: Fills in any missing symbols with Kconfig default 1530a9064fbSMasahiro Yamada# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set 1540a9064fbSMasahiro Yamadamake KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET 1550a9064fbSMasahiro Yamada 1560a9064fbSMasahiro Yamada 1570a9064fbSMasahiro Yamada# Check all specified config values took (might have missed-dependency issues) 1580a9064fbSMasahiro Yamadafor CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do 1590a9064fbSMasahiro Yamada 1600a9064fbSMasahiro Yamada REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) 161*bf7ab1e7SMasahiro Yamada ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG") 1620a9064fbSMasahiro Yamada if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then 1630a9064fbSMasahiro Yamada echo "Value requested for $CFG not in final .config" 1640a9064fbSMasahiro Yamada echo "Requested value: $REQUESTED_VAL" 1650a9064fbSMasahiro Yamada echo "Actual value: $ACTUAL_VAL" 1660a9064fbSMasahiro Yamada echo "" 1670a9064fbSMasahiro Yamada fi 1680a9064fbSMasahiro Yamadadone 1690a9064fbSMasahiro Yamada 1700a9064fbSMasahiro Yamadaclean_up 171