########################################
# 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
oautils_ver ?=0.0.1
oautils_build=`date +%Y/%m/%dT%H:%M:%S%z`
OPT_OAUTILS_VER=-DOA_VERSION=$(oautuls_ver)
OPT_OAUTILS_BUILD=-DOA_BUILD=$(oautils_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_OAUTILS_VER) $(OPT_OAUTILS_BUILD)

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

# utils
OAHU_UTILS_INC_PATH = -I../utils

# Compilation Options
CC  = 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) $(OAHU_UTILS_INC_PATH)

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

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

OAUTILS_SRC	= oaUtils.c
OAUTILS_OBJ	= $(OAUTILS_SRC:%.c=$(BUILD_DIR)/%.o)
LIB_OAUTILS=liboautils.a

########################################
# Build Files (mostly for cleanup)
SOURCES	= $(OAUTILS_SRC)
OBJECTS	= $(OAUTILS_OBJ)

#DEPENDS = $(BUILD_DIR)/*.d
DEPENDS = $(OAUTILS_SRC:%.c=$(BUILD_DIR)/%.d)

BINARIES = $(OUTPUT_DIR)/$(LIB_OAUTILS)

CLEANUP = gmon.out
# dSYMs : XCode debug symbol file folders
#DSYMS   = $(BINARIES:%=%.dSYM)
#RM_DSYMS = rm -rf $(DSYMS)

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

all: $(BINARIES)

-include $(DEPENDS)

# build liboautils library
$(OUTPUT_DIR)/$(LIB_OAUTILS): $(OAUTILS_OBJ)
	@echo building $@...
	$(AR) rcs $@ $(OAUTILS_OBJ)
	ranlib $@

# rule: build object files from source files
$(BUILD_DIR)/%.o :%.c
	@echo compiling $<...
	$(CXX) $(CFLAGS) $(INC_PATHS) -c $< -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; $(CC) -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) $(BINARIES) $(DEPENDS)
#	$(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
