########################################
# Build Environment
# version and build configuration

# uncomment and optionally define on command line
# to override value defined in source, e.g.
#   trn_ver=1.0.1 make
trn_ver ?=0.0.1
trn_build=`date +%Y/%m/%dT%H:%M:%S%z`
OPT_TRN_VER=-DLIBTRN_VERSION=$(trn_ver)
OPT_TRN_BUILD=-DLIBTRN_BUILD=$(trn_build)

# C standard e.g. -std=c99 -std=gnu99
# may be needed for Cygwin (e.g. for loop declare/init)
#STD= -std=c99

# Platform-specific options
ifeq ($(shell uname),Linux)
OS_CFLAGS=
OS_INC_PATH=
OS_LIB_PATH=
OS_LIBS=-lrt
endif

ifeq ($(shell uname),Darwin)
OS_CFLAGS=
OS_INC_PATH=-I/opt/local/include
OS_LIB_PATH=-L/opt/local/lib
OS_LIBS=
endif

ifeq ($(shell uname),Cygwin)
OS_CFLAGS=
OS_INC_PATH=-I/opt/local/include
OS_LIB_PATH=-L/opt/local/lib
OS_LIBS=-lrt
endif

# Build options
BUILD_OPTIONS = $(STD) -D_GNU_SOURCE  $(OPT_TRN_VER) $(OPT_TRN_BUILD)

# Build directories
OUTPUT_DIR=../bin
BUILD_DIR=../build

# Compilation Options
CXX = g++ #gcc
AR = ar
# compile and link with -pg for profiling support
# then do gprof <application> gmon.out for profile output to console
#GPROF= -pg
# use -Wall unless you know what you're doing
WARN_FLAGS=-Wall

# Compiler flags
CFLAGS = -g -O2 -c $(WARN_FLAGS) $(GPROF) $(BUILD_OPTIONS) $(OS_CFLAGS)
INC_PATHS =  -I. -I/usr/include $(OS_INC_PATH)

# Linker flags
LD_FLAGS = -g $(GPROF)
LIB_PATHS = -L/usr/local/lib -L$(OUTPUT_DIR) $(OS_LIB_PATH)

########################################
# Target Definitions

LIBQNX=libqnx.a
LIBQNX_SRC = AsciiFile.cc AngleData.cc CharData.cc BinaryFile.cc DataLog.cc DataLogReader.cc DataLogWriter.cc \
FileData.cc StringConverter.cc StringData.cc TimeP.cc TimeTag.cc ShortData.cc Math.cc NavUtils.cc IntegerData.cc \
FloatData.cc DoubleData.cc DataField.cc DataFieldFactory.cc LogFile.cc
LIBQNX_OBJ=$(LIBQNX_SRC:%.cc=$(BUILD_DIR)/%.o)
LIBQNX_LIBS = -lstd++

READLOG=readlog
READLOG_SRC=readlog.cc
READLOG_OBJ=$(READLOG_SRC:%.cc=$(BUILD_DIR)/%.o)
READLOG_LIBS= -lm -lqnx

WRITELOG=writelog
WRITELOG_SRC=writelog.cc
WRITELOG_OBJ=$(WRITELOG_SRC:%.cc=$(BUILD_DIR)/%.o)
WRITELOG_LIBS= -lm -lqnx

LOG2MATLAB=log-to-matlab
LOG2MATLAB_SRC=logToMatlab.cc
LOG2MATLAB_OBJ=$(LOG2MATLAB_SRC:%.cc=$(BUILD_DIR)/%.o)
LOG2MATLAB_LIBS= -lm -lqnx

LOG2CSV=log-to-csv
LOG2CSV_SRC=logToCsv.cc
LOG2CSV_OBJ=$(LOG2CSV_SRC:%.cc=$(BUILD_DIR)/%.o)
LOG2CSV_LIBS= -lm -lqnx

########################################
# Build Files (mostly for cleanup)
SOURCES = $(LIBQNX_SRC) $(READLOG_SRC) \
        $(WRITELOG_SRC) $(LOG2MATLAB_SRC) \
        $(LOG2CSV_SRC)
