build: support disjoint build directory

Support building in any directory, not just in-tree build.

Use VPATH for non-Forth files.

Forth compiler does not support explicit paths, so drop source path
prefixes added by XML and rely on directories passed with -I flag.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>

git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@1099 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Blue Swirl 2013-02-16 12:08:33 +00:00
parent 1aab7fa45b
commit 743d40da30
6 changed files with 35 additions and 25 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
obj-* obj-*
.stgit-* .stgit-*
config-host.mak

View File

@ -1,5 +1,4 @@
ODIRS=$(wildcard obj-*) include config-host.mak
TARGETS=$(subst obj-,,$(ODIRS))
all: requirements info build all: requirements info build

View File

@ -6,7 +6,6 @@
include config.mak include config.mak
ODIR := . ODIR := .
SRCDIR := ..
HOSTCC := gcc HOSTCC := gcc
HOSTCFLAGS+= -O2 -g -DFCOMPILER -DBOOTSTRAP $(CROSSCFLAGS) HOSTCFLAGS+= -O2 -g -DFCOMPILER -DBOOTSTRAP $(CROSSCFLAGS)
@ -38,6 +37,10 @@ AS_FLAGS+= -g
quiet-command = $(if $(V),$1,$(if $(2),@echo $2 && $1, @$1)) quiet-command = $(if $(V),$1,$(if $(2),@echo $2 && $1, @$1))
VPATH_SUFFIXES = %.c %.h %.S %.fs
set-vpath = $(if $1,$(foreach PATTERN,$(VPATH_SUFFIXES),$(eval vpath $(PATTERN) $1)))
$(call set-vpath, $(SRCDIR))
# #
# pre rules # pre rules
# #

View File

