blob: 7fd0ac7c71c92ffc70c8fd62f489264791cd06d3 [file] [log] [blame]
#!/usr/bin/env bash
# Usage:
# build/config.sh <config editor> <make options>*
#
# Example:
# build/config.sh menuconfig|config|nconfig|... (default to menuconfig)
#
# Runs a configuration editor inside kernel/build environment.
#
# In addition to the environment variables considered in build/build.sh, the
# the following can be defined:
#
# FRAGMENT_CONFIG
# If set, the FRAGMENT_CONFIG file (absolute or relative to ROOT_DIR) is
# updated with the options selected by the config editor.
#
# Note: When editing a FRAGMENT_CONFIG, config.sh is intentionally
# unintelligent about removing "redundant" configuration options. That is,
# setting CONFIG_ARM_SMMU=m using config.sh, then unsetting it would
# result in a fragment config with CONFIG_ARM_SMMU explicitly unset.
# This behavior is desired since it is unknown whether the base
# configuration without the fragment would have CONFIG_ARM_SMMU (un)set.
# If desire is to let the base configuration properly control a CONFIG_
# option, then remove the line from FRAGMENT_CONFIG
export ROOT_DIR=$($(dirname $(readlink -f $0))/gettop.sh)
# Disable hermetic toolchain for ncurses
# TODO: Support hermetic toolchain with ncurses menuconfig, xconfig
HERMETIC_TOOLCHAIN=0
set -e
set -a
source "${ROOT_DIR}/build/_setup_env.sh"
set -a
# Disable mixed build
GKI_BUILD_CONFIG=
function sort_config() {
# Normal sort won't work because all the "# CONFIG_.. is not set" would come
# before all the "CONFIG_..=m". Use sed to extract the CONFIG_ option and prefix
# the line in front of the line to create a key (e.g. CONFIG_.. # CONFIG_.. is not set),
# sort, then remove the key
sed -E -e 's/.*(CONFIG_[^ =]+).*/\1 \0/' $1 | sort -k1 | cut -F2-
}
function menuconfig() {
set +x
local orig_config=$(mktemp)
local new_config="${OUT_DIR}/.config"
local changed_config=$(mktemp)
local new_fragment=$(mktemp)
trap "rm -f ${orig_config} ${changed_config} ${new_fragment}" EXIT
if [ -n "${FRAGMENT_CONFIG}" ]; then
if [[ -f "${ROOT_DIR}/${FRAGMENT_CONFIG}" ]]; then
FRAGMENT_CONFIG="${ROOT_DIR}/${FRAGMENT_CONFIG}"
elif [[ "${FRAGMENT_CONFIG}" != /* ]]; then
echo "FRAGMENT_CONFIG must be an absolute path or relative to ${ROOT_DIR}: ${FRAGMENT_CONFIG}"
exit 1
elif [[ ! -f "${FRAGMENT_CONFIG}" ]]; then
echo "Failed to find FRAGMENT_CONFIG: ${FRAGMENT_CONFIG}"
exit 1
fi
fi
cp ${OUT_DIR}/.config ${orig_config}
(cd ${KERNEL_DIR} && make ${TOOL_ARGS} O=${OUT_DIR} ${MAKE_ARGS} ${1:-menuconfig})
if [ -z "${FRAGMENT_CONFIG}" ]; then
(cd ${KERNEL_DIR} && make ${TOOL_ARGS} O=${OUT_DIR} ${MAKE_ARGS} savedefconfig)
[ "$ARCH" = "x86_64" -o "$ARCH" = "i386" ] && local ARCH=x86
echo "Updating ${ROOT_DIR}/${KERNEL_DIR}/arch/${ARCH}/configs/${DEFCONFIG}"
mv ${OUT_DIR}/defconfig ${ROOT_DIR}/${KERNEL_DIR}/arch/${ARCH}/configs/${DEFCONFIG}
return
fi
${KERNEL_DIR}/scripts/diffconfig -m ${orig_config} ${new_config} > ${changed_config}
KCONFIG_CONFIG=${new_fragment} ${ROOT_DIR}/${KERNEL_DIR}/scripts/kconfig/merge_config.sh -m ${FRAGMENT_CONFIG} ${changed_config}
sort_config ${new_fragment} > ${FRAGMENT_CONFIG}
set +x
echo
echo "Updated ${FRAGMENT_CONFIG}"
echo
}
menucommand="${1:-menuconfig}"
MAKE_ARGS="${@:2}"
if [[ "${menucommand}" =~ "*config" ]]; then
MAKE_ARGS="$*"
menucommand="menuconfig"
fi
# let all the POST_DEFCONFIG_CMDS run since they may clean up loose files, then exit
append_cmd POST_DEFCONFIG_CMDS "exit"
# menuconfig should go first. If POST_DEFCONFIG_CMDS modifies the .config, then we probably don't
# want those changes to end up in the resulting saved defconfig
POST_DEFCONFIG_CMDS="menuconfig ${menucommand} && ${POST_DEFCONFIG_CMDS}"
${ROOT_DIR}/build/build.sh ${MAKE_ARGS}