##########################################
# Top-level Makefile for X-Code
# Joshua Wise
# 20040105
##########################################

##########################################
# Update the following line every time you change the version!
# ALTERNATIVELY if you're building a BETA, you can do a "VERSION=740b1 make", and the ?= here will not override that! Cool!
VERSION ?= 800b17
SCVERSION ?= 140-lin3

TOPDIR := $(shell /bin/pwd)

# By default build a dev release. If you're not building a dev release, just do ARCH=i686 make.
ARCH ?= $(shell arch)-dev
ARCHS ?= i586 i586-dev i686 i686-dev athlon-xp athlon-xp-dev

CC-$(ARCH) ?= $(CROSS-$(ARCH))gcc
CPLUS-$(ARCH) ?= $(CROSS-$(ARCH))g++
LD-$(ARCH) ?= $(CROSS-$(ARCH))ld
AR-$(ARCH) ?= $(CROSS-$(ARCH))ar
RANLIB-$(ARCH) ?= $(CROSS-$(ARCH))ranlib
STRIP-$(ARCH) ?= $(CROSS-$(ARCH))strip

ifdef FORCEOVERRIDE
	CC := $(CC-$(ARCH))
	CPLUS := $(CPLUS-$(ARCH))
	LD := $(LD-$(ARCH))
	AR := $(AR-$(ARCH))
	RANLIB := $(RANLIB-$(ARCH))
	STRIP := $(STRIP-$(ARCH))
else
	CC ?= $(CC-$(ARCH))
	CPLUS ?= $(CPLUS-$(ARCH))
	LD ?= $(LD-$(ARCH))
	AR ?= $(AR-$(ARCH))
	RANLIB ?= $(RANLIB-$(ARCH))
	STRIP ?= $(STRIP-$(ARCH))
endif

CC         := distcc $(CC)
CPLUS      := distcc $(CPLUS)

CFLAGS-i586 		?= -O3 -fomit-frame-pointer -funroll-loops -mtune=i586 -march=i586 -DNDEBUG
CFLAGS-i586-dev		?= -O0 -g -pg -mtune=i586 -march=i586 -DDEV=1 -DDEBUG

CFLAGS-i686		?= -O3 -fomit-frame-pointer -funroll-loops -mtune=i686 -march=i686 -mmmx -DNDEBUG
CFLAGS-i686-dev		?= -O0 -g -pg -mtune=i686 -march=i686 -mmmx -DDEV=1 -DDEBUG

CFLAGS-athlon-xp	?= -O3 -fforce-addr -fomit-frame-pointer -funroll-loops -falign-functions=4 -maccumulate-outgoing-args -mtune=athlon-xp -march=athlon-xp -mfpmath=sse -DNDEBUG
CFLAGS-athlon-xp-dev	?= -O0 -g -pg -mtune=athlon-xp -march=athlon-xp -mfpmath=sse -DDEV=1 -DDEBUG

# SHARED LIBRARIES, we can reference to wherever.
# STATIC LIBRARIES, we must reference to arch-specific!
LIBS-ia32		?= \
				-L/usr/X11R6/lib \
				/usr/lib/libGL.so \
				/usr/lib/libGLU.so \
				/usr/X11R6/lib/libXext.so \
				/usr/X11R6/lib/libX11.so \
				/usr/lib/libopenal.so \
				-lpthread \
				-ldl \
				-Wl,-Bstatic \
					-lstlport_gcc \
					$(TOPDIR)/libs/libpng.$(ARCH).a \
					$(TOPDIR)/libs/libz.$(ARCH).a \
					$(TOPDIR)/libs/libstdc++.$(ARCH).a \
				-Wl,-Bdynamic \
				-lm

	LIBS-i586		?= $(LIBS-ia32)
	LIBS-i586-dev		?= $(LIBS-ia32)
	LIBS-i686		?= $(LIBS-ia32)
	LIBS-i686-dev		?= $(LIBS-ia32)
	LIBS-athlon-xp		?= $(LIBS-ia32)
	LIBS-athlon-xp-dev	?= $(LIBS-ia32)

ifdef FORCEOVERRIDE
	CFLAGS := $(CFLAGS-$(ARCH))
	LIBS := $(LIBS-$(ARCH))
else
	CFLAGS ?= $(CFLAGS-$(ARCH))
	LIBS ?= $(LIBS-$(ARCH))
endif

CFLAGS +=	-fno-rtti			# We do not need run-time type identification. Let's make this *FAST*!
CFLAGS +=	-fno-math-errno			# We never use errno when doing math.
CFLAGS +=	-funsafe-math-optimizations	# Allow optimizations for floating-point arithmetic that (a) assume that arguments and results are valid and (b) may violate IEEE or ANSI standards.
CFLAGS +=	-fprefetch-loop-arrays		# Get data before we need them.

