CC = gcc
CXX = g++
LD = g++
STRIP = strip --strip-all

INCLUDES = -I../../includes -I../../psxdev -I../../generic/include \
-I../../generic/lib/zlib/include \
-I../../generic/lib/lua/include -I../../generic/lib/lua/includes \
-I../../mogltk/include \
-I../.. \
`sdl-config --cflags`

CPPFLAGS = $(INCLUDES) -O4 -march=i686 -DSTDC_HEADERS -DREADLINE_STATIC -DHAVE_UNISTD_H -fexceptions

LDFLAGS = -march=i586 -O4 `sdl-config --libs`

SOURCES = \
../../Dalos/Dalos.cc ../../cd-tool.cpp

MOGLTK_SOURCES = \
../../mogltk/lib/base.cc      ../../mogltk/lib/glwidgets.cc \
../../mogltk/lib/engine.cc    ../../mogltk/lib/mcolor.cc \
../../mogltk/lib/font.cc      ../../mogltk/lib/shape.cc \
../../mogltk/lib/glbase.cc    ../../mogltk/lib/sprite.cc \
../../mogltk/lib/glfont.cc    ../../mogltk/lib/texture.cc \
../../mogltk/lib/glshape.cc   ../../mogltk/lib/widgets.cc \
../../mogltk/lib/glsprite.cc

BALTISOT_SOURCES = \
../../generic/lib/Image.cc       ../../generic/lib/Main.cc \
../../generic/lib/BLua.cc        ../../generic/lib/Buffer.cc \
../../generic/lib/ConfigFile.cc  ../../generic/lib/Output.cc \
../../generic/lib/Exceptions.cc  ../../generic/lib/Regex.cc \
../../generic/lib/Handle.cc      ../../generic/lib/String.cc \
../../generic/lib/Input.cc       ../../generic/lib/fileutils.cc \
../../generic/lib/LuaHandle.cc   ../../generic/lib/generic.cc \
../../generic/lib/checkargs.c    ../../generic/lib/datecalc.c

ZLIB_SOURCES = \
../../generic/lib/zlib/src/adler32.c   ../../generic/lib/zlib/src/inffast.c \
../../generic/lib/zlib/src/compress.c  ../../generic/lib/zlib/src/inflate.c \
../../generic/lib/zlib/src/crc32.c     ../../generic/lib/zlib/src/inftrees.c \
../../generic/lib/zlib/src/deflate.c   ../../generic/lib/zlib/src/infutil.c \
../../generic/lib/zlib/src/gzio.c      ../../generic/lib/zlib/src/trees.c \
../../generic/lib/zlib/src/infblock.c  ../../generic/lib/zlib/src/uncompr.c \
../../generic/lib/zlib/src/infcodes.c  ../../generic/lib/zlib/src/zutil.c

LUA_SOURCES = \
../../generic/lib/lua/src/lapi.c      ../../generic/lib/lua/src/lparser.c \
../../generic/lib/lua/src/lcode.c     ../../generic/lib/lua/src/lstate.c \
../../generic/lib/lua/src/ldebug.c    ../../generic/lib/lua/src/lstring.c \
../../generic/lib/lua/src/ldo.c       ../../generic/lib/lua/src/ltable.c \
../../generic/lib/lua/src/ldump.c     ../../generic/lib/lua/src/ltests.c \
../../generic/lib/lua/src/lfunc.c     ../../generic/lib/lua/src/ltm.c \
../../generic/lib/lua/src/lgc.c       ../../generic/lib/lua/src/luacomp.c \
../../generic/lib/lua/src/llex.c      ../../generic/lib/lua/src/lundump.c \
../../generic/lib/lua/src/lmem.c      ../../generic/lib/lua/src/lvm.c \
../../generic/lib/lua/src/lobject.c   ../../generic/lib/lua/src/lzio.c \
../../generic/lib/lua/src/lopcodes.c \
../../generic/lib/lua/src/LuaLib/lauxlib.c \
../../generic/lib/lua/src/LuaLib/lbaselib.c \
../../generic/lib/lua/src/LuaLib/ldblib.c \
../../generic/lib/lua/src/LuaLib/liolib.c \
../../generic/lib/lua/src/LuaLib/lmathlib.c \
../../generic/lib/lua/src/LuaLib/loadlib.c \
../../generic/lib/lua/src/LuaLib/lstrlib.c \
../../generic/lib/lua/src/LuaLib/ltablib.c \
../../generic/lib/lua/src/LuaLib/ldirlib.c

