###########################################################################
##                                                                       ##
##                OptimEISTI Server Builder                              ##
## Author : MACHIZAUD Andréa                                             ##
## Last Edited : 31/10/10 - 4:53                                         ##
##                                                                       ##
###########################################################################

# miscellaneous vars
PROJECT_FOLDER=Server
BUILD_FOLDER=build
TEST_FOLDER=src/test
SRC_FOLDER=src/main
RESOURCES_FOLDER=resources
SERVER_PROGRAM=launch_server
SERVER_DAEMON=daemon-server
LOGGER_DAEMON=daemon-logger
TEST_PROGRAM=launch_server_test-suite

SECRETS=$(RESOURCES_FOLDER)/secrets

METHODS_LIBRARY=$(BUILD_FOLDER)/main/library/mathematics-resolution.so

MODEL_FOLDER=$(SRC_FOLDER)/model
MODEL_SOURCES=$(wildcard $(MODEL_FOLDER)/*.c)
MODEL_HEADERS=$(wildcard $(MODEL_FOLDER)/*.h)

MISCELLANEOUS_FOLDER=$(SRC_FOLDER)/miscellaneous
MISCELLANEOUS_SOURCES=$(wildcard $(MISCELLANEOUS_FOLDER)/*.c)
MISCELLANEOUS_HEADERS=$(wildcard $(MISCELLANEOUS_FOLDER)/*.h)

CONTROL_FOLDER=$(SRC_FOLDER)/control
CONTROL_SOURCES=$(wildcard $(CONTROL_FOLDER)/*.c)
CONTROL_HEADERS=$(wildcard $(CONTROL_FOLDER)/*.h)

TEST_MODEL_FOLDER=$(TEST_FOLDER)/model
TEST_MODEL_SOURCES=$(wildcard $(TEST_MODEL_FOLDER)/*.c)
TEST_MODEL_HEADERS=$(wildcard $(TEST_MODEL_FOLDER)/*.h)

TEST_CONTROL_FOLDER=$(TEST_FOLDER)/control
TEST_CONTROL_SOURCES=$(wildcard $(TEST_CONTROL_FOLDER)/*.c)
TEST_CONTROL_HEADERS=$(wildcard $(TEST_CONTROL_FOLDER)/*.h)

# compiler
COMPILER=gcc -fPIC

# option
WARNING_OPTION=-Wall
INCLUDE_HEADER_FOLDER_OPTION=-I
LINK_BUILDER_OPTION=-c
OUTPUT_NAME_OPTION=-o
CREATE_LIBRARY_OPTION=-shared

MATH_LIBRARY=-lm
ODBC_LIBRARY=-lodbc
DLFCN_LIBRARY=-ldl
XML_LIBRARY=`xml2-config --libs --cflags`

ALL_LIBRARY=$(MATH_LIBRARY) $(ODBC_LIBRARY) $(DLFCN_LIBRARY) $(XML_LIBRARY)

INCLUDE_ALL_HEADERS= \
		$(INCLUDE_HEADER_FOLDER_OPTION)$(SRC_FOLDER) \
		$(INCLUDE_HEADER_FOLDER_OPTION)$(MODEL_FOLDER) \
		$(INCLUDE_HEADER_FOLDER_OPTION)$(MISCELLANEOUS_FOLDER) \
		$(INCLUDE_HEADER_FOLDER_OPTION)$(CONTROL_FOLDER)

# utilisation sets
COMPILE_TO_LINK=$(COMPILER) $(WARNING_OPTION) $(LINK_BUILDER_OPTION)

# Server Program Build
build: pre-build build-model build-miscellaneous build-control build-methods-library post-build
	# build the whole project
	echo "Project built."
	
start-logger : build
	sudo $(BUILD_FOLDER)/$(LOGGER_DAEMON)

listen-network : build
	sudo $(BUILD_FOLDER)/$(SERVER_DAEMON)

# Operations before build
pre-build : 
	echo "Pre-build..."
	mkdir -p ${BUILD_FOLDER}               # -p to avoid error if existing
	mkdir -p $(BUILD_FOLDER)/main/library/
	mkdir -p $(BUILD_FOLDER)/main/links/model
	mkdir -p $(BUILD_FOLDER)/main/links/model/methods
	mkdir -p $(BUILD_FOLDER)/main/links/miscellaneous
	mkdir -p $(BUILD_FOLDER)/main/links/control

build-methods-library: pre-build build-model build-miscellaneous
	echo "Method library build..."
	# Generate .o files for methods
	$(COMPILE_TO_LINK) \
		$(ALL_LIBRARY) \
		$(INCLUDE_ALL_HEADERS) \
		$(MODEL_FOLDER)/methods/method-*.c
	mv method-*.o $(BUILD_FOLDER)/main/links/model/methods/
	# Squeeze it into a library
	$(COMPILER) \
		$(CREATE_LIBRARY_OPTION) \
		$(BUILD_FOLDER)/main/links/model/methods/method-*.o \
		$(BUILD_FOLDER)/main/links/miscellaneous/*.o \
		$(BUILD_FOLDER)/main/links/model/*.o \
		$(OUTPUT_NAME_OPTION) $(METHODS_LIBRARY) 
	
build-model : pre-build $(MODEL_SOURCES) ${MODEL_HEADERS}
	echo "Model build..."
	$(COMPILE_TO_LINK) \
		$(ALL_LIBRARY) \
		$(INCLUDE_ALL_HEADERS) \
		$(MODEL_SOURCES)
	mv *.o $(BUILD_FOLDER)/main/links/model/

build-miscellaneous : pre-build ${MISCELLANEOUS_SOURCES} ${MISCELLANEOUS_HEADERS}
	echo "Miscellaneous build..."
	$(COMPILE_TO_LINK) \
		$(ALL_LIBRARY) \
		$(INCLUDE_ALL_HEADERS) \
		${MISCELLANEOUS_SOURCES}
	mv *.o $(BUILD_FOLDER)/main/links/miscellaneous/

build-control : pre-build ${CONTROL_SOURCES} ${CONTROL_HEADERS}
	echo "Control build..."
	$(COMPILE_TO_LINK) \
		$(ALL_LIBRARY) \
		$(INCLUDE_ALL_HEADERS) \
		${CONTROL_SOURCES}
	mv *.o $(BUILD_FOLDER)/main/links/control/

post-build :
	echo "Build the application..."
	$(COMPILER) \
		$(INCLUDE_ALL_HEADERS) \
		$(ALL_LIBRARY) \
		$(OUTPUT_NAME_OPTION) $(BUILD_FOLDER)/$(SERVER_DAEMON) \
		$(SRC_FOLDER)/NetworkListener.c \
		$(BUILD_FOLDER)/main/links/model/*.o \
		$(BUILD_FOLDER)/main/links/miscellaneous/*.o \
		$(BUILD_FOLDER)/main/links/control/*.o
	$(COMPILER) \
		$(INCLUDE_ALL_HEADERS) \
		$(ALL_LIBRARY) \
		$(OUTPUT_NAME_OPTION) $(BUILD_FOLDER)/$(LOGGER_DAEMON) \
		$(SRC_FOLDER)/launch_logger.c
	cp $(SECRETS) $(BUILD_FOLDER)

#############################TEST-PART#######################################################

#Server tests Build
build-test : build 
	
test-xml : build-test
	$(COMPILER) \
		$(INCLUDE_ALL_HEADERS) \
		$(ALL_LIBRARY) \
		-o $(BUILD_FOLDER)/test-xml \
		$(TEST_FOLDER)/TestXML.c      \
		$(BUILD_FOLDER)/main/links/model/*.o \
		$(BUILD_FOLDER)/main/links/miscellaneous/*.o \
		$(BUILD_FOLDER)/main/links/control/*.o 
	sudo date
	@echo Test XML feature
	sudo $(BUILD_FOLDER)/test-xml
	
test-logger : build-test
	$(COMPILER) \
		$(INCLUDE_ALL_HEADERS) \
		$(ALL_LIBRARY) \
		-o $(BUILD_FOLDER)/test-logger \
		$(TEST_FOLDER)/TestLogger.c      \
		$(BUILD_FOLDER)/main/links/model/*.o \
		$(BUILD_FOLDER)/main/links/miscellaneous/*.o \
		$(BUILD_FOLDER)/main/links/control/*.o 
	sudo date
	@echo Test Logger feature
	sudo $(BUILD_FOLDER)/test-logger
	
test-resolver : build-test
	$(COMPILER) \
		$(INCLUDE_ALL_HEADERS) \
		$(ALL_LIBRARY) \
		-o $(BUILD_FOLDER)/test-resolver \
		$(TEST_FOLDER)/testResolver.c      \
		$(BUILD_FOLDER)/main/links/model/*.o \
		$(BUILD_FOLDER)/main/links/miscellaneous/*.o \
		$(BUILD_FOLDER)/main/links/control/*.o 
	sudo date
	@echo Test Resolver feature
	sudo $(BUILD_FOLDER)/test-resolver

test-all : test-xml test-resolver test-logger	

#############################################################################################

clean : 
	sudo rm -rf ${BUILD_FOLDER}
	echo "Project cleaned."
