M_SRC = src/klxcodec.c src/klxcodec_utils.c src/demo.c
M_INC = include/klxcodec.h include/klxcodec_utils.h
M_INC_DIR = include
M_OBJ = $(M_SRC:%c=%o)

M_LIBNAME = libklxcodec

LDLIBS = -lm -pthread

COMPILER_DIR = out

LIBVERSION = 0.0.1
M_SOVERSION = 1

M_SO_LDFLAG=-Wl,-soname=$(M_LIBNAME).so.$(M_SOVERSION)

PREFIX ?= `pwd`/_install
INCLUDE_PATH ?= include/klxcodec
LIBRARY_PATH ?= lib

INSTALL_INCLUDE_PATH = $(DESTDIR)$(PREFIX)/$(INCLUDE_PATH)
INSTALL_LIBRARY_PATH = $(DESTDIR)$(PREFIX)/$(LIBRARY_PATH)

INSTALL ?= cp -a

# validate gcc version for use fstack-protector-strong
MIN_GCC_VERSION = "4.9"
GCC_VERSION := "`$(CC) -dumpversion`"
IS_GCC_ABOVE_MIN_VERSION := $(shell expr "$(GCC_VERSION)" ">=" "$(MIN_GCC_VERSION)")
ifeq "$(IS_GCC_ABOVE_MIN_VERSION)" "1"
    CFLAGS += -fstack-protector-strong
else
    CFLAGS += -fstack-protector
endif

# -std=c99 -pedantic
#CFLAGS += -DMAC_OS
# set env for mac --> export CFLAGS=-DMAC_OS

R_CFLAGS = -fPIC -Wall -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wc++-compat -Wundef -Wswitch-default -Wconversion -Os $(CFLAGS)
#R_CFLAGS = -fPIC  $(CFLAGS) -g

uname := $(shell sh -c 'uname -s 2>/dev/null || echo false')

#library file extensions
SHARED = so
STATIC = a

## create dynamic (shared) library on Darwin (base OS for MacOSX and IOS)
ifeq (Darwin, $(uname))
	SHARED = dylib
	M_SO_LDFLAG = ""
endif

#klxcodec library names
M_SHARED = $(M_LIBNAME).$(SHARED)
M_SHARED_VERSION = $(M_LIBNAME).$(SHARED).$(LIBVERSION)
M_SHARED_SO = $(M_LIBNAME).$(SHARED).$(M_SOVERSION)
M_STATIC = $(M_LIBNAME).$(STATIC)

SHARED_CMD = $(CC) -shared -o

.PHONY: all shared static clean install

all: create_dir shared static
create_dir: 
	mkdir -p $(COMPILER_DIR)
shared: $(M_SHARED)

static: $(M_STATIC)

.c.o:
	$(CC) -c $(R_CFLAGS) $< -o $(<:%c=%o) -I./$(M_INC_DIR)

#static libraries
#klxcodec
$(M_STATIC): $(M_OBJ)
	$(AR) rcs $(COMPILER_DIR)/$@ $<
#shared libraries .so.1.0.0
#klxcodec
$(M_SHARED_VERSION): $(M_OBJ)
	$(CC) -shared -o $(COMPILER_DIR)/$@ $^ $(M_SO_LDFLAG) $(LDFLAGS)

#objects
#klxcodec
$(M_SRC): $(M_INC)
$(M_OBJ): $(M_SRC)

#links .so -> .so.1 -> .so.1.0.0
#klxcodec todo
$(M_SHARED_SO): $(M_SHARED_VERSION)
	cd $(COMPILER_DIR) && pwd && ln -s $(M_SHARED_VERSION) $(M_SHARED_SO) 
$(M_SHARED): $(M_SHARED_SO)
#	cd $(COMPILER_DIR) && mv $(M_SHARED_VERSION) $(M_SHARED)
	cd $(COMPILER_DIR) && ln -s $(M_SHARED_SO) $(M_SHARED)
#install
#klxcodec
install-klxcodec:
	mkdir -p $(INSTALL_LIBRARY_PATH) $(INSTALL_INCLUDE_PATH)
	$(INSTALL) $(M_INC) $(INSTALL_INCLUDE_PATH)
	$(INSTALL) $(COMPILER_DIR)/$(M_SHARED) $(INSTALL_LIBRARY_PATH)
	$(INSTALL) $(COMPILER_DIR)/$(M_SHARED) $(COMPILER_DIR)/$(M_SHARED_SO) $(COMPILER_DIR)/$(M_SHARED_VERSION) $(INSTALL_LIBRARY_PATH)

install: install-klxcodec

#uninstall
#klxcodec
uninstall-klxcodec:
	$(RM) $(INSTALL_LIBRARY_PATH)/$(M_SHARED)
	$(RM) $(INSTALL_LIBRARY_PATH)/$(M_SHARED_VERSION)
	$(RM) $(INSTALL_LIBRARY_PATH)/$(M_SHARED_SO)
	rmdir $(INSTALL_LIBRARY_PATH)
	$(RM) $(INSTALL_INCLUDE_PATH)/klxcodec.h
	rmdir $(INSTALL_INCLUDE_PATH)

uninstall: uninstall-klxcodec

clean:
	$(RM) $(M_OBJ) #delete object files
	$(RM) $(COMPILER_DIR)/$(M_SHARED) $(COMPILER_DIR)/$(M_SHARED_VERSION) $(COMPILER_DIR)/$(M_SHARED_SO) $(COMPILER_DIR)/$(M_STATIC) #delete klxcodec
