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 --- .gitignore | 1 + Makefile | 3 +- Makefile.target | 5 +++- config/scripts/switch-arch | 47 +++++++++++++++++++++++++------------------ config/xml/dictionary.xsl | 3 +- config/xml/object.xsl | 1 - 6 files changed, 35 insertions(+), 25 deletions(-)
diff --git a/.gitignore b/.gitignore index e6b5c59..38e6dd8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ obj-* .stgit-* +config-host.mak diff --git a/Makefile b/Makefile index 74e462c..3526b75 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ -ODIRS=$(wildcard obj-*) -TARGETS=$(subst obj-,,$(ODIRS)) +include config-host.mak
all: requirements info build
diff --git a/Makefile.target b/Makefile.target index 934b95a..913fb13 100644 --- a/Makefile.target +++ b/Makefile.target @@ -6,7 +6,6 @@ include config.mak
ODIR := . -SRCDIR := .. HOSTCC := gcc
HOSTCFLAGS+= -O2 -g -DFCOMPILER -DBOOTSTRAP $(CROSSCFLAGS) @@ -38,6 +37,10 @@ AS_FLAGS+= -g
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 # diff --git a/config/scripts/switch-arch b/config/scripts/switch-arch index a9c911b..b91af7c 100755 --- a/config/scripts/switch-arch +++ b/config/scripts/switch-arch @@ -117,21 +117,18 @@ config_set_boolean() 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: -chmod 755 utils/dist/debian/rules -chmod 755 config/scripts/switch-arch -chmod 755 config/scripts/reldir +SRCDIR=`dirname "$0"`/../.. +BUILDDIR=`pwd` + +# make source path absolute +SRCDIR=`cd "$SRCDIR"; pwd`
if test "x$HOSTARCH" = "x"; then archname fi
-VERSION=`head VERSION` +VERSION=`head $SRCDIR/VERSION`
echo "Configuring OpenBIOS on $HOSTARCH for $*"
@@ -156,8 +153,8 @@ done arch_list="" for target in $target_list; do arch=`echo $target | sed s/.*-//g` - if ! test -f config/examples/${arch}_config.xml; then - echo "Cannot find config/examples/${arch}_config.xml" >&2 + 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 @@ -269,7 +266,8 @@ for ARCH in $arch_list; do cross="yes" fi crosscflags $HOSTARCH $ARCH - OBJDIR=obj-$ARCH + OBJDIR=$BUILDDIR/obj-$ARCH + ODIRS="$ODIRS $OBJDIR"
printf "Initializing build tree $OBJDIR..." rm -rf "$OBJDIR" @@ -294,9 +292,9 @@ for ARCH in $arch_list; do mkdir -p $OBJDIR/host/include mkdir -p $OBJDIR/host/kernel 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 - #ln -s ../../../include/arch/$HOSTARCH $OBJDIR/host/include/asm + #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 @@ -324,11 +322,9 @@ for ARCH in $arch_list; do fi echo "ok."
- cd $OBJDIR - SRCDIR=.. - ODIR=. + ODIR=$OBJDIR
- printf "Creating target Makefile..." + printf "Creating target config.mak..." echo "ARCH=$ARCH" > $ODIR/config.mak if [ "$cross" = "yes" ]; then echo "TARGET=$TARGET" >> $ODIR/config.mak @@ -338,7 +334,10 @@ for ARCH in $arch_list; do 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 @@ -381,8 +380,9 @@ for ARCH in $arch_list; do fi cat $SRCDIR/config/examples/${ARCH}_config.xml >> $ODIR/config.xml
+ cd $ODIR 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/makefile.xsl $ODIR/build-full.xml > $ODIR/rules.mak 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 echo "ok."
- cd $SRCDIR + 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 diff --git a/config/xml/dictionary.xsl b/config/xml/dictionary.xsl index 52d836a..664df0f 100644 --- a/config/xml/dictionary.xsl +++ b/config/xml/dictionary.xsl @@ -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:text$(SRCDIR)/</xsl:text> <xsl:value-of select="$path"/> <xsl:value-of select="@source"/> xsl:text </xsl:text> @@ -122,6 +121,8 @@ </xsl:if> </xsl:for-each>
+ <!-- needed to locate files with full path --> + xsl:text -I$(SRCDIR)</xsl:text> <!-- needed to include config and build date --> xsl:text -I$(ODIR)/forth</xsl:text>
diff --git a/config/xml/object.xsl b/config/xml/object.xsl index 7af54ab..cf521f5 100644 --- a/config/xml/object.xsl +++ b/config/xml/object.xsl @@ -52,7 +52,6 @@ xsl:text.o: </xsl:text>
<!-- path of source file --> - xsl:text$(SRCDIR)/</xsl:text> <xsl:value-of select="$path"/> <xsl:value-of select="@source"/>