From 8be5b34f5420304183d0ebba8dd757b6b4b9476e Mon Sep 17 00:00:00 2001 From: Rhyland Klein Date: Mon, 21 May 2012 12:39:38 -0400 Subject: CHROMEOS: add chrome kernel infrastructure The ChromeOS build environment expects to build the kernel using a splitconfig. This change adds the scripts and configs required to satisfy this requirement. Right now the chromeos-tegra3 config is the only supported configuration using the splitconfigs. Signed-off-by: Rhyland Klein Change-Id: I21ac515261a03bdbe1c79bbd6cd02a6e34c82ef9 Reviewed-on: http://git-master/r/103683 Reviewed-by: Yu-Huan Hsu Reviewed-by: Dan Willemsen Reviewed-by: Allen Martin --- chromeos/scripts/allconfigs | 28 ++++++++++ chromeos/scripts/kernelconfig | 123 +++++++++++++++++++++++++++++++++++++++++ chromeos/scripts/prepareconfig | 18 ++++++ chromeos/scripts/splitconfig | 49 ++++++++++++++++ 4 files changed, 218 insertions(+) create mode 100755 chromeos/scripts/allconfigs create mode 100755 chromeos/scripts/kernelconfig create mode 100755 chromeos/scripts/prepareconfig create mode 100755 chromeos/scripts/splitconfig (limited to 'chromeos/scripts') diff --git a/chromeos/scripts/allconfigs b/chromeos/scripts/allconfigs new file mode 100755 index 000000000000..16431991d4da --- /dev/null +++ b/chromeos/scripts/allconfigs @@ -0,0 +1,28 @@ +#!/bin/bash + +bindir="`pwd`/chromeos/scripts" +confdir="`pwd`/chromeos/config" + +get_flavourconfigs() { + for file in `find $confdir`; do + if echo $file | egrep -q "config\.flavour\..*[^~]$"; then + basename $file | awk -F . '{ print $3 }' + fi + done +} + +get_arch() { + if find . -name config.flavour.$1 | grep -q i386; then + echo i386 + else + echo arm + fi +} + +for flavour in $(get_flavourconfigs); do + echo $flavour $(get_arch $flavour) + $bindir/prepareconfig $flavour + yes "" | make ARCH=$(get_arch $flavour) oldconfig + cp .config .config-$flavour +done + diff --git a/chromeos/scripts/kernelconfig b/chromeos/scripts/kernelconfig new file mode 100755 index 000000000000..c056c8c6086f --- /dev/null +++ b/chromeos/scripts/kernelconfig @@ -0,0 +1,123 @@ +#!/bin/bash + +# Script to merge all configs and run 'make silentoldconfig' on it to wade out bad juju. +# Then split the configs into distro-commmon and flavour-specific parts + +# We have to be in the top level kernel source directory +if [ ! -f MAINTAINERS ] || [ ! -f Makefile ]; then + echo "This does not appear to be the kernel source directory." 1>&2 + exit 1 +fi + +mode=${1:?"Usage: $0 [oldconfig|editconfig]"} +case "$mode" in + oldconfig) ;; # All is good + editconfig) ;; # All is good + genconfig) ;; # All is good + *) echo "$0 called with invalid mode" 1>&2 + exit 1 ;; +esac +kerneldir="`pwd`" +confdir="$kerneldir/chromeos/config" +archs="x86_64 i386 armel" +family='chromeos' +bindir="`pwd`/chromeos/scripts" +common_conf="$confdir/config.common.$family" +tmpdir=`mktemp -d` + +if [ "$mode" = "genconfig" ]; then + keep=1 + mode="oldconfig" + test -d CONFIGS || mkdir CONFIGS +fi + +test -d build || mkdir build + +for arch in $archs; do + # Map debian archs to kernel archs + case "$arch" in + amd64) kernarch="x86_64" ;; + lpia) kernarch="x86" ;; + sparc) kernarch="sparc64" ;; + armel) kernarch="arm" ;; + *) kernarch="$arch" ;; + esac + + echo "" + echo "***************************************" + echo "* Processing $arch ($kernarch) ... " + archconfdir=$confdir/$arch + flavourconfigs=$(cd $archconfdir && ls config.flavour.*[^~]) + + # Merge configs + # We merge config.common.ubuntu + config.common. + + # config.flavour. + + for config in $flavourconfigs; do + fullconf="$tmpdir/$arch-$config-full" + case $config in + *) + : >"$fullconf" + if [ -f $common_conf ]; then + cat $common_conf >> "$fullconf" + fi + if [ -f $archconfdir/config.common.$arch ]; then + cat $archconfdir/config.common.$arch >> "$fullconf" + fi + cat "$archconfdir/$config" >>"$fullconf" + ;; + esac + done + + for config in $flavourconfigs; do + if [ -f $archconfdir/$config ]; then + fullconf="$tmpdir/$arch-$config-full" + cat "$fullconf" > build/.config + # Call oldconfig or menuconfig + case "$mode" in + oldconfig) + # Weed out incorrect config parameters + echo "* Run silentoldconfig on $arch/$config ..." + make O=`pwd`/build ARCH=$kernarch silentoldconfig ;; + editconfig) + # Interactively edit config parameters + echo " * Run menuconfig on $arch/$config... Press a key." + read + make O=`pwd`/build ARCH=$kernarch menuconfig ;; + *) # Bad! + exit 1 ;; + esac + cat build/.config > $archconfdir/$config + if [ "$keep" = "1" ]; then + cat build/.config > CONFIGS/$arch-$config + fi + else + echo "!! Config not found $archconfdir/$config..." + 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 + (cd $archconfdir; rm config.common.$arch; $bindir/splitconfig; \ + mv config.common config.common.$arch; \ + cp config.common.$arch $tmpdir) +done + +rm -f $common_conf + +# Now run splitconfig on all the config.common. copied to +# $tmpdir +(cd $tmpdir; $bindir/splitconfig) +( + cd $confdir; + rm -f *-full + grep -v 'is UNMERGABLE' <$tmpdir/config.common >$common_conf + for arch in $archs; do + grep -v 'is UNMERGABLE' <$tmpdir/config.common.$arch \ + >$arch/config.common.$arch + done +) diff --git a/chromeos/scripts/prepareconfig b/chromeos/scripts/prepareconfig new file mode 100755 index 000000000000..b82cf35919fe --- /dev/null +++ b/chromeos/scripts/prepareconfig @@ -0,0 +1,18 @@ +#!/bin/bash + +family=chromeos + +flavourconf=$(find ${family} -name config.flavour.$1) +if [ ! -f "${flavourconf}" ]; then + echo "Found no flavour configuration for '$1'." 1>&2 + exit 1 +fi + +outputfile="${2:-.config}" + +archconfdir=$(dirname ${flavourconf}) + +# Generate .config +cat ${family}/config/config.common.${family} \ + ${archconfdir}/config.common.* \ + "${flavourconf}" > "${outputfile}" diff --git a/chromeos/scripts/splitconfig b/chromeos/scripts/splitconfig new file mode 100755 index 000000000000..262fa2015c1d --- /dev/null +++ b/chromeos/scripts/splitconfig @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +import os +import re +import sys + +allconfigs = {} + +# Parse config files +for config in os.listdir("."): + # Only config.* + if not config.startswith("config."): + continue + # Ignore emacs backups + if config.endswith("~"): + continue + # Nothing that is disabled, or remnant + if re.search("\.(default|disabled|stub)$", config): + continue + + allconfigs[config] = set() + + for line in open(config): + m = re.match("#*\s*CONFIG_(\w+)[\s=](.*)$", line) + if not m: + continue + option, value = m.groups() + allconfigs[config].add((option, value)) + +# Split out common config options +common = allconfigs.values()[0].copy() +for config in allconfigs.keys(): + common &= allconfigs[config] +for config in allconfigs.keys(): + allconfigs[config] -= common +allconfigs["config.common"] = common + +# Generate new splitconfigs +for config in allconfigs.keys(): + f = open(config, "w") + command = os.path.basename(sys.argv[0]) + print >>f, "#\n# Config options generated by %s\n#" % command + for option, value in sorted(list(allconfigs[config])): + if value == "is not set": + print >>f, "# CONFIG_%s %s" % (option, value) + else: + print >>f, "CONFIG_%s=%s" % (option, value) + + f.close() -- cgit v1.2.3