CFLAGS +=	-I. \
		-I$(TOPDIR)/Common \
		-I$(TOPDIR)/Common/GenH \
		-I$(TOPDIR)/Common/Thread \
		-I$(TOPDIR)/Common/OOPS \
		-I$(TOPDIR)/XPLM \
		-I$(TOPDIR)/Common/v8scene/Utils \
		-I$(TOPDIR)/Common/v8scene/Obj \
		-I$(TOPDIR)/Common/v8scene/DSF \
		-I/usr/include/stlport \
		-DLINUX
		
export TOPDIR CFLAGS CROSS ARCH CPLUS AR RANLIB STRIP LD LIBS

all: xsys-tarball

spa: .DUMMY
	@echo Building spa for $(ARCH)
	$(MAKE) -C Space-Combat-f
	ln -fs Space-Combat-f/Space-Combat-$(ARCH) spa
	
afl: .DUMMY
	@echo Building afl for $(ARCH)
	$(MAKE) -C Airfoil-Maker-f
	ln -fs Airfoil-Maker-f/Airfoil-Maker-$(ARCH) afl
	
bri: .DUMMY
	@echo Building bri for $(ARCH)
	$(MAKE) -C Briefer-f
	ln -fs Briefer-f/Briefer-$(ARCH) bri
	
pln: .DUMMY
	@echo Building pln for $(ARCH)
	$(MAKE) -C Plane-Maker-f
	ln -fs Plane-Maker-f/Plane-Maker-$(ARCH) pln
	
wrl: .DUMMY
	@echo Building wrl for $(ARCH)
	$(MAKE) -C World-Maker-f
	ln -fs World-Maker-f/World-Maker-$(ARCH) wrl
	
sim: .DUMMY
	@echo Building sim for $(ARCH)
	$(MAKE) -C X-Plane-f
	ln -fs X-Plane-f/X-Plane-$(ARCH) sim
	
XBTest: .DUMMY
	$(MAKE) -C XBTest

release: release-afl release-bri release-pln release-wrl release-sim

releasearchs:
	for i in $(ARCHS); do \
		ARCH=$$i FORCEOVERRIDE=1 $(MAKE) release || exit 1; \
	done

release-spa: spa
	if echo $(ARCH) | grep dev >/dev/null; then echo Not stripping spa; else $(STRIP) spa; fi
	
release-afl: afl
	if echo $(ARCH) | grep dev >/dev/null; then echo Not stripping afl; else $(STRIP) afl; fi
	
release-bri: bri
	if echo $(ARCH) | grep dev >/dev/null; then echo Not stripping bri; else $(STRIP) bri; fi
	
release-pln: pln
	if echo $(ARCH) | grep dev >/dev/null; then echo Not stripping pln; else $(STRIP) pln; fi
	
release-wrl: wrl
	if echo $(ARCH) | grep dev >/dev/null; then echo Not stripping wrl; else $(STRIP) wrl; fi
	
release-sim: sim
	if echo $(ARCH) | grep dev >/dev/null; then echo Not stripping sim; else $(STRIP) sim; fi

tarballs: Space-Combat-$(SCVERSION).tar.gz X-System-$(VERSION).tar.bz2

xsys-tarball: X-System-$(VERSION).tar.bz2

Space-Combat-$(SCVERSION).tar.gz: release-spa
	rm -rf Packaging/Space-Combat-$(SCVERSION)
	cp -R Packaging/Space-Combat Packaging/Space-Combat-$(SCVERSION)
	for i in $(ARCHS); do \
		cp Space-Combat-f/Space-Combat-$$i Packaging/Space-Combat-$(SCVERSION)/Space-Combat-$(SCVERSION)-$$i; \
	done
	tar czvf Space-Combat-$(SCVERSION).tar.gz -C Packaging Space-Combat-$(SCVERSION)
	
X-System-$(VERSION).tar.bz2: releasearchs
	rm -rf Packaging/X-System-$(VERSION)
	cp -R Packaging/X-System Packaging/X-System-$(VERSION)
	for i in $(ARCHS); do \
		cp Airfoil-Maker-f/Airfoil-Maker-$$i Packaging/X-System-$(VERSION)/Airfoil-Maker-$(VERSION)-$$i; \
		cp Briefer-f/Briefer-$$i Packaging/X-System-$(VERSION)/Briefer-$(VERSION)-$$i; \
		cp Plane-Maker-f/Plane-Maker-$$i Packaging/X-System-$(VERSION)/Plane-Maker-$(VERSION)-$$i; \
		cp World-Maker-f/World-Maker-$$i Packaging/X-System-$(VERSION)/World-Maker-$(VERSION)-$$i; \
		cp X-Plane-f/X-Plane-$$i Packaging/X-System-$(VERSION)/X-Plane-$(VERSION)-$$i; \
	done
	tar cjvf X-System-$(VERSION).tar.bz2 -C Packaging X-System-$(VERSION)

clean:
	rm -f spa afl bri pln wrl sim
	$(MAKE) -C Space-Combat-f clean
	$(MAKE) -C Airfoil-Maker-f clean
	$(MAKE) -C Briefer-f clean
	$(MAKE) -C Plane-Maker-f clean
	$(MAKE) -C World-Maker-f clean
	$(MAKE) -C X-Plane-f clean

.DUMMY:

