
#########################################################
#                                                       #
#       FuturaSoft Topfield TAP Library                 #
#       Standard Makefile to build a TAP                #
#       Version 1.00                                    #
#                                                       #
#       Copyright (c) 2015 Martin Krämer                #
#                                                       #
#########################################################

# Options
#VERBOSE = 1				# you can see the compile options
#DEBUG = 1				# compile with -g -DDEBUG
MS_EXTENSIONS = 1		# enable Microsoft extensions to C/C++
#NEED_LIB_CXX = 1		# link with C++ library
#NEED_LIB_CXX = 0		# never link with C++ library
#NEED_LIB_FIREBIRD = 1		# link with FireBird library
#NEED_LIB_FIREBIRD = 0		# never link with FireBird library
#TAP_EMU = 1				# build emulator objects
#TAP_EMU = 0				# never build emulator objects
#SHARED_LIB = 1			# link program with shared emulator library
#TAP_AUTOSTART = 1		# copy TAP to AutoStart subdirectory

# Default settings
CUR_DIR = $(abspath .)
SRC_DIR = $(CUR_DIR)
INC_DIR = $(CUR_DIR)
OBJ_DIR = $(CUR_DIR)/obj
OBJ_EMU_DIR = $(OBJ_DIR)/emu
LIB_DIR = $(CUR_DIR)/lib
LIB_EMU_DIR = $(LIB_DIR)/emu
BIN_DIR = $(CUR_DIR)/bin
BIN_EMU_DIR = $(BIN_DIR)/emu

# Auto detect object files and options
APP_NAME = $(notdir $(CUR_DIR))

