coreboot-kgpe-d16/util/abuild/abuild
Patrick Georgi 240ef7c769 Change the CBFS build process to use coreboot.rom
instead of coreboot.strip. That fixes the normal
image because the calculations for its offset in
the ROM match reality again.

This requires changes in CBFS configurations to
minimize the bootblock size. These are also done
for CBFS boards.

Other than this a couple of minor fixes are in this
patch:
- make asus/m2v-mx_se build with abuild with a
  crosscompiler
- move CONFIG_CBFS for hp/dl145_g3 to Options.lb
  as it's done everywhere else
- change the default config of abuild to not
  provide ROM_IMAGE_SIZE values for the images
  in a CBFS configuration
- change abuild's crosscompile autodetection to
  not try to use "i386-elf-i386-elf-gcc" (which
  is bogus)

Except for the latter two abuild changes (both
in util/abuild/abuild), they're available as
patch set on the mailing list in a mail from
2009-06-05 titled
[PATCH]es to get normal image to work again with CBFS

The changes in util/abuild/abuild are trivial and
abuild tested.

As discussed on the list,
targets/hp/dl145_g3/Config-abuild.lb is
deleted, now that Config.lb works again.

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4344 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
2009-06-06 07:19:53 +00:00

676 lines
16 KiB
Bash
Executable file

