######################################################################
#                             Makefile.txt
#
# Output path   : LIB_DIR        (copy of library is stored here)
# Include path  : INC_DIR        (additional search path for headers)
#           
# I N S T R U C T I O N S :
#
#    The following actions can always be done:
#
#	- set or modify globally defined variables
#	- delete object files in current catalog
#	- list current settings
#	
#    If no settings or file names are changed:
#
#	- make -f Makefile.txt => run makefile and create library
#	- make -s -f Makefile.txt => as above but no echo
#	- make -q -f Makefile.txt => don't execute commands
#
#    If settings or filenames are changed:
#
#	- Add/remove/change list of required files in SRC_CPP
#       - Remove old list of dependecies (last section in this file)
#	- Run 'make -depend -f Makefile.txt', to generate a list 
#	  of dependencies (appended at the end of this file)
# 	- Ensure that dependecies are added correctly
#	- Run 'make -f Makefile.txt' to build the library
#
#    Additional options:
#
#	- make echo -f Makefile.txt => list utilized settings#
#	- make clean -f Makefile.txt => delete all object files
#		   
######################################################################

# Start by reading common settings from config file.
# A list of defined variables is given below. Note that,
# the user may override these settings once they are set.
# 
#    MAKEFLAGS, CP, CC, AR, RANLIB, STRIP
#    RM, DEFINES, CFLAGS, OPTFLAG, INC_DIR, LIB_DIR
#
include ../../../../../../global_make_variables.txt

# All make files will store a copy of the generated archive (library) 
# file in this catalog. These files can then be used for deliveries
# or for building test projects based on GIPS components
#
LIB_DIR  = ../../../../../../build/libraries/

#======================================================
# user must define/modify variables in this section ...
#======================================================

# Include directories.
#
INC_DIR  =                                                  \
    ../../interface                                         \
    ../../../../interface                                   \
    ../../../../../../GIPSStandardUtility/main/interface    \
    ../../../../../../splib/main/interface                  \
	../../../../../../tools/gtest/interface

# Output executable name. 
#
PROG_NAME = apm_unit_test

# Relative path for the test binary
#
BIN_DIR = ./

BUILD_DIR = build

# define input C source files (.cpp)
#
SRC_CPP =  					            \
	unit_test.cpp

LIB_NAME = APM

#============================================
# ... end of user input section
#============================================

# -------------------------------
# derive internal/local variables
# -------------------------------

out_name = $(addprefix $(BIN_DIR),$(PROG_NAME))
lib_name = $(addsuffix $(FNAME_EXT),$(LIB_NAME))

defines  = $(addprefix -D,$(DEFINES))
includes = $(addprefix -I,$(INC_DIR))

cflags   = $(CFLAGS) $(OPTFLAG) $(defines) $(includes)
lflags	 = $(LFLAGS) $(OPTFLAG) 

obj_cpp := $(SRC_CPP:%.cpp=$(BUILD_DIR)/%.o)
dep_cpp := $(SRC_CPP:%.cpp=$(BUILD_DIR)/%.d)

ifeq (${TARGET},MAC)
libs	:= -lm
endif

ifeq (${TARGET},MAC_INTEL)
libs	:= -lm
endif

ifeq (${TARGET},LINUX)
libs    := -lm -lrt -lpthread
endif

all:  build

build:	$(out_name)

# -----------------------
# pattern rules
# -----------------------

$(BUILD_DIR)/%.o: %.cpp
	$(CCPP) $(cflags) $< -o $@

$(out_name): $(obj_cpp) $(obj_c) $(LIB_DIR)$(lib_name) $(LIB_DIR)$(GTEST_LIB_NAME)
	$(CCPP) $(lflags) $(obj_cpp) $(obj_c) $(LIB_DIR)$(lib_name) $(LIB_DIR)$(GTEST_LIB_NAME) $(libs) -o $(out_name)

# Creates dependency files
$(BUILD_DIR)/%.d: %.cpp
	@mkdir -p $(BUILD_DIR)
	@$(CCPP) -w -MM $(cflags) $< > $@
	@mv -f $@ $@.tmp
	@sed -e 's|.*:|$(BUILD_DIR)/$*.o:|' < $@.tmp > $@
	@sed -e 's/.*://' -e 's/\\$$//' < $@.tmp | fmt -1 | \
	sed -e 's/^ *//' -e 's/$$/:/' >> $@
	@rm -f $@.tmp

ifneq ($(MAKECMDGOALS), clean)
-include $(dep_cpp)
endif

# ----------------------
# selectable PHONY rules
# ----------------------

.PHONY: echo
echo:
	@echo
	@echo '>>' Output library: $(lib_name)
	@echo '>>' Copy of library is stored at: $(LIB_DIR)
	@echo '>>' Additional include directory: $(INC_DIR)
	@echo
	@echo '>>' Preprocessor defines: $(DEFINES)
	@echo '>>' Optimization flag: $(OPTFLAG)
	@echo
	@echo '>>' Current working directory: $(CURDIR)
	@echo '>>' Utilized make flags: $(MAKEFLAGS)
	@echo
	@echo '>>' Compiler command: $(CCPP) $(cflags)
	@echo '>>' Archive command: $(AR)
	@echo
	@echo '>>' Included '.cpp' source files: $(SRC_CPP)
	@echo '>>' Included '.c' source files: $(SRC_C)
	@echo
	@echo '>>' Generated object files: $(obj_cpp) $(obj_c)

.PHONY: clean
clean:
	@echo $(obj_cpp) $(obj_c) $(dep_cpp) $(dep_c)
	@$(RM) $(obj_cpp) $(obj_c) $(dep_cpp) $(dep_c)
	@echo $(lib_name)
	@$(RM) $(lib_name)
	@echo all object files are now removed

