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