#!/bin/sh # # MOLPATH is needed if you want to build openbios-mol.elf # MOLPATH=$HOME/mol-0.9.71 if [ x"$1" = x -o "$1" = "-help" ]; then printf "Usage:\n $0 [arch-config]...\n" printf "arch-config values supported for native or cross compiled builds:\n" printf " amd64, ppc, sparc32, sparc64, x86\n\n" printf "Add \"unix-\" prefix to compile openbios-unix executable (native only)\n" printf "Add \"builtin-\" prefix to compile openbios-builtin executables\n\n" printf "Without prefixes, builtin and unix targets are selected\n\n" printf "Special targets: mol-ppc briq-ppc pearpc-ppc qemu-ppc qemu-ppc64 xbox-x86\n\n" printf "Example: $0 builtin-sparc32 unix-amd64 builtin-amd64\n" exit 0 fi is_bigendian() { cpu=$1 if test "$cpu" = "powerpc" -o "$cpu" = "ppc" \ -o "$cpu" = "powerpc64" -o "$cpu" = "ppc64" \ -o "$cpu" = "mips" -o "$cpu" = "s390" \ -o "$cpu" = "sparc32" -o "$cpu" = "sparc64" \ -o "$cpu" = "m68k" -o "$cpu" = "armv4b"; then echo yes else echo no fi } longbits() { cpu=$1 if test "$cpu" = "sparc64" -o "$cpu" = "ia64" \ -o "$cpu" = "amd64" -o "$cpu" = "x86_64" \ -o "$cpu" = "powerpc64" -o "$cpu" = "ppc64" \ -o "$cpu" = "alpha"; then echo 64 else echo 32 fi } basearch() { arch=$1 case $arch in powerpc|ppc64|powerpc64) echo ppc ;; *) echo $arch ;; esac } crosscflags() { host=$1 target=$2 hostbigendian=$(is_bigendian $host) hostlongbits=$(longbits $host) targetbigendian=$(is_bigendian $target) targetlongbits=$(longbits $target) if test "$targetbigendian" = "$hostbigendian"; then cflags="-USWAP_ENDIANNESS" else cflags="-DSWAP_ENDIANNESS" fi if test "$targetlongbits" = "$hostlongbits"; then cflags="$cflags -DNATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH" elif test "$targetlongbits" -lt "$hostlongbits"; then cflags="$cflags -DNATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH" else cflags="$cflags -DNATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH" fi if test "$target" = "sparc64" -o "$target" = "ia64" \ -o "$target" = "amd64" -o "$target" = "x86_64" \ -o "$target" = "alpha"; then if test "$host" = "x86"; then cflags="$cflags -DNEED_FAKE_INT128_T" elif test "$host" = "arm"; then cflags="$cflags -DNEED_FAKE_INT128_T" elif test "$host" = "ppc" -a `uname -s` = "Darwin"; then cflags="$cflags -DNEED_FAKE_INT128_T" fi fi CROSSCFLAGS=$cflags } archname() { HOSTARCH=`uname -m | sed -e s/i.86/x86/ -e s/i86pc/x86/ \ -e s/sun4u/sparc64/ -e s/sparc$/sparc32/ \ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/x86_64/amd64/ \ -e "s/Power Macintosh/ppc/"` } select_prefix() { BASEARCH=$(basearch $ARCH) for target_arch ; do TARGETS="${target_arch}-unknown-linux-gnu- ${target_arch}-linux-gnu- ${target_arch}-linux- ${target_arch}-elf- ${target_arch}-eabi-" if [ x"$CROSS_COMPILE" != "x" ]; then TARGETS=$CROSS_COMPILE fi for TARGET in $TARGETS do if type ${TARGET}gcc > /dev/null 2>&1 then return fi done if [ "$BASEARCH" = "$(basearch $HOSTARCH)" ]; then TARGET="" return fi done echo "ERROR: no $* cross-compiler found !" 1>&2 exit 1 } config_set_boolean() { option=`echo $1 | tr a-z A-Z` echo "<option name=\"$option\" type=\"boolean\" value=\"true\" />" } exists() { type "$1" >/dev/null 2>&1 } SRCDIR=`dirname "$0"`/../.. BUILDDIR=`pwd` # make source path absolute SRCDIR=`cd "$SRCDIR"; pwd` if test "x$HOSTARCH" = "x"; then archname fi VERSION=`head $SRCDIR/VERSION` echo "Configuring OpenBIOS on $HOSTARCH for $*" if exists toke; then : else echo "Unable to locate toke executable from the fcode-utils package - aborting" exit 1 fi target_list="" for target in $*; do case $target in unix-*|builtin-*|plain-*|mol-ppc|briq-ppc|pearpc-ppc|qemu-ppc|qemu-ppc64|xbox-x86) target_list="$target_list $target" ;; cross-*) echo "\"cross-\" prefix is no longer needed" target=`echo $target | sed s/cross-//g` target_list="$target_list builtin-$target" ;; *) #default: build builtin and if possible, unix target target_list="$target_list builtin-$target unix-$target" ;; esac done arch_list="" for target in $target_list; do arch=`echo $target | sed s/.*-//g` if ! test -f $SRCDIR/config/examples/${arch}_config.xml; then echo "Cannot find $SRCDIR/config/examples/${arch}_config.xml" >&2 exit 1 fi if ! echo $arch_list | grep -q "$arch"; then arch_list="$arch_list $arch" fi done for ARCH in $arch_list; do unix="no" builtin="no" plain="no" mol="no" briq="no" pearpc="no" qemu="no" xbox="no" cross="no" for target in $target_list; do case $target in *-$ARCH) : ;; *) continue ;; esac case $target in mol-ppc) mol="yes" ;; briq-ppc) briq="yes" ;; pearpc-ppc) pearpc="yes" ;; builtin-ppc|qemu-ppc|builtin-ppc64|qemu-ppc64) qemu="yes" ;; xbox-x86) xbox="yes" ;; builtin-sparc32) builtin="yes" qemu="yes" ;; builtin-sparc64) builtin="yes" qemu="yes" ;; unix-*) if [ "$ARCH" != "$HOSTARCH" ]; then # Can't cross compile Unix target continue fi unix="yes" ;; builtin-*) builtin="yes" ;; plain-*) plain="yes" ;; esac done case $ARCH in amd64) select_prefix x86_64 CFLAGS="-fno-builtin" AS_FLAGS= ;; ppc) select_prefix powerpc powerpc64 if [ "$unix" = "no" ]; then # 604 cpu includes support for PReP as well as Mac CFLAGS="-m32 -mcpu=604 -msoft-float -fno-builtin-bcopy -fno-builtin-log2" AS_FLAGS="-m32" else CFLAGS="-fno-builtin" AS_FLAGS= fi ;; ppc64) select_prefix powerpc64 # 970 cpu is used in all 64-bit Macs but disable altivec CFLAGS="-mcpu=970 -mno-altivec -Wa,-a64 -m64 -msoft-float -fno-builtin" AS_FLAGS="-Wa,-a64" ;; sparc32) select_prefix sparc sparc64 CFLAGS="-Wa,-xarch=v8 -Wa,-32 -m32 -mcpu=supersparc -fno-builtin" AS_FLAGS="-Wa,-xarch=v8 -Wa,-32" ;; sparc64) select_prefix sparc64 CFLAGS="-Wa,-xarch=v9b -Wa,-64 -m64 -mcpu=ultrasparc -mcmodel=medany -fno-builtin" AS_FLAGS="-Wa,-xarch=v9b -Wa,-64" ;; x86) select_prefix i486 CFLAGS="-fno-builtin -m32" AS_FLAGS="-Wa,-32" ;; esac if [ "$ARCH" != "$HOSTARCH" -o `uname -s` = "Darwin" ]; then cross="yes" fi crosscflags $HOSTARCH $ARCH OBJDIR=$BUILDDIR/obj-$ARCH ODIRS="$ODIRS $OBJDIR" printf "Initializing build tree $OBJDIR..." rm -rf "$OBJDIR" mkdir "$OBJDIR" mkdir -p $OBJDIR/target mkdir -p $OBJDIR/target/include mkdir -p $OBJDIR/target/arch mkdir -p $OBJDIR/target/arch/unix mkdir -p $OBJDIR/target/arch/$ARCH mkdir -p $OBJDIR/target/libgcc mkdir -p $OBJDIR/target/kernel mkdir -p $OBJDIR/target/libopenbios mkdir -p $OBJDIR/target/packages mkdir -p $OBJDIR/target/fs mkdir -p $OBJDIR/target/fs/grubfs mkdir -p $OBJDIR/target/fs/hfs mkdir -p $OBJDIR/target/fs/hfsplus mkdir -p $OBJDIR/target/fs/iso9660 mkdir -p $OBJDIR/target/fs/ext2 mkdir -p $OBJDIR/target/drivers mkdir -p $OBJDIR/target/libc mkdir -p $OBJDIR/host/include mkdir -p $OBJDIR/host/kernel mkdir -p $OBJDIR/forth ln -s $SRCDIR/include/arch/$BASEARCH $OBJDIR/target/include/asm #compile the host binary with target settings instead #ln -s $SRCDIR/include/arch/$HOSTARCH $OBJDIR/host/include/asm if [ "$mol" = "yes" ]; then printf "\nUsing MOL path $MOLPATH...\n" mkdir -p $OBJDIR/target/arch/ppc/mol ln -s $MOLPATH/src/shared/osi_calls.h $OBJDIR/target/include/ ln -s $MOLPATH/src/shared/osi.h $OBJDIR/target/include/ ln -s $MOLPATH/src/shared/prom.h $OBJDIR/target/include/ ln -s $MOLPATH/src/include/boothelper_sh.h $OBJDIR/target/include/ ln -s $MOLPATH/src/include/video_sh.h $OBJDIR/target/include/ ln -s $MOLPATH/src/include/pseudofs_sh.h $OBJDIR/target/include/ ln -s $MOLPATH/src/include/kbd_sh.h $OBJDIR/target/include/ ln -s $MOLPATH/src/drivers/disk/include/scsi_sh.h $OBJDIR/target/include/ ln -s $MOLPATH/src/drivers/disk/include/ablk_sh.h $OBJDIR/target/include/ fi if [ "$briq" = "yes" ]; then mkdir -p $OBJDIR/target/arch/ppc/briq fi if [ "$pearpc" = "yes" ]; then mkdir -p $OBJDIR/target/arch/ppc/pearpc fi if [ "$qemu" = "yes" ]; then mkdir -p $OBJDIR/target/arch/ppc/qemu fi if [ "$xbox" = "yes" ]; then mkdir -p $OBJDIR/target/arch/x86/xbox fi echo "ok." ODIR=$OBJDIR printf "Creating target config.mak..." echo "ARCH=$ARCH" > $ODIR/config.mak if [ "$cross" = "yes" ]; then echo "TARGET=$TARGET" >> $ODIR/config.mak fi echo "CFLAGS=$CFLAGS" >> $ODIR/config.mak echo "AS_FLAGS=$AS_FLAGS" >> $ODIR/config.mak echo "HOSTARCH?=$HOSTARCH" >> $ODIR/config.mak echo "CROSSCFLAGS=$CROSSCFLAGS" >> $ODIR/config.mak echo "VERSION=\"$VERSION\"" >> $ODIR/config.mak echo "SRCDIR=$SRCDIR" >> $ODIR/config.mak echo "ok." printf "Creating target rules.mak..." ln -s $SRCDIR/config/xml/rules.xml $ODIR/rules.xml echo "<?xml version=\"1.0\"?><config>" > $ODIR/config.xml # Generic config_set_boolean CONFIG_$ARCH >> $ODIR/config.xml if [ "$BASEARCH" != "$ARCH" ]; then config_set_boolean CONFIG_$BASEARCH >> $ODIR/config.xml fi if [ "$mol" = "yes" ]; then config_set_boolean CONFIG_MOL >> $ODIR/config.xml fi if [ "$briq" = "yes" ]; then config_set_boolean CONFIG_BRIQ >> $ODIR/config.xml fi if [ "$pearpc" = "yes" ]; then config_set_boolean CONFIG_PEARPC >> $ODIR/config.xml fi if [ "$qemu" = "yes" ]; then config_set_boolean CONFIG_QEMU >> $ODIR/config.xml fi if [ "$xbox" = "yes" ]; then config_set_boolean CONFIG_XBOX >> $ODIR/config.xml fi if [ "$targetbigendian" = "yes" ]; then config_set_boolean CONFIG_BIG_ENDIAN >> $ODIR/config.xml else config_set_boolean CONFIG_LITTLE_ENDIAN >> $ODIR/config.xml fi # Kernel binaries if [ "$plain" = "yes" ]; then config_set_boolean CONFIG_IMAGE_ELF >> $ODIR/config.xml fi if [ "$builtin" = "yes" ]; then config_set_boolean CONFIG_IMAGE_ELF_EMBEDDED >> $ODIR/config.xml fi # Build hosted Unix binary? if [ "$unix" = "yes" ]; then config_set_boolean CONFIG_HOST_UNIX >> $ODIR/config.xml #config_set_boolean CONFIG_UNIX_QT >> $ODIR/config.xml #config_set_boolean CONFIG_PLUGINS >> $ODIR/config.xml fi cat $SRCDIR/config/examples/${ARCH}_config.xml >> $ODIR/config.xml cd $ODIR echo "</config>" >> $ODIR/config.xml ln -s $SRCDIR/Makefile.target $ODIR/Makefile xsltproc $SRCDIR/config/xml/xinclude.xsl $SRCDIR/build.xml > $ODIR/build-full.xml xsltproc $SRCDIR/config/xml/makefile.xsl $ODIR/build-full.xml > $ODIR/rules.mak echo "ok." printf "Creating config files..." xsltproc $SRCDIR/config/xml/config-c.xsl $ODIR/config.xml > $ODIR/host/include/autoconf.h xsltproc $SRCDIR/config/xml/config-c.xsl $ODIR/config.xml > $ODIR/target/include/autoconf.h xsltproc $SRCDIR/config/xml/config-forth.xsl $ODIR/config.xml > $ODIR/forth/config.fs echo "ok." cd $BUILDDIR done if [ "$SRCDIR" != "$BUILDDIR" ]; then ln -s $SRCDIR/Makefile $BUILDDIR fi echo "ODIRS=$ODIRS" >> $BUILDDIR/config-host.mak echo "TARGETS=$arch_list" >> $BUILDDIR/config-host.mak