@ -117,21 +117,18 @@ config_set_boolean()
echo "<option name=\"$option\" type=\"boolean\" value=\"true\" />" echo "<option name=\"$option\" type=\"boolean\" value=\"true\" />"
} }
if ! test -f utils/dist/debian/rules; then
echo "switch-arch must be run from the top-level source directory" >&2
exit 1
fi
# This is needed because viewvc messes with the permissions of executables: SRCDIR=`dirname "$0"`/../..
chmod 755 utils/dist/debian/rules BUILDDIR=`pwd`
chmod 755 config/scripts/switch-arch
chmod 755 config/scripts/reldir # make source path absolute
SRCDIR=`cd "$SRCDIR"; pwd`
if test "x$HOSTARCH" = "x"; then if test "x$HOSTARCH" = "x"; then
archname archname
fi fi
VERSION=`head VERSION` VERSION=`head $SRCDIR/VERSION`
echo "Configuring OpenBIOS on $HOSTARCH for $*" echo "Configuring OpenBIOS on $HOSTARCH for $*"
@ -156,8 +153,8 @@ done
arch_list="" arch_list=""
for target in $target_list; do for target in $target_list; do
arch=`echo $target | sed s/.*-//g` arch=`echo $target | sed s/.*-//g`
if ! test -f config/examples/${arch}_config.xml; then if ! test -f $SRCDIR/config/examples/${arch}_config.xml; then
echo "Cannot find config/examples/${arch}_config.xml" >&2 echo "Cannot find $SRCDIR/config/examples/${arch}_config.xml" >&2
exit 1 exit 1
fi fi
if ! echo $arch_list | grep -q "$arch"; then if ! echo $arch_list | grep -q "$arch"; then
@ -269,7 +266,8 @@ for ARCH in $arch_list; do
cross="yes" cross="yes"
fi fi
crosscflags $HOSTARCH $ARCH crosscflags $HOSTARCH $ARCH
OBJDIR=obj-$ARCH OBJDIR=$BUILDDIR/obj-$ARCH
ODIRS="$ODIRS $OBJDIR"
printf "Initializing build tree $OBJDIR..." printf "Initializing build tree $OBJDIR..."
rm -rf "$OBJDIR" rm -rf "$OBJDIR"
@ -294,9 +292,9 @@ for ARCH in $arch_list; do
mkdir -p $OBJDIR/host/include mkdir -p $OBJDIR/host/include
mkdir -p $OBJDIR/host/kernel mkdir -p $OBJDIR/host/kernel
mkdir -p $OBJDIR/forth mkdir -p $OBJDIR/forth
ln -s ../../../include/arch/$BASEARCH $OBJDIR/target/include/asm ln -s $SRCDIR/include/arch/$BASEARCH $OBJDIR/target/include/asm
#compile the host binary with target settings instead #compile the host binary with target settings instead
#ln -s ../../../include/arch/$HOSTARCH $OBJDIR/host/include/asm #ln -s $SRCDIR/include/arch/$HOSTARCH $OBJDIR/host/include/asm
if [ "$mol" = "yes" ]; then if [ "$mol" = "yes" ]; then
printf "\nUsing MOL path $MOLPATH...\n" printf "\nUsing MOL path $MOLPATH...\n"
mkdir -p $OBJDIR/target/arch/ppc/mol mkdir -p $OBJDIR/target/arch/ppc/mol
@ -324,11 +322,9 @@ for ARCH in $arch_list; do
fi fi
echo "ok." echo "ok."
cd $OBJDIR ODIR=$OBJDIR
SRCDIR=..
ODIR=.
printf "Creating target Makefile..." printf "Creating target config.mak..."
echo "ARCH=$ARCH" > $ODIR/config.mak echo "ARCH=$ARCH" > $ODIR/config.mak
if [ "$cross" = "yes" ]; then if [ "$cross" = "yes" ]; then
echo "TARGET=$TARGET" >> $ODIR/config.mak echo "TARGET=$TARGET" >> $ODIR/config.mak
@ -338,7 +334,10 @@ for ARCH in $arch_list; do
echo "HOSTARCH?=$HOSTARCH" >> $ODIR/config.mak echo "HOSTARCH?=$HOSTARCH" >> $ODIR/config.mak
echo "CROSSCFLAGS=$CROSSCFLAGS" >> $ODIR/config.mak echo "CROSSCFLAGS=$CROSSCFLAGS" >> $ODIR/config.mak
echo "VERSION=\"$VERSION\"" >> $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 ln -s $SRCDIR/config/xml/rules.xml $ODIR/rules.xml
echo "<?xml version=\"1.0\"?><config>" > $ODIR/config.xml echo "<?xml version=\"1.0\"?><config>" > $ODIR/config.xml
# Generic # Generic
@ -381,8 +380,9 @@ for ARCH in $arch_list; do
fi fi
cat $SRCDIR/config/examples/${ARCH}_config.xml >> $ODIR/config.xml cat $SRCDIR/config/examples/${ARCH}_config.xml >> $ODIR/config.xml
cd $ODIR
echo "</config>" >> $ODIR/config.xml echo "</config>" >> $ODIR/config.xml
ln -s ../Makefile.target $ODIR/Makefile ln -s $SRCDIR/Makefile.target $ODIR/Makefile
xsltproc $SRCDIR/config/xml/xinclude.xsl $SRCDIR/build.xml > $ODIR/build-full.xml 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 xsltproc $SRCDIR/config/xml/makefile.xsl $ODIR/build-full.xml > $ODIR/rules.mak
echo "ok." echo "ok."
@ -392,5 +392,12 @@ for ARCH in $arch_list; do
xsltproc $SRCDIR/config/xml/config-forth.xsl $ODIR/config.xml > $ODIR/forth/config.fs xsltproc $SRCDIR/config/xml/config-forth.xsl $ODIR/config.xml > $ODIR/forth/config.fs
echo "ok." echo "ok."
cd $SRCDIR cd $BUILDDIR
done 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

View File

@ -56,7 +56,6 @@
<xsl:value-of select="$dictname"/><xsl:text>-DICTIONARY:=$(</xsl:text> <xsl:value-of select="$dictname"/><xsl:text>-DICTIONARY:=$(</xsl:text>
<xsl:value-of select="$dictname"/><xsl:text>-DICTIONARY) </xsl:text> <xsl:value-of select="$dictname"/><xsl:text>-DICTIONARY) </xsl:text>
<xsl:text>$(SRCDIR)/</xsl:text>
<xsl:value-of select="$path"/> <xsl:value-of select="$path"/>
<xsl:value-of select="@source"/> <xsl:value-of select="@source"/>
<xsl:text>&#10;</xsl:text> <xsl:text>&#10;</xsl:text>
@ -122,6 +121,8 @@
</xsl:if> </xsl:if>
</xsl:for-each> </xsl:for-each>
<!-- needed to locate files with full path -->
<xsl:text> -I$(SRCDIR)</xsl:text>
<!-- needed to include config and build date --> <!-- needed to include config and build date -->
<xsl:text> -I$(ODIR)/forth</xsl:text> <xsl:text> -I$(ODIR)/forth</xsl:text>

View File

@ -52,7 +52,6 @@
<xsl:text>.o: </xsl:text> <xsl:text>.o: </xsl:text>
<!-- path of source file --> <!-- path of source file -->
<xsl:text>$(SRCDIR)/</xsl:text>
<xsl:value-of select="$path"/> <xsl:value-of select="$path"/>
<xsl:value-of select="@source"/> <xsl:value-of select="@source"/>