OBJS := $(patsubst $(SRC_DIR)/%.c, %.o, $(wildcard $(SRC_DIR)/*.c))
CXX_OBJS := $(patsubst $(SRC_DIR)/%.cpp, %.o, $(wildcard $(SRC_DIR)/*.cpp))
ifneq ($(CXX_OBJS),)
OBJS += $(CXX_OBJS)
ifeq ($(NEED_LIB_CXX),)
NEED_LIB_CXX = 1
endif
endif

ifeq ($(NEED_LIB_FIREBIRD),)
ifneq ($(shell grep -is -m1 '^\#include\s*[<"]libFireBird\.h[>"]' *.h *.c *.cpp),)
NEED_LIB_FIREBIRD = 1
endif
endif

ifeq ($(FSTAP_DIR),)
FSTAP_DIR = /opt/fstap
ifneq ($(wildcard $(FSTAP_DIR)/),)
$(info [Auto detect FuturaSoft's tap directory at ... $(FSTAP_DIR)])
else
ifeq ($(strip $(TAP_EMU)),1)
$(error FuturaSoft's tap directory not found)
else
FSTAP_DIR =
endif
endif
endif

ifeq ($(TAP_EMU),)
ifneq ($(FSTAP_DIR),)
ifneq ($(wildcard $(FSTAP_DIR)/lib/emu/),)
TAP_EMU = 1
endif
endif
endif

# Compile options
ifeq ($(VERBOSE),)
Q = @
endif

ifneq ($(DEBUG),)
$(info [Compile with -g -DDEBUG])
MY_CFLAGS += -g -DDEBUG
endif

ifneq ($(MS_EXTENSIONS),)
$(info [Enable Microsoft extensions])
MY_CFLAGS += -fms-extensions
endif

MY_CFLAGS += -fPIC

# Include directories and libraries
INCLUDE_DIRS = $(INC_DIR) $(FSTAP_DIR)/include $(TAP_INCLUDE)
MY_CFLAGS += $(addprefix -I, $(INCLUDE_DIRS))

ifeq ($(strip $(NEED_LIB_FIREBIRD)),1)
$(info [Link with FireBird library])
LDFLAGS_MIPS += $(TAP_LIB)/libFireBird.a
endif
LDFLAGS_MIPS += $(TAP_LIB)/tapinit.o $(TAP_LIB)/libtap.so -lc
ifeq ($(strip $(NEED_LIB_CXX)),1)
$(info [Link with C++ library])
LDFLAGS_MIPS += -lstdc++ -lgcc_s
endif
LDFLAGS_MIPS += -Map $(OBJ_DIR)/$(APP_NAME).map

ifneq ($(SHARED_LIB),)
APP_LIBS_EMU = $(FSTAP_DIR)/lib/emu/libtap.so
else
STATIC_INFO = static #
endif
APP_LIBS_EMU += $(FSTAP_DIR)/lib/emu/libtap_s.a

LDFLAG_ESC = -Wl,
LDFLAGS_EMU += $(FSTAP_DIR)/lib/emu/libtap.so
LDFLAGS_EMU += $(addprefix $(LDFLAG_ESC), -Map $(OBJ_EMU_DIR)/$(APP_NAME).map)
#LDFLAGS_APP_EMU += $(APP_LIBS_EMU)
LDFLAGS_APP_EMU += $(shell pkg-config --libs gtk+-2.0) -lgmodule-2.0 -lm

# Target objects
MY_OBJS = $(addprefix $(OBJ_DIR)/, $(OBJS))
MY_OBJS_EMU = $(addprefix $(OBJ_EMU_DIR)/, $(OBJS))
MY_LIB = $(LIB_DIR)/$(APP_NAME).tap
MY_LIB_EMU = $(LIB_EMU_DIR)/$(APP_NAME).tap
MY_APP_EMU = $(BIN_EMU_DIR)/$(APP_NAME)
MY_ZIP = $(APP_NAME).zip
ifneq ($(TFDISK),)
MY_ZIP := $(TFDISK)/$(MY_ZIP)
else
MY_ZIP := $(CUR_DIR)/$(MY_ZIP)
endif

PROGRAMFILES_DIR = ProgramFiles
ifneq ($(TAP_AUTOSTART),)
PROGRAMFILES_DIR := $(PROGRAMFILES_DIR)/AutoStart
endif

# Commands
MKDIR = mkdir -p
CP = cp -f
TOUCH = touch -c
ZIP = zip

ARCH ?= mipsel-linux-uclibc
CROSS_COMPILE ?= $(ARCH)-
MIPSCC  = $(CROSS_COMPILE)gcc
MIPSCXX = $(CROSS_COMPILE)c++
MIPSLD  = $(CROSS_COMPILE)ld

# Flags
MY_CFLAGS += -DLINUX -MD -W -Wall -O2
CFLAGS += $(MY_CFLAGS)
CXXFLAGS += $(MY_CFLAGS)
ARFLAGS = -rvcsu
LDFLAGS += $(MY_LDFLAGS)

# Targets
.PHONY: all touch zip clean
.SUFFIXES:				# Delete the default suffixes
#.SECONDARY:

ifeq ($(strip $(TAP_EMU)),1)
all: $(OBJ_DIR) $(OBJ_EMU_DIR) $(LIB_DIR) $(LIB_EMU_DIR) $(BIN_DIR) $(BIN_EMU_DIR) $(MY_LIB) $(MY_LIB_EMU) $(MY_APP_EMU)
else
all: $(OBJ_DIR) $(LIB_DIR) $(BIN_DIR) $(MY_LIB)
endif

touch:
	$(info [Touch all deployable files ...])
	$(Q)$(TOUCH) -d "00:00:00" $(SRC_DIR)/* $(INC_DIR)/* $(OBJ_DIR)/* $(OBJ_EMU_DIR)/* $(LIB_DIR)/* $(LIB_EMU_DIR)/* $(BIN_DIR)/* $(BIN_EMU_DIR)/*

zip: $(MY_ZIP)

clean:
	$(info [Remove all generated files ...])
	$(Q)-$(RM) $(OBJ_DIR)/*.d $(OBJ_DIR)/*.o $(OBJ_DIR)/*.map $(OBJ_EMU_DIR)/*.d $(OBJ_EMU_DIR)/*.o $(OBJ_EMU_DIR)/*.map $(LIB_DIR)/*.tap $(LIB_EMU_DIR)/*.tap $(MY_APP_EMU) $(MY_ZIP)

$(OBJ_DIR) $(OBJ_EMU_DIR) $(LIB_DIR) $(LIB_EMU_DIR) $(BIN_DIR) $(BIN_EMU_DIR):
	$(info [Make directory ... $@])
	$(Q)$(MKDIR) $@

# Implicit rule for building local apps
%.o : %.c
	$(info [Compile ... $<])
	$(Q)$(MIPSCC) -mips32 $(CPPFLAGS) $(CFLAGS) -c $< -o $@

# Implicit rule for building local apps
%.o : %.cpp
	$(info [Compile ... $<])
	$(Q)$(MIPSCXX) -mips32 $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
	$(info [Compile ... $<])
	$(Q)$(MIPSCC) -mips32 $(CPPFLAGS) $(CFLAGS) -c $< -o $@

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
	$(info [Compile ... $<])
	$(Q)$(MIPSCXX) -mips32 $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(OBJ_EMU_DIR)/%.o : $(SRC_DIR)/%.c
	$(info [Compile for emulator ... $<])
	$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

$(OBJ_EMU_DIR)/%.o : $(SRC_DIR)/%.cpp
	$(info [Compile for emulator ... $<])
	$(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(MY_LIB): $(MY_OBJS)
	$(info [Link TAP ... $@])
	$(Q)$(MIPSLD) -shared --no-undefined --allow-shlib-undefined $+ $(LDFLAGS) $(LDFLAGS_MIPS) -o $@
    ifneq ($(TFDISK),)
	$(Q)$(CP) -v $@ $(TFDISK)/$(PROGRAMFILES_DIR)/
    endif

$(MY_LIB_EMU): $(MY_OBJS_EMU)
	$(info [Link TAP for emulator ... $@])
	$(Q)$(CC) -shared $(LDFLAG_ESC)--no-undefined $(LDFLAG_ESC)--allow-shlib-undefined $+ $(LDFLAGS) $(LDFLAGS_EMU) -o $@
    ifneq ($(TFDISK_EMU),)
	$(Q)$(CP) -v $@ $(TFDISK_EMU)/$(PROGRAMFILES_DIR)/
    endif

$(MY_APP_EMU): $(MY_OBJS_EMU) $(APP_LIBS_EMU)
	$(info [Link TAP with $(STATIC_INFO)emulator ... $@])
	$(Q)$(CC) $+ $(LDFLAGS) $(LDFLAGS_APP_EMU) -o $@

$(MY_ZIP): $(MY_LIB)
	$(info [Pack TAP with source files ... $@])
	$(Q)$(ZIP) -or $@ . -x $(patsubst $(CUR_DIR)/%, "%/*", $(OBJ_DIR) $(LIB_EMU_DIR) $(BIN_DIR)) $(patsubst $(CUR_DIR)/%, %, $(MY_ZIP)) "*.old"

# Dependency file checking (created with gcc -M command)
-include $(OBJ_DIR)/*.d $(OBJ_SO_DIR)/*.d