#!/bin/bash
#
# coreboot autobuild
#
# This script builds coreboot images for all available targets.
#
# (C) 2004 by Stefan Reinauer <stepan@openbios.org>
# (C) 2006-2009 by coresystems GmbH <info@coresystems.de>
#
# This file is subject to the terms and conditions of the GNU General
# Public License. See the file COPYING in the main directory of this
# archive for more details.
#
#set -x # Turn echo on....
ABUILD_DATE="April 10th, 2009"
ABUILD_VERSION="0.8.1"
# Where shall we place all the build trees?
TARGET=$( pwd )/coreboot-builds
XMLFILE=$( pwd )/abuild.xml
# path to payload. Should be more generic
PAYLOAD=/dev/null
# Lines of error context to be printed in FAILURE case
CONTEXT=5
TESTSUBMISSION="http://qa.coreboot.org/deployment/send.php"
# Number of CPUs to compile on per default
cpus=1
# Configure-only mode
configureonly=0
# One might want to adjust these in case of cross compiling
for i in make gmake gnumake nonexistant_make; do
$i --version 2>/dev/null |grep "GNU Make" >/dev/null && break
done
if [ "$i" = "nonexistant_make" ]; then
echo No GNU Make found.
exit 1
fi
MAKE=$i
PYTHON=python
# this can be changed to xml by -x
mode=text
# silent mode.. no compiler calls, only warnings in the log files.
# this is disabled per default but can be enabled with -s
silent=
# clang mode enabled by -sb option.
scanbuild=false
# stackprotect mode enabled by -ns option.
stackprotect=false
# loglevel changed with -l / --loglevel option
loglevel=default
ARCH=`uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/i86pc/i386/ \
-e s/arm.*/arm/ -e s/sa110/arm/ -e s/x86_64/amd64/ \
-e "s/Power Macintosh/ppc/"`
trap interrupt INT
function interrupt
{
printf "\n$0: execution interrupted manually.\n"
if [ "$mode" == "xml" ]; then
printf "$0: deleting incomplete xml output file.\n"
fi
exit 1
}
function debug
{
test "$verbose" == "true" && printf "$*\n"
}
function xml
{
test "$mode" == "xml" && printf "$*\n" >> $XMLFILE
}
function xmlfile
{
test "$mode" == "xml" && {
printf '<![CDATA[\n'
cat $1
printf ']]>\n'
} >> $XMLFILE
}
function vendors
{
# make this a function so we can easily select
# without breaking readability
ls -1 "$LBROOT/src/mainboard" | grep -v CVS
}
function mainboards
{
# make this a function so we can easily select
# without breaking readability
VENDOR=$1
ls -1 $LBROOT/src/mainboard/$VENDOR | grep -v CVS
}
function architecture
{
VENDOR=$1
MAINBOARD=$2
ARCH=`cat $LBROOT/src/mainboard/$VENDOR/$MAINBOARD/Config.lb | \
grep ^arch | cut -f 2 -d\ `
echo $ARCH | sed s/ppc/powerpc/
}
function create_config
{
VENDOR=$1
MAINBOARD=$2
CONFIG=$3
TARCH=$( architecture $VENDOR $MAINBOARD )
TARGCONFIG=$LBROOT/targets/$VENDOR/$MAINBOARD/Config-abuild.lb
if [ "$CONFIG" != "" ]; then
TARGCONFIG=$LBROOT/targets/$VENDOR/$MAINBOARD/$CONFIG
fi
# get a working payload for the board if we have one.
# the --payload option expects a directory containing
# a shell script payload.sh
# Usage: payload.sh [VENDOR] [DEVICE]
# the script returns an absolute path to the payload binary.
if [ -f $payloads/payload.sh ]; then
PAYLOAD=`sh $payloads/payload.sh $VENDOR $MAINBOARD`
printf "Using payload $PAYLOAD\n"
fi
mkdir -p $TARGET
if [ -f $TARGCONFIG ]; then
cp $TARGCONFIG $TARGET/Config-${VENDOR}_${MAINBOARD}.lb
printf "Using existing test target $TARGCONFIG"
xml " <config>$TARGCONFIG</config>"
else
printf " Creating config file..."
xml " <config>autogenerated</config>"
( cat << EOF
# This will make a target directory of ./VENDOR_MAINBOARD
target VENDOR_MAINBOARD
mainboard VENDOR/MAINBOARD
option CC="CROSSCC"
option CROSS_COMPILE="CROSS_PREFIX"
option HOSTCC="CROSS_HOSTCC"
__COMPRESSION__
__LOGLEVEL__
EOF
if [ "$TARCH" == i386 ] ; then
cat <<EOF
romimage "normal"
option USE_FALLBACK_IMAGE=0
if CONFIG_CBFS
else
option ROM_IMAGE_SIZE=0x17000
end
option COREBOOT_EXTRA_VERSION=".0-normal"
payload __PAYLOAD__
end
romimage "fallback"
option USE_FALLBACK_IMAGE=1
if CONFIG_CBFS
else
option ROM_IMAGE_SIZE=0x17000
end
option COREBOOT_EXTRA_VERSION=".0-fallback"
payload __PAYLOAD__
end
buildrom ./coreboot.rom ROM_SIZE "normal" "fallback"
EOF
else
cat <<EOF
romimage "only"
option COREBOOT_EXTRA_VERSION=".0"
payload __PAYLOAD__
end
buildrom ./coreboot.rom ROM_SIZE "only"
EOF
fi
) > $TARGET/Config-${VENDOR}_${MAINBOARD}.lb
fi
if [ "$loglevel" != "default" ]; then
LOGLEVEL1="option MAXIMUM_CONSOLE_LOGLEVEL=$loglevel"
LOGLEVEL2="option DEFAULT_CONSOLE_LOGLEVEL=$loglevel"
else
LOGLEVEL1="# no loglevel override"
LOGLEVEL2=""
fi
COMPRESSION="# no compression"
if which lzma >/dev/null 2>/dev/null; then
if [ "$PAYLOAD" != /dev/null ]; then
COMPRESSION="option CONFIG_COMPRESSED_PAYLOAD_LZMA=1"
fi
fi
cp $TARGET/Config-${VENDOR}_${MAINBOARD}.lb $TARGET/Config-${VENDOR}_${MAINBOARD}.lb.pre
sed -e s:VENDOR:$VENDOR:g \
-e s:MAINBOARD:$MAINBOARD:g \
-e s:payload\ __PAYLOAD__:payload\ $PAYLOAD:g \
-e s:CROSSCC:"$CC":g \
-e s:CROSS_PREFIX:"$CROSS_COMPILE":g \
-e s:CROSS_HOSTCC:"$HOSTCC":g \
-e s:__COMPRESSION__:"$COMPRESSION":g \
-e s:__LOGLEVEL__:"$LOGLEVEL1"\
"$LOGLEVEL2":g \
$TARGET/Config-${VENDOR}_${MAINBOARD}.lb.pre > $TARGET/Config-${VENDOR}_${MAINBOARD}.lb
printf " ok\n"
}
function create_builddir
{
VENDOR=$1
MAINBOARD=$2
printf " Creating builddir..."
target_dir=$TARGET
config_dir=$LBROOT/util/newconfig
yapps2_py=$config_dir/yapps2.py
config_g=$config_dir/config.g
config_lb=Config-${VENDOR}_${MAINBOARD}.lb
cd $target_dir
build_dir=${VENDOR}_${MAINBOARD}
config_py=$build_dir/config.py
if [ ! -d $build_dir ] ; then
mkdir -p $build_dir
fi
if [ ! -f $config_py ]; then
$PYTHON $yapps2_py $config_g $config_py &> $build_dir/py.log
fi
# make sure config.py is up-to-date
export PYTHONPATH=$config_dir
$PYTHON $config_py $config_lb $LBROOT &> $build_dir/config.log
if [ $? -eq 0 ]; then
printf "ok\n"
xml " <builddir>ok</builddir>"
xml " <log>"
xmlfile $build_dir/config.log
xml " </log>"
xml ""
return 0
else
printf "FAILED! Log excerpt:\n"
xml " <builddir>failed</builddir>"
xml " <log>"
xmlfile $build_dir/config.log
xml " </log>"
xml ""
tail -n $CONTEXT $build_dir/config.log 2> /dev/null || tail -$CONTEXT $build_dir/config.log
return 1
fi
}
function create_buildenv
{
VENDOR=$1
MAINBOARD=$2
CONFIG=$3
create_config $VENDOR $MAINBOARD $CONFIG
create_builddir $VENDOR $MAINBOARD
}
function compile_target
{
VENDOR=$1
MAINBOARD=$2
printf " Compiling image "
test "$cpus" == "" && printf "in parallel .. "
test "$cpus" == "1" && printf "on 1 cpu .. "
test 0$cpus -gt 1 && printf "on %d cpus in parallel .. " $cpus
CURR=$( pwd )
cd $TARGET/${VENDOR}_${MAINBOARD}
stime=`perl -e 'print time();'`
eval $MAKE $silent -j $cpus &> make.log
ret=$?
etime=`perl -e 'print time();'`
duration=$(( $etime - $stime ))
if [ $ret -eq 0 ]; then
xml " <compile>ok</compile>"
xml " <compiletime>${duration}s</compiletime>"
xml " <log>"
xmlfile make.log
xml " </log>"
printf "ok\n" > compile.status
printf "ok. (took ${duration}s)\n"
cd $CURR
return 0
else
xml " <compile>failed</compile>"
xml " <compiletime>${duration}s</compiletime>"
xml " <log>"
xmlfile make.log
xml " </log>"
printf "FAILED after ${duration}s! Log excerpt:\n"
tail -n $CONTEXT make.log 2> /dev/null || tail -$CONTEXT make.log
cd $CURR
return 1
fi
}
function built_successfully
{
CURR=`pwd`
status="fail"
if [ -d "$TARGET/${VENDOR}_${MAINBOARD}" ]; then
cd $TARGET/${VENDOR}_${MAINBOARD}
if [ -r compile.status ] ; then
status=`cat compile.status`
fi
cd $CURR
fi
[ "$buildall" != "true" -a "$status" == "ok" ]
}
function build_broken
{
CURR=`pwd`
status="yes"
[ -r "$LBROOT/src/mainboard/${VENDOR}/${MAINBOARD}/BROKEN" ] && status="no"
[ "$buildbroken" == "true" -o "$status" == "yes" ]
}
function build_target
{
VENDOR=$1
MAINBOARD=$2
CONFIG=$3
TARCH=$( architecture $VENDOR $MAINBOARD )
# Allow architecture override in an abuild.info file.
# This is used for the Motorola Sandpoint, which is not a real target
# but a skeleton target for the Sandpoint X3.
[ -r "$LBROOT/src/mainboard/${VENDOR}/${MAINBOARD}/abuild.info" ] && \
source $LBROOT/src/mainboard/${VENDOR}/${MAINBOARD}/abuild.info
# default setting
CC="${CROSS_COMPILE}gcc"
CROSS_COMPILE=""
found_crosscompiler=false
if which $TARCH-elf-gcc 2>/dev/null >/dev/null; then
# i386-elf target needs --divide, for i386-linux, that's the default
if [ "$TARCH" = "i386" ]; then
CC="$CC -Wa,--divide"
fi
CROSS_COMPILE="$TARCH-elf-"
CC=gcc
echo using $CROSS_COMPILE$CC
found_crosscompiler=true
fi
HOSTCC='gcc'
printf "Processing mainboard/$VENDOR/$MAINBOARD"
xml "<mainboard>"
xml ""
xml " <vendor>$VENDOR</vendor>"
xml " <device>$MAINBOARD</device>"
xml ""
xml " <architecture>$TARCH</architecture>"
xml ""
if [ "$ARCH" = "$TARCH" -o $found_crosscompiler = true ]; then
printf " ($TARCH: ok)\n"
else
found_crosscompiler=false
if [ "$ARCH" == amd64 -a "$TARCH" == i386 ]; then
CC="gcc -m32"
found_crosscompiler=true
fi
if [ "$ARCH" == ppc64 -a "$TARCH" == ppc ]; then
CC="gcc -m32"
found_crosscompiler=true
fi
if [ "$found_crosscompiler" == "false" -a "$TARCH" == ppc ];then
for prefix in powerpc-eabi- powerpc-linux- ppc_74xx- \
powerpc-7450-linux-gnu- powerpc-elf-; do
if ${prefix}gcc --version > /dev/null 2> /dev/null ; then
found_crosscompiler=true
CROSS_COMPILE=$prefix
fi
done
fi
# TBD: look for suitable cross compiler suite
# cross-$TARCH-gcc and cross-$TARCH-ld
# Check result:
if [ $found_crosscompiler == "false" ]; then
printf " ($TARCH: skipped, we're $ARCH)\n\n"
xml " <status>notbuilt</status>"
xml ""
xml "</mainboard>"
return 0
else
printf " ($TARCH: ok, we're $ARCH with a ${CROSS_COMPILE} cross compiler)\n"
xml " <compiler>"
xml " <path>`which ${CROSS_COMPILE}gcc`</path>"
xml " <version>`${CROSS_COMPILE}gcc --version | head -1`</version>"
xml " </compiler>"
xml ""
fi
fi
CC=${CROSS_COMPILE}$CC
if [ "$stackprotect" = "true" ]; then
CC="$CC -fno-stack-protector"
fi
if [ "$scanbuild" = "true" ]; then
ccwrap=`mktemp`
mkdir -p $TARGET/${VENDOR}_${MAINBOARD}
mkdir -p $TARGET/scan-build-results-tmp
mv $ccwrap $TARGET/${VENDOR}_${MAINBOARD}
ccwrap=$TARGET/${VENDOR}_${MAINBOARD}/`basename $ccwrap`
echo '#!/bin/sh' > $ccwrap
echo $CC' "$@"' >> $ccwrap
chmod +x $ccwrap
origMAKE=$MAKE
MAKE="scan-build --use-cc=$ccwrap -o $TARGET/scan-build-results-tmp -analyze-headers $MAKE GCC=$ccwrap"
CC="\$(CC)"
HOSTCC="CCC_CC=$HOSTCC \$(CC)"
fi
built_successfully $VENDOR $MAINBOARD && \
{
printf " ( mainboard/$VENDOR/$MAINBOARD previously ok )\n\n"
xml " <status>previouslyok</status>"
xml ""
xml "</mainboard>"
return 0
}
build_broken $VENDOR $MAINBOARD || \
{
printf " ( broken mainboard/$VENDOR/$MAINBOARD skipped )\n\n"
xml " <status>knownbroken</status>"
xml ""
xml "</mainboard>"
return 0
}
create_buildenv $VENDOR $MAINBOARD $CONFIG
if [ $? -eq 0 -a $configureonly -eq 0 ]; then
compile_target $VENDOR $MAINBOARD &&
xml " <status>ok</status>" ||
xml "<status>broken</status>"
if [ "$scanbuild" = "true" ]; then
mv `dirname $TARGET/scan-build-results-tmp/*/index.html` $TARGET/${VENDOR}_${MAINBOARD}-scanbuild
MAKE=$origMAKE
fi
fi
xml ""
xml "</mainboard>"
printf "\n"
}
function test_target
{
VENDOR=$1
MAINBOARD=$2
if [ "$hwtest" != "true" ]; then
return 0
fi
# image does not exist. we silently skip the patch.
if [ ! -r "$TARGET/${VENDOR}_${MAINBOARD}/coreboot.rom" ]; then
return 0
fi
which curl &> /dev/null
if [ $? != 0 ]; then
printf "curl is not installed but required for test submission. skipping test.\n\n"
return 0
fi
CURR=`pwd`
if [ -r "$TARGET/${VENDOR}_${MAINBOARD}/tested" ]; then
printf "Testing image for board $VENDOR $MAINBOARD skipped (previously submitted).\n\n"
return 0
fi
# touch $TARGET/${VENDOR}_${MAINBOARD}/tested
printf "Submitting image for board $VENDOR $MAINBOARD to test system...\n"
curl -f -F "romfile=@$TARGET/${VENDOR}_${MAINBOARD}/coreboot.rom" \
-F "mode=abuild" -F "mainboard=${VENDOR}_${MAINBOARD}" -F "submit=Upload" \
"http://qa.coreboot.org/deployment/send.php"
printf "\n"
return 0
}
function remove_target
{
if [ "$remove" != "true" ]; then
return 0
fi
VENDOR=$1
MAINBOARD=$2
# Save the generated coreboot.rom file of each board.
if [ -r "$TARGET/${VENDOR}_${MAINBOARD}/coreboot.rom" ]; then
cp $TARGET/${VENDOR}_${MAINBOARD}/coreboot.rom \
${VENDOR}_${MAINBOARD}_coreboot.rom
fi
printf "Removing build dir for board $VENDOR $MAINBOARD...\n"
rm -rf $TARGET/${VENDOR}_${MAINBOARD}
return 0
}
function myhelp
{
printf "Usage: $0 [-v] [-a] [-b] [-r] [-t <vendor/board>] [-p <dir>] [lbroot]\n"
printf " $0 [-V|--version]\n"
printf " $0 [-h|--help]\n\n"
printf "Options:\n"
printf " [-v|--verbose] print more messages\n"
printf " [-a|--all] build previously succeeded ports as well\n"
printf " [-b|--broken] attempt to build ports that are known broken\n"
printf " [-r|--remove] remove output dir after build\n"
printf " [-t|--target <vendor/board>] attempt to build target vendor/board only\n"
printf " [-p|--payloads <dir>] use payloads in <dir> to build images\n"
printf " [-V|--version] print version number and exit\n"
printf " [-h|--help] print this help and exit\n"
printf " [-x|--xml] write xml log file \n"
printf " (defaults to $XMLFILE)\n"
printf " [-T|--test] submit image(s) to automated test system\n"
printf " [-c|--cpus <numcpus>] build on <numcpus> at the same time\n"
printf " [-s|--silent] omit compiler calls in logs\n"
printf " [-ns|--nostackprotect] use gcc -fno-stack-protector option\n"
printf " [-sb|--scan-build] use clang's static analyzer\n"
printf " [-C|--config] configure-only mode\n"
printf " [-l|--loglevel <num>] set loglevel\n"
printf " [lbroot] absolute path to coreboot sources\n"
printf " (defaults to $LBROOT)\n\n"
}
function myversion
{
cat << EOF
coreboot autobuild v$ABUILD_VERSION ($ABUILD_DATE)
Copyright (C) 2004 by Stefan Reinauer <stepan@openbios.org>
Copyright (C) 2006-2008 by coresystems GmbH <info@coresystems.de>
This program is free software; you may redistribute it under the terms
of the GNU General Public License. This program has absolutely no
warranty.
EOF
}
# default options
target=""
buildall=false
LBROOT=$( cd ../..; pwd )
verbose=false
# parse parameters.. try to find out whether we're running GNU getopt
getoptbrand="`getopt -V`"
if [ "${getoptbrand:0:6}" == "getopt" ]; then
# Detected GNU getopt that supports long options.
args=`getopt -l version,verbose,help,all,target:,broken,payloads:,test,cpus:,silent,xml,config,loglevel Vvhat:bp:Tc:sxCl: -- "$@"`
eval set "$args"
else
# Detected non-GNU getopt
args=`getopt Vvhat:bp:Tc:sxCl: $*`
set -- $args
fi
if [ $? != 0 ]; then
myhelp
exit 1
fi
while true ; do
case "$1" in
-x|--xml) shift; mode=xml; rm -f $XMLFILE ;;
-t|--target) shift; target="$1"; shift;;
-a|--all) shift; buildall=true;;
-b|--broken) shift; buildbroken=true;;
-r|--remove) shift; remove=true; shift;;
-v|--verbose) shift; verbose=true;;
-V|--version) shift; myversion; exit 0;;
-h|--help) shift; myversion; myhelp; exit 0;;
-p|--payloads) shift; payloads="$1"; shift;;
-T|--test) shift; hwtest=true;;
-c|--cpus) shift; cpus="$1"; test "$cpus" == "max" && cpus=""; shift;;
-s|--silent) shift; silent="-s";;
-ns|--nostackprotect) shift; stackprotect=true;;
-sb|--scan-build) shift; scanbuild=true;;
-C|--config) shift; configureonly=1;;
-l|--loglevel) shift; loglevel="$1"; shift;;
--) shift; break;;
-*) printf "Invalid option\n\n"; myhelp; exit 1;;
*) break;;
esac
done
# /path/to/freebios2/
test -z "$1" || LBROOT=$1
debug "LBROOT=$LBROOT"
xml '<?xml version="1.0" encoding="utf-8"?>'
xml '<abuild>'
if [ "$target" != "" ]; then
# build a single board
VENDOR=`printf $target|cut -f1 -d/`
MAINBOARD=`printf $target|cut -f2 -d/`
CONFIG=`printf $target|cut -f3 -d/`
build_target $VENDOR $MAINBOARD $CONFIG
test_target $VENDOR $MAINBOARD
else
# build all boards per default
for VENDOR in $( vendors ); do
for MAINBOARD in $( mainboards $VENDOR ); do
build_target $VENDOR $MAINBOARD
test_target $VENDOR $MAINBOARD
remove_target $VENDOR $MAINBOARD
done
done
fi
xml '</abuild>'