1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Usage: 4*4882a593Smuzhiyun# update_defconfig.sh <defconfig> [output dir] 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunset -e 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun# Usage: savedefconfig <output defconfig> [input defconfig] 9*4882a593Smuzhiyunsavedefconfig() 10*4882a593Smuzhiyun{ 11*4882a593Smuzhiyun TARGET="$1" 12*4882a593Smuzhiyun TMP_CONFIG="${CONFIG}.tmp" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun if [ "$2" ]; then 15*4882a593Smuzhiyun "$SCRIPT_DIR/parse_defconfig.sh" "$2" "$TMP_CONFIG" >/dev/null 16*4882a593Smuzhiyun else 17*4882a593Smuzhiyun cp -f "$CONFIG" "$TMP_CONFIG" 18*4882a593Smuzhiyun fi 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun sed -i "/BR2_DEFCONFIG/d" "$TMP_CONFIG" 21*4882a593Smuzhiyun echo "BR2_DEFCONFIG=\"$TARGET\"" >> "$TMP_CONFIG" 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun # Based on buildroot/Makefile's savedefconfig 24*4882a593Smuzhiyun BR2_DEFCONFIG="$TARGET" BR2_CONFIG="$TMP_CONFIG" \ 25*4882a593Smuzhiyun KCONFIG_AUTOCONFIG=$CONFIG_DIR/auto.conf \ 26*4882a593Smuzhiyun KCONFIG_AUTOHEADER=$CONFIG_DIR/autoconf.h \ 27*4882a593Smuzhiyun KCONFIG_TRISTATE=$CONFIG_DIR/tristate.config \ 28*4882a593Smuzhiyun BASE_DIR="$OUTPUT_DIR" SKIP_LEGACY= \ 29*4882a593Smuzhiyun HOST_GCC_VERSION="$HOST_GCC_VERSION" \ 30*4882a593Smuzhiyun CUSTOM_KERNEL_VERSION="$CUSTOM_KERNEL_VERSION" \ 31*4882a593Smuzhiyun HOSTARCH="$HOSTARCH" BR2_VERSION_FULL="$BR2_VERSION_FULL" \ 32*4882a593Smuzhiyun $CONFIG_DIR/conf --savedefconfig="$TARGET" \ 33*4882a593Smuzhiyun Config.in >/dev/null 34*4882a593Smuzhiyun sed -i '/^BR2_DEFCONFIG=/d' "$TARGET" 35*4882a593Smuzhiyun} 36*4882a593Smuzhiyun 37*4882a593SmuzhiyunBOARD="$(basename "${1%_defconfig}")" 38*4882a593Smuzhiyun[ -n "$BOARD" ] || exit 1 39*4882a593Smuzhiyun 40*4882a593SmuzhiyunSCRIPT_DIR="$(realpath "$(dirname "$0")")" 41*4882a593SmuzhiyunBUILDROOT_DIR="$(dirname "$SCRIPT_DIR")" 42*4882a593SmuzhiyunOUTPUT_DIR="${2:-$BUILDROOT_DIR/output/$BOARD}" 43*4882a593Smuzhiyuncd "$BUILDROOT_DIR" 44*4882a593Smuzhiyun 45*4882a593SmuzhiyunDEFCONFIG="configs/${BOARD}_defconfig" 46*4882a593Smuzhiyun[ -r "$DEFCONFIG" ] || exit 1 47*4882a593Smuzhiyun 48*4882a593Smuzhiyunecho "Updating defconfig: $DEFCONFIG" 49*4882a593Smuzhiyun 50*4882a593SmuzhiyunCONFIG="$OUTPUT_DIR/.config" 51*4882a593SmuzhiyunORIG_DEFCONFIG="$OUTPUT_DIR/.defconfig" 52*4882a593SmuzhiyunBASE_DEFCONFIG="$OUTPUT_DIR/.base_defconfig" 53*4882a593SmuzhiyunNEW_DEFCONFIG="$OUTPUT_DIR/.new_defconfig" 54*4882a593SmuzhiyunFRAGMENT="$OUTPUT_DIR/.fragment" 55*4882a593Smuzhiyun 56*4882a593SmuzhiyunCONFIG_DIR="$OUTPUT_DIR/build/buildroot-config" 57*4882a593SmuzhiyunHOST_GCC_VERSION="$(gcc --version | head -n 1 | xargs -n 1 | \ 58*4882a593Smuzhiyun tail -n 1 | cut -d'.' -f1)" 59*4882a593SmuzhiyunCUSTOM_KERNEL_VERSION="$(head -n 2 "$BUILDROOT_DIR/../kernel/Makefile" | \ 60*4882a593Smuzhiyun cut -d' ' -f3 | paste -sd'.')" 61*4882a593SmuzhiyunHOSTARCH="$(uname -m)" 62*4882a593SmuzhiyunBR2_VERSION_FULL="$(grep "export BR2_VERSION := " \ 63*4882a593Smuzhiyun "$BUILDROOT_DIR/Makefile" | xargs -n 1 | tail -n 1)" 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun# Generate original defconfig 66*4882a593Smuzhiyunif [ ! -r "$CONFIG" ]; then 67*4882a593Smuzhiyun mkdir -p "$OUTPUT_DIR" 68*4882a593Smuzhiyun savedefconfig "$ORIG_DEFCONFIG" "$DEFCONFIG" 69*4882a593Smuzhiyunelse 70*4882a593Smuzhiyun savedefconfig "$ORIG_DEFCONFIG" 71*4882a593Smuzhiyunfi 72*4882a593Smuzhiyunecho "Original defconfig saved to $ORIG_DEFCONFIG" 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun# Generate base defconfig 75*4882a593Smuzhiyungrep "^#include " $DEFCONFIG > "$FRAGMENT" || true 76*4882a593Smuzhiyunsavedefconfig "$BASE_DEFCONFIG" "$FRAGMENT" 77*4882a593Smuzhiyunecho "Base defconfig saved to $BASE_DEFCONFIG" 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun# Update defconfig fragment 80*4882a593SmuzhiyunSED_CONFIG_EXP1="s/^\(<\|>\) \([a-zA-Z0-9_]*\)=.*/\2/p" 81*4882a593SmuzhiyunSED_CONFIG_EXP2="s/^\(<\|>\) # \([a-zA-Z0-9_]*\) is not set$/\2/p" 82*4882a593SmuzhiyunSED_STRING_EXP="s/^.*=\"\(.*\)\"/\1/p" 83*4882a593Smuzhiyun 84*4882a593SmuzhiyunCFG_LIST=$(diff "$ORIG_DEFCONFIG" "$BASE_DEFCONFIG" | \ 85*4882a593Smuzhiyun sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" | sort | uniq) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyunfor CFG in $CFG_LIST ; do 88*4882a593Smuzhiyun BASE_VAL=$(grep -w $CFG "$BASE_DEFCONFIG" || true) 89*4882a593Smuzhiyun ORIG_NEW_VAL=$(grep -w $CFG "$ORIG_DEFCONFIG" || true) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun if [ -z "$ORIG_NEW_VAL" ]; then 92*4882a593Smuzhiyun # Reset to default 93*4882a593Smuzhiyun NEW_VAL="# $CFG is reset to default" 94*4882a593Smuzhiyun else 95*4882a593Smuzhiyun # Replace 96*4882a593Smuzhiyun NEW_VAL="$ORIG_NEW_VAL" 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun if grep -q "^$CFG+=" "$DEFCONFIG"; then 99*4882a593Smuzhiyun BASE_STR=$(echo "$BASE_VAL" | sed -n "$SED_STRING_EXP") 100*4882a593Smuzhiyun NEW_STR=$(echo "$NEW_VAL" | sed -n "$SED_STRING_EXP") 101*4882a593Smuzhiyun if [ -n "$BASE_STR" -a -n "$NEW_VAL" ]; then 102*4882a593Smuzhiyun # Try to extract additional strings 103*4882a593Smuzhiyun for s in $BASE_STR; do 104*4882a593Smuzhiyun NEW_STR=$(echo "$NEW_STR" | \ 105*4882a593Smuzhiyun xargs -n 1 | grep -v "^$s$" | \ 106*4882a593Smuzhiyun xargs) 107*4882a593Smuzhiyun done 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun NEW_VAL="${NEW_STR:+$CFG+=\"$NEW_STR\"}" 110*4882a593Smuzhiyun fi 111*4882a593Smuzhiyun fi 112*4882a593Smuzhiyun fi 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun echo "$NEW_VAL" >> $FRAGMENT 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun echo "Value of $CFG applied to fragment:" 117*4882a593Smuzhiyun echo -e "Base value:\t$BASE_VAL" 118*4882a593Smuzhiyun if [ -n "$ORIG_NEW_VAL" -a "$NEW_VAL" != "$ORIG_NEW_VAL" ]; then 119*4882a593Smuzhiyun echo -e "New value:\t$ORIG_NEW_VAL" 120*4882a593Smuzhiyun fi 121*4882a593Smuzhiyun echo -e "Final value:\t$NEW_VAL" 122*4882a593Smuzhiyun echo 123*4882a593Smuzhiyundone 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun# Update defconfig fragment for dependency changes 126*4882a593Smuzhiyunsavedefconfig "$NEW_DEFCONFIG" "$FRAGMENT" 127*4882a593Smuzhiyun 128*4882a593SmuzhiyunCFG_LIST=$(diff "$ORIG_DEFCONFIG" "$NEW_DEFCONFIG" | \ 129*4882a593Smuzhiyun sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" | sort | uniq) 130*4882a593Smuzhiyunfor CFG in $CFG_LIST ; do 131*4882a593Smuzhiyun grep -wq $CFG "$FRAGMENT" || \ 132*4882a593Smuzhiyun echo "# $CFG is reset to default" >> $FRAGMENT 133*4882a593Smuzhiyundone 134*4882a593Smuzhiyun 135*4882a593Smuzhiyuncat $FRAGMENT > $DEFCONFIG 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun# Verify defconfig fragment 138*4882a593Smuzhiyunsavedefconfig "$NEW_DEFCONFIG" "$DEFCONFIG" 139*4882a593Smuzhiyunif diff "$ORIG_DEFCONFIG" "$NEW_DEFCONFIG" | grep ""; then 140*4882a593Smuzhiyun echo "Configs unmatched, might be something wrong." 141*4882a593Smuzhiyun exit 1 142*4882a593Smuzhiyunfi 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun# Strip unneeded config resets 145*4882a593SmuzhiyunTEMP_FILE=$(mktemp) 146*4882a593Smuzhiyunfor CFG in $(grep " is reset to default$" "$DEFCONFIG" | cut -d' ' -f2); do 147*4882a593Smuzhiyun grep -wv "$CFG" "$DEFCONFIG" > $TEMP_FILE 148*4882a593Smuzhiyun savedefconfig "$NEW_DEFCONFIG" $TEMP_FILE 149*4882a593Smuzhiyun if ! diff "$ORIG_DEFCONFIG" "$NEW_DEFCONFIG" | grep -q ""; then 150*4882a593Smuzhiyun cat $TEMP_FILE > "$DEFCONFIG" 151*4882a593Smuzhiyun fi 152*4882a593Smuzhiyundone 153*4882a593Smuzhiyun 154*4882a593Smuzhiyunecho "Done updating $DEFCONFIG." 155