# makefile second edition :)

# common variables
COMPILER=-D__GCC__
OSTYPE=-D__LINUX__
WINSYS=-D__SDL__
CY_IS=-DCY_IS=2
CY_DEBUG=-DCY_DEBUG=3
CY_GLEXT_EXTRA=-DGLEXT_PROC_TEST -DGLEXT_AUTOLOADER

# *nix featured variables
GLEXT_PROTO=-DGL_GLEXT_PROTOTYPES -DGLX_GLXEXT_PROTOTYPES

# sdl cflags
SDL_CFLAGS=`sdl-config --cflags`

# GL libs
GL_LIBS=-lGL -lGLU

# sdl libs
SDL_LIBS=`sdl-config --libs`




# compiler setup
GCC=g++
#GCFLAGS=-ftracer -fgcse-after-reload -fgcse-las -fgcse-sm -fmodulo-sched -fomit-frame-pointer -fpeel-loops -maccumulate-outgoing-args -march=athlon-xp -mfpmath=387 -ffast-math -O3 $(COMPILER) $(OSTYPE) $(WINSYS) $(CY_IS) $(CY_DEBUG) $(GLEXT_PROTO) $(CY_GLEXT_EXTRA)
GCFLAGS=-march=athlon-xp -mfpmath=387 -ffast-math -O3 -fvisibility-inlines-hidden -fvisibility=hidden -fgcse-after-reload -fgcse-las -fgcse-sm -fmodulo-sched -fomit-frame-pointer -fpeel-loops -maccumulate-outgoing-args $(COMPILER) $(OSTYPE) $(WINSYS) $(CY_IS) $(CY_DEBUG) $(GLEXT_PROTO) $(CY_GLEXT_EXTRA)
GLDFLAGS=-Wl,--sort-common -Wl,--relax -Wl,-O1 -Wl,-z,now -Wl,-s -Wl,$(GL_LIBS) -Wl,$(SDL_LIBS)
#GLDFLAGS=-Wl,--sort-common -Wl,--as-needed -Wl,--relax -Wl,-O1 -Wl,-z,now -Wl,-s -Wl,$(GL_LIBS) -Wl,$(SDL_LIBS)
CMP=upx
ASM=intel

# sources to compile
SRCS=main.cpp \
	cysdl.cpp \
	glext_loader.cpp \
	globject.cpp \
	stdfile.cpp

# objects to link
OBJS=main.o \
	cysdl.o \
	glext_loader.o \
	globject.o \
	stdfile.o




all: CyGNUsGL.x86

CyGNUsGL.x86: $(OBJS)
	@echo "..:: LiNKiNG CyGNUsGL ::.."
	$(GCC) $(GLDFLAGS) $(OBJS) -o $@

main.o: main.cpp
	@echo "..:: CoMPiLiNG CyGNUsGL ::.."
	$(GCC) -c $(GCFLAGS) main.cpp

globject.o: globject.cpp
	$(GCC) -c $(GCFLAGS) globject.cpp

glext_loader.o: glext_loader.cpp
	$(GCC) -c $(GCFLAGS) glext_loader.cpp

cysdl.o: cysdl.cpp
	$(GCC) -c $(GCFLAGS) $(SDL_CFLAGS) cysdl.cpp

stdfile.o: stdfile.cpp
	$(GCC) -c $(GCFLAGS) stdfile.cpp




whole: $(SRCS)
	@echo "..:: CoMPiLiNG CyGNUsGL AS A WHoLE PRoGRaM ::.."
	$(GCC) $(GCFLAGS) $(GLDFLAGS) -DMAKE_WHOLE -fwhole-program $? -o CyGNUsGL.x86




cmp: CyGNUsGL.x86
	@echo "..:: CoMPReSSiNG CyGNUsGL ::.."
	$(CMP) CyGNUsGL.x86




asm: CyGNUsGL.asm
	@echo "..:: PRiNTiNG ASM OuT ::.."
	@less $?

CyGNUsGL.asm: main.cpp
	@echo "..:: GeNeRaTiNG ASSeMBLY OuTPuT ::.."
	$(GCC) -c $(GCFLAGS)  -masm=$(ASM) -S -fverbose-asm $? -o $@




depend:
	makedepend -- $(GCFLAGS) -Y -- $(SRCS) 2>/dev/null




shaders:
	@cd program && make && cd ..



save:
	@git-archive --format=tar --prefix=head/ HEAD | gzip > CyGNUsGL-head.tar.gz




help:
	@echo "make help => this help \"screen\""
	@echo "make => builds the main target"
	@echo "make whole => builds the app with the '-fwhole-program' flag"
	@echo "make cmp => compress the main target"
	@echo "make asm => make '.asm' file from main target and prints it"
	@echo "make depend => create dependency chain in Makefile"
	@echo "make shaders => executes the Makefile in 'program' directory"
	@echo "make save => creates an archive from current git database"
	@echo "make clean => distclean"




# misc target(s)
.PHONY: clean

clean:
	@echo "..:: CLeaNiNG CyGNUsGL ::.."
	@rm -rf *.asm *.o *~ *.x86 a.out
#	@cd program && make clean && cd ..
# DO NOT DELETE

main.o: linear.h global.h lookup.h timer.h glwrapper.h glext_loader.h
main.o: globject.h stdfile.h cysdl.h
cysdl.o: cysdl.h global.h
glext_loader.o: glext_loader.h global.h
globject.o: globject.h stdfile.h global.h glwrapper.h glext_loader.h
stdfile.o: stdfile.h global.h
