Out of tree builds now work out_of_tree_builds
authorMartin Read <martin@blackswordsonics.com>
Fri, 14 Feb 2014 19:37:33 +0000 (19:37 +0000)
committerMartin Read <martin@blackswordsonics.com>
Fri, 14 Feb 2014 19:37:33 +0000 (19:37 +0000)
Out of tree builds now work. Anyone who feels like stress-testing them to
look for bizarre edge cases is strongly encouraged to file a bug report.

Makefile
configure

index 1f4dda1..151f64b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,7 @@
 include dirs.mk
 include features.mk
 
+vpath %.o .
 GENERATED_OBJS:=permobj.o permons.o 
 GENERATED_SOURCE:=permobj.cc pobj_id.hh permons.cc pmon_id.hh
 GENERATED_MAKES:=dirs.mk features.mk
@@ -14,8 +15,8 @@ GAME:=victrix-abyssi
 MAJVERS:=0
 MINVERS:=9
 PATCHVERS:=1
-COMMON_CFLAGS:=-Wall -Wwrite-strings -Wunreachable-code -Wformat -Werror=format-security -fstack-protector --param=ssp-buffer-size=4 -DMAJVERS=$(MAJVERS) -DMINVERS=$(MINVERS) -DPATCHVERS=$(PATCHVERS)-std=gnu11 -D_FORTIFY_SOURCE=2
-COMMON_CXXFLAGS:=-Wall -Wwrite-strings -Wno-unused-but-set-variable -Wredundant-decls -Wunreachable-code -Wformat -Werror=format-security -fstack-protector --param=ssp-buffer-size=4 -DMAJVERS=$(MAJVERS) -DMINVERS=$(MINVERS) -DPATCHVERS=$(PATCHVERS) -std=gnu++11 -D_FORTIFY_SOURCE=2
+COMMON_CFLAGS:=-Wall -Wwrite-strings -Wunreachable-code -Wformat -Werror=format-security -fstack-protector --param=ssp-buffer-size=4 -DMAJVERS=$(MAJVERS) -DMINVERS=$(MINVERS) -DPATCHVERS=$(PATCHVERS)-std=gnu11 -D_FORTIFY_SOURCE=2 -I$(srcdir)
+COMMON_CXXFLAGS:=-Wall -Wwrite-strings -Wno-unused-but-set-variable -Wredundant-decls -Wunreachable-code -Wformat -Werror=format-security -fstack-protector --param=ssp-buffer-size=4 -DMAJVERS=$(MAJVERS) -DMINVERS=$(MINVERS) -DPATCHVERS=$(PATCHVERS) -std=gnu++11 -D_FORTIFY_SOURCE=2 -I$(srcdir)
 PRODUCTION_CFLAGS:=$(COMMON_CFLAGS)
 DEVELOPMENT_CFLAGS:=$(COMMON_CFLAGS) -g -Werror
 PRODUCTION_CXXFLAGS:=$(COMMON_CXXFLAGS)
@@ -32,7 +33,7 @@ DEVELOPMENT_LDFLAGS:=$(COMMON_LDFLAGS) -g
 
 all: $(GAME)
 
-archive: clean permobj.cc pobj_id.hh
+archive: clean ./permobj.cc ./pobj_id.hh
        mkdir $(ARCHIVEDIR)
        cp `cat MANIFEST` $(ARCHIVEDIR)
        tar czf $(ARCHIVENAME).tar.gz $(ARCHIVEDIR)