PSX_SOURCES = \
../../lib/cdabstract.cpp  ../../lib/luacd.cpp  \
../../lib/cdreader.cpp    ../../lib/luapsx.cpp \
../../lib/cdutils.cpp     ../../lib/lzss.cpp   \
 ../../lib/yazedc.cpp     ../../lib/isobuilder.cpp

PSXDEV_SOURCES = \
../../psxdev/bs.c       ../../psxdev/jfdctint.c  ../../psxdev/xadecode.c \
../../psxdev/idctfst.c  ../../psxdev/vlc.c

COMMON_SOURCES = \
$(BALTISOT_SOURCES) $(ZLIB_SOURCES) $(REGEX_SOURCES) $(GETOPT_SOURCES)\
$(LUA_SOURCES) $(PSX_SOURCES) $(PSXDEV_SOURCES) $(READLINE_SOURCES)

WHOLE_SOURCES = $(SOURCES) $(COMMON_SOURCES) $(MOGLTK_SOURCES)

ALL_OBJECTS = $(addsuffix .o, $(notdir $(basename $(WHOLE_SOURCES))))

DALOS_OBJECTS = $(addsuffix .o, $(notdir $(basename $(COMMON_SOURCES) $(MOGLTK_SOURCES)))) Dalos.o

CD_TOOL_OBJECTS = $(addsuffix .o, $(notdir $(basename $(COMMON_SOURCES)))) cd-tool.o

all: cd-tool cd-tool-static Dalos

stats:
	@wc $(WHOLE_SOURCES)

dist: all ../../cd-tool.lua ../../FAQ-cd.txt ../../COPYING
	zip -j9 ../cd-tool-`date +%Y%m%d`-linux-dynamic.zip cd-tool ../../cd-tool.lua ../../FAQ-cd.txt ../../COPYING
	zip -j9 ../cd-tool-`date +%Y%m%d`-linux-static.zip cd-tool-static ../../cd-tool.lua ../../FAQ-cd.txt ../../COPYING
	zip -j9 ../Dalos-`date +%Y%m%d`-linux-dynamic.zip Dalos ../../Dalos/Dalos.paq ../../COPYING
	zip -j9 ../Dalos-`date +%Y%m%d`-linux-static.zip Dalos-static ../../Dalos/Dalos.paq ../../COPYING

Dalos: $(DALOS_OBJECTS)
	$(LD) -o Dalos $(DALOS_OBJECTS) -lGL -lGLU -lreadline -lSDL -lpthread
	$(STRIP) Dalos
	upx-nrv -9 Dalos

Dalos-static: $(DALOS_OBJECTS)
	$(LD) -o Dalos-static $(DALOS_OBJECTS) -lGL -lGLU -lreadline -lSDL -lpthread -static -laa -lgpm -lncurses -lX11 -lslang -lXext -ldl -lvga -lasound -L/usr/X11R6/lib
	$(STRIP) Dalos-static
	upx-nrv -9 Dalos-static

cd-tool: $(CD_TOOL_OBJECTS)
	$(LD) $(LDFLAGS) -o cd-tool $(CD_TOOL_OBJECTS) -lreadline -lncurses
	$(STRIP) cd-tool
	upx-nrv -9 cd-tool

cd-tool-static: $(CD_TOOL_OBJECTS)
	$(LD) $(LDFLAGS) -o cd-tool-static $(CD_TOOL_OBJECTS) -lreadline -lncurses -static
	$(STRIP) cd-tool-static
	upx-nrv -9 cd-tool-static

clean:
	rm -f Dalos Dalos-static cd-tool cd-tool-static *.o




define OBJECT_C_template
 $(addsuffix .o, $(notdir $(basename $(1)))): $(src)
	$$(CC) $$(CPPFLAGS) $$(CFLAGS) -c $(src)
endef

define OBJECT_CXX_template
 $(addsuffix .o, $(notdir $(basename $(1)))): $(src)
	$$(CXX) $$(CPPFLAGS) $$(CXXFLAGS) -c $(src)
endef

$(foreach src, $(WHOLE_SOURCES), $(if $(filter %.c, $(src)), $(eval $(call OBJECT_C_template, $(src))), $(eval $(call OBJECT_CXX_template, $(src)))))