OBJECTS = $(SOURCES:%.cc=$(BUILD_DIR)/%.o)
DEPENDS = $(SOURCES:%.cc=$(BUILD_DIR)/%.d)
BINARIES = $(OUTPUT_DIR)/$(LIBQNX) \
		$(OUTPUT_DIR)/$(READLOG) \
		$(OUTPUT_DIR)/$(WRITELOG) \
		$(OUTPUT_DIR)/$(LOG2MATLAB) \
		$(OUTPUT_DIR)/$(LOG2CSV)
CLEANUP = gmon.out
# dSYMs : XCode debug symbol file folders
#DSYMS   = $(BINARIES:%=%.dSYM)
#RM_DSYMS = rm -rf $(DSYMS)

########################################
# Rules: build targets

all: $(BINARIES)

# build newmat library
$(OUTPUT_DIR)/$(LIBQNX): $(LIBQNX_OBJ)
	@echo building $@...
	$(AR) rcs $@ $(LIBQNX_OBJ)
	ranlib $@

# build readlog utility
$(OUTPUT_DIR)/$(READLOG): $(READLOG_OBJ)
	@echo building $@...
	$(CXX) $(INC_PATHS) $(OPTIONS) $(LIB_PATHS) $^ -o $@ $(LD_FLAGS) $(READLOG_LIBS)
	@echo

# build writelog utility
$(OUTPUT_DIR)/$(WRITELOG): $(WRITELOG_OBJ)
	@echo building $@...
	$(CXX) $(INC_PATHS) $(OPTIONS) $(LIB_PATHS) $^ -o $@ $(LD_FLAGS) $(WRITELOG_LIBS)
	@echo

# build logToMatlab utility
$(OUTPUT_DIR)/$(LOG2MATLAB): $(LOG2MATLAB_OBJ)
	@echo building $@...
	$(CXX) $(INC_PATHS) $(OPTIONS) $(LIB_PATHS) $^ -o $@ $(LD_FLAGS) $(LOG2MATLAB_LIBS)
	@echo

# build logToCsv utility
$(OUTPUT_DIR)/$(LOG2CSV): $(LOG2CSV_OBJ)
	@echo building $@...
	$(CXX) $(INC_PATHS) $(OPTIONS) $(LIB_PATHS) $^ -o $@ $(LD_FLAGS) $(LOG2CSV_LIBS)
	@echo

#-include $(DEPENDS)

# rule: build object files from source files
$(BUILD_DIR)/%.o :%.c 
	@echo compiling $<...
	$(CXX) $(CFLAGS) $(INC_PATHS) -c $< -o $@
	@echo

$(BUILD_DIR)/%.o :%.cc
	@echo compiling $<...
	$(CXX) $(CFLAGS) $(INC_PATHS) $< -o $@
	@echo

# rule: build dependency files from source files
$(BUILD_DIR)/%.d :%.c
	@[ -d $(BUILD_DIR) ] || mkdir -p $(BUILD_DIR)
	@[ -d $(OUTPUT_DIR) ] || mkdir -p $(OUTPUT_DIR)
	@echo generating dependency file for $<
	@set -e; $(CXX) -MM $(CFLAGS) $(INC_PATHS) $< \
	| awk '/o:/ {printf "%s", "$@ $(BUILD_DIR)/"} {print}' > $@; \
	[ -s $@ ] || rm -f $@
	@echo


install:
	@echo "Installing...(not implemented)"


########################################
# Rules:

.PHONY: clean
.PHONY: purge

# clean : delete object, dependency, binary files
clean:
	rm -f $(OBJECTS) $(DEPENDS) $(BINARIES)
	$(RM_DSYMS)

# purge : delete delete object, dependency, binary files, build directories
purge:
	rm -f $(BINARIES) $(OBJECTS) $(DEPENDS) $(CLEANUP)
	rm -rf $(OUTPUT_DIR) $(BUILD_DIR) $(DSYMS) 

# include the dependencies
ifneq ($(MAKECMDGOALS),purge)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPENDS)
endif
endif