@@ -79,50 +80,52 @@ spotless: clean code-docs-clean my-debclean generated-clean
 $(GAME): $(OBJS)
        $(CXX) $(DEVELOPMENT_LDFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $(GAME)
 
-.cc.o:
+%.o: $(srcdir)/%.cc
        $(CXX) -c $(DEVELOPMENT_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) $< -o $@
 
-.c.o:
+%.o: $(srcdir)/%.c
        $(CC) -c $(DEVELOPMENT_CFLAGS) $(CPPFLAGS) $(CFLAGS) $< -o $@
 
 ## Dependencies for autogeneration
-permobj.cc pobj_id.hh: default.permobjs $(srcdir)/pobj_comp
+permobj.cc pobj_id.hh: $(srcdir)/default.permobjs $(srcdir)/pobj_comp
        $(srcdir)/pobj_comp $<
 
-permons.cc pmon_id.hh: default.permons $(srcdir)/pmon_comp
+permons.cc pmon_id.hh: $(srcdir)/default.permons $(srcdir)/pmon_comp
        $(srcdir)/pmon_comp $<
 ## Dependencies for the build
-combat.o: combat.cc combat.hh victrix-abyssi.hh monsters.hh objects.hh notify.hh pobj_id.hh pmon_id.hh player.hh
+combat.o: $(srcdir)/combat.cc $(srcdir)/combat.hh $(srcdir)/victrix-abyssi.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh $(srcdir)/notify.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-display-nc.o: display-nc.cc victrix-abyssi.hh display.hh pobj_id.hh pmon_id.hh player.hh
+display-nc.o: $(srcdir)/display-nc.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/display.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-main.o: main.cc combat.hh victrix-abyssi.hh monsters.hh notify.hh pobj_id.hh pmon_id.hh player.hh
+log.o: $(srcdir)/log.cc $(srcdir)/objects.hh $(srcdir)/monsters.hh $(srcdir)/player.hh $(srcdir)/map.hh $(srcdir)/util.h
 
-map.o: map.cc victrix-abyssi.hh notify.hh objects.hh pobj_id.hh pmon_id.hh player.hh
+main.o: $(srcdir)/main.cc $(srcdir)/combat.hh $(srcdir)/victrix-abyssi.hh $(srcdir)/monsters.hh $(srcdir)/notify.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-monsters.o: monsters.cc victrix-abyssi.hh monsters.hh notify.hh objects.hh pobj_id.hh pmon_id.hh player.hh
+map.o: $(srcdir)/map.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/notify.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-mon2.o: mon2.cc victrix-abyssi.hh sorcery.hh monsters.hh notify.hh objects.hh pobj_id.hh pmon_id.hh player.hh
+monsters.o: $(srcdir)/monsters.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/monsters.hh $(srcdir)/notify.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-notify-local-tty.o: notify-local-tty.cc victrix-abyssi.hh combat.hh monsters.hh notify.hh objects.hh sorcery.hh pobj_id.hh pmon_id.hh player.hh
+mon2.o: $(srcdir)/mon2.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/sorcery.hh $(srcdir)/monsters.hh $(srcdir)/notify.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-# NOTICE: permobj.cc does not depend on pobj_id.hh because they are both
+notify-local-tty.o: $(srcdir)/notify-local-tty.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/combat.hh $(srcdir)/monsters.hh $(srcdir)/notify.hh $(srcdir)/objects.hh $(srcdir)/sorcery.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
+
+# NOTICE: $(srcdir)/permobj.cc does not depend on ./pobj_id.hh because they are both
 # generated from the same input file and should not be hand-edited. If you
 # file a bug report over this, I will close it NOTABUG; if you submit a
 # patch to add such a dependency, I will reject it out of hand.
 
-permobj.o: permobj.cc core.hh permobj.hh pobj_id.hh
+permobj.o: $(srcdir)/permobj.cc $(srcdir)/core.hh $(srcdir)/permobj.hh ./pobj_id.hh
 
-permons.o: permons.cc core.hh permon.hh pmon_id.hh
+permons.o: $(srcdir)/permons.cc $(srcdir)/core.hh $(srcdir)/permon.hh ./pmon_id.hh
 
-pmon2.o: pmon2.cc victrix-abyssi.hh notify.hh monsters.hh pobj_id.hh pmon_id.hh player.hh
+pmon2.o: $(srcdir)/pmon2.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/notify.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-objects.o: objects.cc victrix-abyssi.hh notify.hh objects.hh monsters.hh pobj_id.hh pmon_id.hh player.hh
+objects.o: $(srcdir)/objects.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/notify.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-sorcery.o: sorcery.cc victrix-abyssi.hh notify.hh sorcery.hh objects.hh monsters.hh pobj_id.hh pmon_id.hh player.hh
+sorcery.o: $(srcdir)/sorcery.cc $(srcdir)/victrix-abyssi.hh $(srcdir)/notify.hh $(srcdir)/sorcery.hh $(srcdir)/objects.hh $(srcdir)/monsters.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-u.o: u.cc combat.hh victrix-abyssi.hh notify.hh monsters.hh objects.hh pobj_id.hh pmon_id.hh player.hh
+u.o: $(srcdir)/u.cc $(srcdir)/combat.hh $(srcdir)/victrix-abyssi.hh $(srcdir)/notify.hh $(srcdir)/monsters.hh $(srcdir)/objects.hh ./pobj_id.hh ./pmon_id.hh $(srcdir)/player.hh
 
-util.o: util.c util.h
+util.o: $(srcdir)/util.c $(srcdir)/util.h
 
 # vim:ts=8:sts=8:sw=8:noexpandtab
index 9e911b4..13be088 100755 (executable)
--- a/configure
+++ b/configure
@@ -13,7 +13,7 @@ my $sbindir='$(exec_prefix)/sbin';
 my $libdir='$(exec_prefix)/lib';
 my $libexecdir='$(exec_prefix)/libexec';
 my $gamesdir='$(prefix)/games';
-my $srcdir='.';
+my $srcdir=undef;
 
 my $datarootdir='$(prefix)/share';
 my $datadir='$(datarootdir)/victrix-abyssi';
@@ -76,7 +76,24 @@ GetOptions(
 print STDOUT "Configuring Victrix Abyssi build/install process...\n" if $verbose;
 
 my $cmdresults;
-
+my $probably_in_main_dir = 0;
+
+if (!defined($srcdir))
+{
+    # Heuristic check when srcdir undefined: If the main header file is here,
+    # srcdir should be "."; if the main header file is not here but is in the
+    # parent dir, srcdir should be "..".
+    if (-f "./victrix-abyssi.hh")
+    {
+        # We're probably in srcdir.
+        $srcdir = "."
+    }
+    elsif (-f "../victrix-abyssi.hh")
+    {
+        # We're probably in an immediate child of srcdir.
+        $srcdir = ".."
+    }
+}
 print STDOUT "Testing 'mkdir -p' ...\n" if $verbose;
 rmdir "billy/bob";
 rmdir "billy";
@@ -132,3 +149,14 @@ print STDOUT "Writing features.mk...\n" if $verbose;
 open(FEATURES_MK, '>', "features.mk") or die $!;
 print FEATURES_MK "DISABLE_STATICS=${disable_statics}";
 close(FEATURES_MK);
+
+if (($srcdir ne ".") && ($srcdir ne ""))
+{
+    open MAKEFILE_IN, "<", "${srcdir}/Makefile";
+    my @makefile = <MAKEFILE_IN>;
+    close MAKEFILE_IN;
+    print STDOUT "Writing Makefile...\n" if $verbose;
+    open MAKEFILE_OUT, ">", "./Makefile";
+    print MAKEFILE_OUT @makefile;
+    close MAKEFILE_OUT;
+}