BOOST_ROOT = $(TECELLA_ENV)/boost
BOOST_DIR = $(BOOST_ROOT)/boost_1_39_0
BOOST_LIB_DIR = $(BOOST_DIR)/stage/lib
BOOST_INCLUDE_DIR = $(BOOST_DIR)

INCLUDE_DIRS = -I"$(BOOST_INCLUDE_DIR)"

CFLAGS = -Wall $(INCLUDE_DIRS) -std=gnu++0x -mthreads -D_WIN32_WINNT=0x0500

#setup a debug vs release build
# to set debug mode, run "make DEBUG=y"
ifeq ($(DEBUG),y)
   CFLAGS += -g
   TARGET_DIR = debug
   TLC_LIB_FLAGS  += -L"$(BOOST_LIB_DIR)" -llibboost_thread-mgw44-mt-d  -static-libgcc
   TLC2ATF_LIB_FLAGS  += -L"$(BOOST_LIB_DIR)" -llibboost_thread-mgw44-mt-d -llibboost_program_options-mgw44-mt-d -static-libgcc
   TEST_LIB_FLAGS += -L"$(BOOST_LIB_DIR)" -llibboost_program_options-mgw44-mt-d 
else
   CFLAGS += -O2 
   TARGET_DIR = release
   TLC_LIB_FLAGS  += -L"$(BOOST_LIB_DIR)" -llibboost_thread-mgw44-mt -static-libgcc
   TLC2ATF_LIB_FLAGS  += -L"$(BOOST_LIB_DIR)" -llibboost_thread-mgw44-mt -llibboost_program_options-mgw44-mt -static-libgcc
   TEST_LIB_FLAGS += -L"$(BOOST_LIB_DIR)" -llibboost_program_options-mgw44-mt
endif


.PHONY: all
all: boost tlc tlc2atf tests

.PHONY: tlc
tlc: $(TARGET_DIR)/TecellaTLC.o $(TARGET_DIR)/tlc.o $(TARGET_DIR)/tlc_v0.o $(TARGET_DIR)/tlc_v1.o
	cd $(TARGET_DIR) && g++ -shared -s -o TecellaTLC.dll TecellaTLC.o tlc.o tlc_v0.o tlc_v1.o $(TLC_LIB_FLAGS) -Wl,--output-def,TecellaTLC.def,--out-implib,TecellaTLC.a

.PHONY: release
release: tlc tlc2atf
	strip --strip-all $(TARGET_DIR)/TecellaTLC.dll
	upx --best $(TARGET_DIR)/TecellaTLC.dll
	upx --best $(TARGET_DIR)/tlc2atf.exe
	cd $(TARGET_DIR) && lib /machine:i386 /def:TecellaTLC.def	

$(TARGET_DIR)/TecellaTLC.o: src/TecellaTLC.cpp src/TecellaTLC.h src/tlc.h src/tlc_v0.h src/tlc_v1.h
	g++ -c src/TecellaTLC.cpp -o $@ $(CFLAGS)

$(TARGET_DIR)/tlc.o: src/tlc.cpp src/tlc.h
	g++ -c src/tlc.cpp -o $@ $(CFLAGS)

$(TARGET_DIR)/tlc_v0.o: src/tlc_v0.cpp src/tlc_v0.h
	g++ -c src/tlc_v0.cpp -o $@ $(CFLAGS)

$(TARGET_DIR)/tlc_v1.o: src/tlc_v1.cpp src/tlc_v1.h
	g++ -c src/tlc_v1.cpp -o $@ $(CFLAGS)

.PHONY: tlc2atf
tlc2atf: tlc $(TARGET_DIR)/tlc2atf.o
	cd $(TARGET_DIR) && g++ -s -o tlc2atf.exe tlc2atf.o TecellaTLC.o tlc.o tlc_v0.o tlc_v1.o -L"." $(TLC2ATF_LIB_FLAGS)

$(TARGET_DIR)/tlc2atf.o: src/tlc2atf.cpp src/TecellaTLC.h
	g++ -c src/tlc2atf.cpp -o $@ $(CFLAGS) -I"src"

.PHONY: tests
tests: test_random
	
test_random: tlc $(TARGET_DIR)/test_random.o
	cd $(TARGET_DIR) && g++ -o test_random.exe test_random.o -L"." -lTecellaTLC $(TEST_LIB_FLAGS)

$(TARGET_DIR)/test_random.o: tests/random.cpp src/TecellaTLC.h
	g++ -c tests/random.cpp -o $@ $(CFLAGS) -I"src"

.PHONY: boost
boost:
	$(MAKE) -C $(BOOST_ROOT) thread
	$(MAKE) -C $(BOOST_ROOT) test

.PHONY: boostclean
boostclean:
	$(MAKE) -C $(BOOST_ROOT) clean

.PHONY: project
project:
	qtcreator project/TecellaTLC.creator &

.PHONY clean:
clean:
	cd release && rm *.o *.dll *.exe *.def *.a *.exp *.lib || true
	cd debug && rm *.o *.dll *.exe *.def *.a *.exp *.lib || true
