191 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # Script to merge all configs and run 'make oldconfig' on it to wade out bad juju.
 | |
| # Then split the configs into distro-commmon and flavour-specific parts
 | |
| #
 | |
| # See this page for more details:
 | |
| # http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/kernel-configuration
 | |
| 
 | |
| error() {
 | |
| 	printf 'error: %b\n' "$*" >&2
 | |
| }
 | |
| 
 | |
| die() {
 | |
| 	error "$@"
 | |
| 	exit 1
 | |
| }
 | |
| 
 | |
| usage() {
 | |
| 	cat <<-EOF
 | |
| 	Usage: ${0##*/} [options] <oldconfig|olddefconfig|editconfig|genconfig>
 | |
| 
 | |
| 	Options:
 | |
| 	  -h   This screen.
 | |
| 	EOF
 | |
| 
 | |
| 	if [[ $# -gt 0 ]]; then
 | |
| 		echo
 | |
| 		die "$@"
 | |
| 	else
 | |
| 		exit 0
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| build_one() {
 | |
| 	local arch=$1
 | |
| 	local kernarch
 | |
| 
 | |
| 	# Map debian archs to kernel archs.
 | |
| 	case "${arch}" in
 | |
| 	armel) kernarch="arm" ;;
 | |
| 	*)     kernarch="${arch}" ;;
 | |
| 	esac
 | |
| 
 | |
| 	echo ""
 | |
| 	echo "***************************************"
 | |
| 	echo "* Processing ${arch} (${kernarch}) ... "
 | |
| 
 | |
| 	local O="$(pwd)/build/${arch}"
 | |
| 	mkdir -p "${O}"
 | |
| 
 | |
| 	local config
 | |
| 	local archconfdir="${confdir}/${arch}"
 | |
| 	local flavourconfigs=( $(cd "${archconfdir}" && echo *.flavour.config) )
 | |
| 
 | |
| 	# Merge configs
 | |
| 	# We merge base.config + common.config + <flavour>.flavour.config
 | |
| 
 | |
| 	for config in "${flavourconfigs[@]}"; do
 | |
| 		cat \
 | |
| 			"${base_conf}" \
 | |
| 			"${archconfdir}/common.config" \
 | |
| 			"${archconfdir}/${config}" \
 | |
| 			> "${O}/.config"
 | |
| 		# Call oldconfig or menuconfig
 | |
| 		case ${mode} in
 | |
| 		oldconfig|olddefconfig)
 | |
| 			# Weed out incorrect config parameters
 | |
| 			echo "* Run ${mode} on ${arch}/${config} ..."
 | |
| 			make -j O="${O}" ARCH=${kernarch} "${mode}"
 | |
| 			;;
 | |
| 		editconfig)
 | |
| 			# Interactively edit config parameters
 | |
| 			echo "* ${arch}/${config}: press <Enter> to edit, S to skip"
 | |
| 			read -s -n 1
 | |
| 			case ${REPLY} in
 | |
| 			s|S)
 | |
| 				echo "* Skip: running oldconfig"
 | |
| 				make -j O="${O}" ARCH=${kernarch} oldconfig
 | |
| 				;;
 | |
| 			*)
 | |
| 				echo "* Running menuconfig"
 | |
| 				make -j O="${O}" ARCH=${kernarch} menuconfig
 | |
| 				;;
 | |
| 			esac
 | |
| 			;;
 | |
| 		*)	# Bad!
 | |
| 			die "invalid mode ${mode}"
 | |
| 			;;
 | |
| 		esac
 | |
| 
 | |
| 		cat "${O}/.config" > "${archconfdir}/${config}"
 | |
| 		if [[ "${keep}" == "1" ]]; then
 | |
| 			# oldconfig is probably redundant because .config is
 | |
| 		        # likely formatted already at this point, however
 | |
| 		        # this only take a split-second and could flag some
 | |
| 		        # issues.
 | |
| 			make -j O="${O}" ARCH=${kernarch} oldconfig
 | |
| 			make -j O="${O}" ARCH=${kernarch} savedefconfig
 | |
