#!/bin/bash ############################################################################### # IPFire.org - An Open Source Firewall Solution # # Copyright (C) - IPFire Development Team # ############################################################################### BASEDIR=$(dirname ${0}) SCRIPTS_DIR=${BASEDIR} # x86_64 CONFIGS="x86_64:default" # i686 CONFIGS="${CONFIGS} i686:legacy i686:default" # aarch64 CONFIGS="${CONFIGS} aarch64:default" # armv7hl CONFIGS="${CONFIGS} armv7hl:lpae armv7hl:default" # armv5tel CONFIGS="${CONFIGS} armv5tel:default" PLATFORMS="x86 arm" declare -A SUBPLATFORMS SUBPLATFORMS=( [arm]="arm64 arm32" ) function get_platform() { local arch="${1}" case "${arch}" in aarch64|arm*) echo "arm" ;; x86_64|i?86) echo "x86" ;; *) return 1 ;; esac } function get_subplatform() { local arch="${1}" case "${arch}" in aarch64) echo "arm64" ;; arm*) echo "arm32" ;; *) return 1 ;; esac } function get_kernel_arch() { local arch="${1}" case "${arch}" in aarch64) echo "arm64" ;; arm*) echo "arm" ;; x86_64|i?86) echo "x86" ;; esac } function merge_config() { local arch=${1} local flavour=${2} local output=${3} shift 3 local arg for arg in arch flavour output; do if [ -z "${!arg}" ]; then echo >&2 "merge usage: " exit 2 fi done local config_mode="oldnoconfig" local extra_configs while [ $# -gt 0 ]; do case "${1}" in --mode=*) config_mode=${1#--mode=} shift ;; -*) echo >&2 "Unknown option: ${1}" ;; *) extra_configs="${extra_configs} ${1}" ;; esac shift done local configs="${extra_configs} config-generic" case "${arch}:${flavour}" in # x86 x86_64:default) configs="${configs} config-x86-generic config-x86_64-default" ;; i686:default) configs="${configs} config-x86-generic config-i686-default" ;; i686:legacy) configs="${configs} config-x86-generic config-i686-default" configs="${configs} config-i686-legacy" ;; # ARM64 aarch64:default) configs="${configs} config-arm-generic config-arm64-generic" ;; # ARM armv5tel:default) configs="${configs} config-arm-generic config-arm32-generic" configs="${configs} config-armv5tel-default" ;; armv7hl:default) configs="${configs} config-arm-generic config-arm32-generic" configs="${configs} config-armv7hl-default" ;; armv7hl:lpae) configs="${configs} config-arm-generic config-arm32-generic" configs="${configs} config-armv7hl-default config-armv7hl-lpae" ;; *) echo >&2 "ERROR: Invalid parameters given: $@" return 1 ;; esac # Merge the configuration files from its elementary configuration # files. local tmp_out=$(mktemp) local tmp_in=$(mktemp) local config for config in ${configs}; do cat ${tmp_out} > ${tmp_in} perl ${SCRIPTS_DIR}/merge.pl \ ${config} ${tmp_in} > ${tmp_out} done if [ "${config_mode}" != "none" ]; then echo "Running 'make oldnoconfig' for ${arch} (${flavour})..." local kernel_arch="$(get_kernel_arch "${arch}")" ( cd ${KERNEL_DIR} cat ${tmp_out} > .config make ARCH="${kernel_arch}" ${config_mode} cat .config > ${tmp_out} ) fi cat ${tmp_out} > ${output} rm -f ${tmp_in} ${tmp_out} } # This function runs an interactive "make oldconfig". function make_oldconfig() { local arch="x86_64" local kernel_arch="x86" local flavour="default" local config_in=$(mktemp) local config_out=$(mktemp) local diff_out=$(mktemp) merge_config ${arch} ${flavour} ${config_in} --mode=none ( cd ${KERNEL_DIR} cat ${config_in} > .config echo "You may now edit the configuration..." local option select option in oldconfig menuconfig oldnoconfig startover quit; do case "${option}" in oldconfig|menuconfig|oldnoconfig) make ARCH=${kernel_arch} ${option} ;; startover) cat ${config_in} > .config ;; quit) break ;; esac done cat .config > ${config_out} ) ${SCRIPTS_DIR}/configdiff.py ${config_in} ${config_out} > ${diff_out} # Update the rest of the configurations. diff_configs ${diff_out} --mode=oldconfig rm -f ${config_in} ${config_out} ${diff_out} } # config-generic # Intersection of all files. # config-x86-generic # Diff of (intersection of (i686-{default,legacy} and x86_64-default) # against config-generic). # config-x86-x86_64 # Diff against merge of (config-generic and config-x86-generic). function diff_configs() { local extra_configs="$@" local filename local platform local subplatform declare -A platform_configs declare -A subplatform_configs tmpdir=$(mktemp -d) for config in ${CONFIGS}; do arch=${config%:*} flavour=${config#*:} filename=${tmpdir}/config-${arch}-${flavour} merge_config ${arch} ${flavour} ${filename} ${extra_configs} # Do not include leaf configuration. case "${config}" in armv7hl:lpae) continue ;; i686:legacy) continue ;; esac platform="$(get_platform "${arch}")" subplatform="$(get_subplatform "${arch}")" if [ -n "${subplatform}" ]; then subplatform_configs[${subplatform}]="${subplatform_configs[${subplatform}]} ${filename}" else platform_configs[${platform}]="${platform_configs[${platform}]} ${filename}" fi done local common_configs for platform in ${PLATFORMS}; do for subplatform in ${SUBPLATFORMS[${platform}]}; do filename="${tmpdir}/config-${subplatform}-common" ${SCRIPTS_DIR}/configcommon.py ${subplatform_configs[${subplatform}]} \ > ${filename} platform_configs[${platform}]="${platform_configs[${platform}]} ${filename}" done filename="${tmpdir}/config-${platform}-common" ${SCRIPTS_DIR}/configcommon.py ${platform_configs[${platform}]} \ > ${filename} common_configs="${common_configs} ${filename}" done ${SCRIPTS_DIR}/configcommon.py ${common_configs} > ${tmpdir}/config-generic for platform in ${PLATFORMS}; do for subplatform in ${SUBPLATFORMS[${platform}]}; do ${SCRIPTS_DIR}/configdiff.py \ ${tmpdir}/config-${platform}-common \ ${tmpdir}/config-${subplatform}-common \ > ${tmpdir}/config-${subplatform}-generic done ${SCRIPTS_DIR}/configdiff.py \ ${tmpdir}/config-generic \ ${tmpdir}/config-${platform}-common \ > ${tmpdir}/config-${platform}-generic done for config in ${CONFIGS}; do arch=${config%:*} flavour=${config#*:} filename=${tmpdir}/config-${arch}-${flavour} case "${config}" in aarch64:default) # Virtual configuration rm -f ${filename} continue ;; armv7hl:lpae|i686:legacy) # Legacy depends directly on the default configuration. ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${arch}-default \ ${filename} > ${filename}.tmp ;; *) platform="$(get_subplatform "${arch}" || get_platform "${arch}")" ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${platform}-common \ ${filename} > ${filename}.tmp ;; esac mv ${filename}{.tmp,} done rm -f ${tmpdir}/config-*-common for config in ${tmpdir}/*; do if ! cmp $(basename ${config}) ${config} &>/dev/null; then echo "$(basename ${config}) has changed." fi cat ${config} > $(basename ${config}) done rm -rf ${tmpdir} } KERNEL_DIR= # Parse commandline. while [ $# -gt 0 ]; do arg=${1}; shift case "${arg}" in --kernel-dir=*) KERNEL_DIR=${arg#--kernel-dir=} ;; help|"") echo "${0} - available commands:" echo " * merge " echo " * update ..." echo " * oldconfig" echo "" echo " You must always set --kernel-dir=..." exit 0 ;; merge|oldconfig|update) action=${arg} break ;; esac done if [ -z "${KERNEL_DIR}" ]; then echo >&2 "--kernel-dir=... was not set!" exit 2 fi if [ -z "${action}" ]; then echo >&2 "No action given... Try ${0} help." exit 2 fi case "${action}" in merge) merge_config $@ exit $? ;; oldconfig) make_oldconfig exit $? ;; update) diff_configs $@ exit $? ;; esac exit 1