| 			mv "${O}"/.config "CONFIGS/${arch}-${config}"
 | |
| 			mv "${O}"/defconfig "CONFIGS/${arch}-${config}.def"
 | |
| 		fi
 | |
| 	done
 | |
| 
 | |
| 	echo "Running splitconfig for ${arch}"
 | |
| 	echo
 | |
| 
 | |
| 	# Can we make this more robust by avoiding $tmpdir completely?
 | |
| 	# This approach was used for now because I didn't want to change
 | |
| 	# splitconfig
 | |
| 	pushd "${archconfdir}" >/dev/null
 | |
| 	rm common.config
 | |
| 	"${bindir}/splitconfig"
 | |
| 	mv common.config "${tmpdir}/${arch}.config"
 | |
| 	popd >/dev/null
 | |
| }
 | |
| 
 | |
| cleanup() {
 | |
| 	rm -rf "${tmpdir}"
 | |
| }
 | |
| 
 | |
| cd_kerneldir() {
 | |
| 	# We have to be in the top level kernel source directory.
 | |
| 	if [[ ! -f MAINTAINERS || ! -f Makefile ]]; then
 | |
| 		# See if we can find it automatically first.
 | |
| 		local d=$(realpath "${0%/*}/../..")
 | |
| 		cd "${d}"
 | |
| 		if [[ ! -f MAINTAINERS || ! -f Makefile ]]; then
 | |
| 			die "This does not appear to be the kernel source directory."
 | |
| 		else
 | |
| 			echo "Using top kernel dir: ${d}"
 | |
| 		fi
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| main() {
 | |
| 	# Process use flags first (so -h works nicely).
 | |
| 	local opt
 | |
| 	while getopts "h" opt; do
 | |
| 		case ${opt} in
 | |
| 		h) usage ;;
 | |
| 		*) usage "Invalid option ${opt}" ;;
 | |
| 		esac
 | |
| 	done
 | |
| 	shift $(( OPTIND - 1 ))
 | |
| 
 | |
| 	# Process the remaining args.
 | |
| 	local mode=$1
 | |
| 	case ${mode} in
 | |
| 	oldconfig|olddefconfig)  ;; # All is good
 | |
| 	editconfig) ;; # All is good
 | |
| 	genconfig)  ;; # All is good
 | |
| 	*) usage "invalid/missing mode: ${mode}" ;;
 | |
| 	esac
 | |
| 
 | |
| 	# Then make sure we're in the right directory.
 | |
| 	cd_kerneldir
 | |
| 
 | |
| 	# Set up variables the build func expects.
 | |
| 	local kerneldir=$(pwd)
 | |
| 	local confdir="${kerneldir}/chromeos/config"
 | |
| 	local archs=( x86_64 armel )
 | |
| 	local bindir="${kerneldir}/chromeos/scripts"
 | |
| 	local base_conf="${confdir}/base.config"
 | |
| 
 | |
| 	export tmpdir=$(mktemp -d)
 | |
| 	trap cleanup EXIT
 | |
| 
 | |
| 	local keep=0
 | |
| 	if [[ "${mode}" == "genconfig" ]]; then
 | |
| 		keep=1
 | |
| 		mode="oldconfig"
 | |
| 		mkdir -p CONFIGS
 | |
| 	fi
 | |
| 
 | |
| 	mkdir -p build
 | |
| 
 | |
| 	echo "running ${mode} for ${archs[*]}"
 | |
| 	echo ""
 | |
| 	for arch in "${archs[@]}"; do
 | |
| 		build_one "${arch}"
 | |
| 	done
 | |
| 
 | |
| 	# Now run splitconfig on all the <arch>.common.config copied to $tmpdir.
 | |
| 	pushd "${tmpdir}" >/dev/null
 | |
| 	"${bindir}/splitconfig"
 | |
| 	mv "common.config" "${base_conf}"
 | |
| 	for arch in "${archs[@]}"; do
 | |
| 		mv "${arch}.config" "${confdir}/${arch}/common.config"
 | |
| 	done
 | |
| }
 | |
| main "$@"
 |