PACKAGE 		= @package@
NICKNAME 		= @nickname@
PROJECT_DIR 		= @project_dir@
GIT_REFERENCE_DIR	= @git_reference_dir@
CUSTOM_INSTALL_HEADERS  = @custom_install_headers@

BUILD 			= @build@
HOST 			= @host@
TARGET 			= @target@
ARCH 			= @arch@
COMPILER 		= @compiler@
TOOLCHAIN		= @toolchain@
SYSROOT 		= @sysroot@
CROSS_COMPILE 		= @cross_compile@
SHELL 			= @shell@

CFLAGS_COMMON 		= @cflags_common@
CFLAGS_DEBUG 		= @cflags_debug@
CFLAGS_CMDLINE 		= @cflags_cmdline@
CFLAGS_CONFIG 		= @cflags_config@
CFLAGS_SYSROOT 		= @cflags_sysroot@
CFLAGS_OS		= @cflags_os@
CFLAGS_SITE		= @cflags_site@
CFLAGS_PATH 		= @cflags_path@
CFLAGS_STRICT 		= @cflags_strict@
CFLAGS_UTIL 		= @cflags_util@

LDFLAGS_COMMON 		= @ldflags_common@
LDFLAGS_DEBUG 		= @ldflags_debug@
LDFLAGS_CMDLINE 	= @ldflags_cmdline@
LDFLAGS_CONFIG 		= @ldflags_config@
LDFLAGS_SYSROOT 	= @ldflags_sysroot@
LDFLAGS_PATH 		= @ldflags_path@
LDFLAGS_STRICT 		= @ldflags_strict@
LDFLAGS_UTIL 		= @ldflags_util@

PE_SUBSYSTEM 		= @pe_subsystem@
PE_IMAGE_BASE 		= @pe_image_base@
PE_CONFIG_DEFS  	= @pe_config_defs@

ELF_EH_FRAME 		= @elf_eh_frame@
ELF_HASH_STYLE 		= @elf_hash_style@
ELF_CONFIG_DEFS 	= @elf_config_defs@

PREFIX 			= @prefix@
EXEC_PREFIX 		= @exec_prefix@
BINDIR 			= @bindir@
LIBDIR 			= @libdir@
INCLUDEDIR 		= @includedir@
MANDIR 			= @mandir@
DOCDIR 			= @docdir@
LIBEXECDIR 		= @libexecdir@

NATIVE_CC 		= @native_cc@
NATIVE_OS 		= @native_os@
NATIVE_OS_BITS 		= @native_os_bits@
NATIVE_OS_UNDERSCORE	= @native_os_underscore@

USER_CC                 = @user_cc@
USER_CPP                = @user_cpp@
USER_CXX                = @user_cxx@

ALL_SHARED              = @all_shared@
ALL_STATIC              = @all_static@
DISABLE_SHARED          = @disable_shared@
DISABLE_STATIC          = @disable_static@

all:
install:
shared:
static:

install-extras:
install-app-extras:

include $(PROJECT_DIR)/sysinfo/host/$(HOST).mk
include $(PROJECT_DIR)/sysinfo/compiler/$(COMPILER).mk
include $(PROJECT_DIR)/sysinfo/toolchain/$(TOOLCHAIN).mk

include $(PROJECT_DIR)/project/defs.mk
include $(PROJECT_DIR)/project/version.mk
include $(PROJECT_DIR)/project/custom.mk

include $(PROJECT_DIR)/project/tree.mk
include $(PROJECT_DIR)/project/depends.mk
include $(PROJECT_DIR)/project/headers.mk
include $(PROJECT_DIR)/project/common.mk
include $(PROJECT_DIR)/project/arch.mk
include $(PROJECT_DIR)/project/extras.mk
include $(PROJECT_DIR)/project/overrides.mk



$(APP_SRCS:%.c=%.o): CFLAGS_STATIC = $(CFLAGS_APP)

src/%.lo: 	$(PROJECT_DIR)/src/%.c $(ALL_HEADERS) host.tag dirs.tag version.tag
		$(CC) -c -o $@ $< $(CFLAGS_SHARED)

src/%.o: 	$(PROJECT_DIR)/src/%.c $(ALL_HEADERS) host.tag dirs.tag version.tag
		$(CC) -c -o $@ $< $(CFLAGS_STATIC)

lib/%$(OS_LIB_SUFFIX)$(VER_XYZ):
		$(CC) -shared -o $@ $^ $(LDFLAGS_SHARED)

lib/%$(OS_ARCHIVE_EXT):
		rm -f $@
		$(AR) rcs $@ $^



all:		package-shared package-static app

install:	install-app
install:	install-extras
install:	install-libs

app:		package-app app-tag

app-tag:	package-app app.tag

app.tag:
		cp $(PACKAGE_APP) $(APP)
		touch app.tag

install-libs:	package-install-shared
install-libs:	package-install-static

install-headers-default:
		mkdir -p $(DESTDIR)$(INCLUDEDIR)/$(PACKAGE)
		cp $(API_HEADERS) $(DESTDIR)$(INCLUDEDIR)/$(PACKAGE)

install-shared:	shared install-lib install-soname install-solink install-implib
install-shared: install-headers

install-lib:	shared
		mkdir -p $(DESTDIR)$(LIBDIR)
		cp $(SHARED_LIB) $(DESTDIR)$(LIBDIR)

install-static:	static install-headers
		mkdir -p $(DESTDIR)$(LIBDIR)
		cp $(STATIC_LIB) $(DESTDIR)$(LIBDIR)

install-app:	app install-app-extras
		mkdir -p $(DESTDIR)$(BINDIR)
		cp $(APP) $(DESTDIR)$(BINDIR)

install-static-app:	static-app install-app-extras
			mkdir -p $(DESTDIR)$(BINDIR)
			cp $(STATIC_APP) $(DESTDIR)$(BINDIR)/$(NICKNAME)$(OS_APP_SUFFIX)



shared:		shared-lib shared-soname shared-solink implib

static:		static-lib

shared-lib:	shared-objs $(SHARED_LIB)

shared-soname:	shared-lib $(SHARED_SONAME)

shared-solink:	shared-lib $(SHARED_SOLINK)

static-lib:	static-objs $(STATIC_LIB)



default-app:	version.tag static-objs $(DEFAULT_APP)

shared-app:	version.tag shared $(SHARED_APP)

static-app:	version.tag static-objs $(STATIC_APP)



shared-objs:	dirs $(SHARED_OBJS)

static-objs:	dirs $(STATIC_OBJS)

app-objs:	dirs $(APP_OBJS)



$(SHARED_LIB):	$(SHARED_OBJS)

$(STATIC_LIB):	$(STATIC_OBJS)

$(APP):		$(PACKAGE_APP)

$(DEFAULT_APP):	$(STATIC_OBJS) $(APP_OBJS)
		rm -f app.tag
		$(CC) -o $@ $^ $(LDFLAGS_APP)

$(SHARED_APP):	$(SHARED_LIB) $(APP_OBJS)
		rm -f app.tag
		$(CC) -o $@ $(APP_OBJS) -l$(PACKAGE) $(LDFLAGS_SHARED)

$(STATIC_APP):	$(STATIC_OBJS) $(APP_OBJS)
		rm -f app.tag
		$(CC) -static -o $@ $^ -l$(PACKAGE) $(LDFLAGS_STATIC)


dirs: 		dirs.tag tree.tag

dirs.tag:
		mkdir -p bin
		mkdir -p lib
		touch dirs.tag

host.tag:	Makefile
		$(PROJECT_DIR)/sysinfo/host/host.sh --compiler="$(CC)" --cflags="$(CFLAGS)"
		touch host.tag

version.tag:	$(GIT_REFERENCE_DIR)
		$(PROJECT_DIR)/sysinfo/version.sh	\
			-s $(PROJECT_DIR)		\
			-o build/$(PACKAGE)_version.h	\
			-p $(PACKAGE)
		touch version.tag

distclean:	clean
		rm -f Makefile

clean:		clean-implib
		rm -f tree.tag
		rm -f dirs.tag
		rm -f host.tag
		rm -f version.tag
		rm -f app.tag
		rm -f $(SHARED_OBJS)
		rm -f $(STATIC_OBJS)
		rm -f $(APP_OBJS)
		rm -f $(SHARED_LIB)
		rm -f $(SHARED_SONAME)
		rm -f $(SHARED_SOLINK)
		rm -f $(STATIC_LIB)
		rm -f $(APP)
		rm -f $(DEFAULT_APP)
		rm -f $(SHARED_APP)
		rm -f $(STATIC_APP)


.display:	.display-project .display-env .display-tools .display-flags \
		.display-pe .display-elf .display-dirs .display-build \
		.display-config

.conf:		PAGER ?= less
.conf:
		$(MAKE) .display | $(PAGER)

.display-project:
		@echo PACKAGE:'                '$(PACKAGE)
		@echo NICKNAME:'               '$(NICKNAME)
		@echo PROJECT_DIR:'            '$(PROJECT_DIR)
		@echo BUILD_DIR:'              '$(CURDIR)
		@echo

.display-env:
		@echo BUILD:'                  '$(BUILD)
		@echo HOST:'                   '$(HOST)
		@echo TARGET:'                 '$(TARGET)
		@echo ARCH:'                   '$(ARCH)
		@echo COMPILER:'               '$(COMPILER)
		@echo TOOLCHAIN:'              '$(TOOLCHAIN)
		@echo SYSROOT:'                '$(SYSROOT)
		@echo CROSS_COMPILE:'          '$(CROSS_COMPILE)
		@echo SHELL:'                  '$(SHELL)
		@echo

.display-tools:
		@echo CC:'                     '$(CC)
		@echo CPP:'                    '$(CPP)
		@echo CXX:'                    '$(CXX)
		@echo
		@echo AS:'                     '$(AS)
		@echo AR:'                     '$(AR)
		@echo LD:'                     '$(LD)
		@echo NM:'                     '$(NM)
		@echo OBJDUMP:'                '$(OBJDUMP)
		@echo RANLIB:'                 '$(RANLIB)
		@echo SIZE:'                   '$(SIZE)
		@echo STRIP:'                  '$(STRIP)
		@echo STRINGS:'                '$(STRINGS)
		@echo
		@echo ADDR2LINE:'              '$(ADDR2LINE)
		@echo COV:'                    '$(COV)
		@echo CXXFILT'                 '$(CXXFILT)
		@echo ELFEDIT:'                '$(ELFEDIT)
		@echo OBJCOPY:'                '$(OBJCOPY)
		@echo READELF:'                '$(READELF)
		@echo

.display-flags:
		@echo CFLAGS_COMMON:'          '$(CFLAGS_COMMON)
		@echo CFLAGS_DEBUG:'           '$(CFLAGS_DEBUG)
		@echo CFLAGS_VERSION:'         '$(CFLAGS_VERSION)
		@echo CFLAGS_CMDLINE:'         '$(CFLAGS_CMDLINE)
		@echo CFLAGS_CONFIG:'          '$(CFLAGS_CONFIG)
		@echo CFLAGS_SYSROOT:'         '$(CFLAGS_SYSROOT)
		@echo CFLAGS_OS:'              '$(CFLAGS_OS)
		@echo CFLAGS_SITE:'            '$(CFLAGS_SITE)
		@echo CFLAGS_PATH:'            '$(CFLAGS_PATH)
		@echo CFLAGS_STRICT:'          '$(CFLAGS_STRICT)
		@echo CFLAGS_UTIL:'            '$(CFLAGS_UTIL)
		@echo
		@echo LDFLAGS_COMMON:'         '$(LDFLAGS_COMMON)
		@echo LDFLAGS_DEBUG:'          '$(LDFLAGS_DEBUG)
		@echo LDFLAGS_CMDLINE:'        '$(LDFLAGS_CMDLINE)
		@echo LDFLAGS_CONFIG:'         '$(LDFLAGS_CONFIG)
		@echo LDFLAGS_SYSROOT:'        '$(LDFLAGS_SYSROOT)
		@echo LDFLAGS_PATH:'           '$(LDFLAGS_PATH)
		@echo LDFLAGS_STRICT:'         '$(LDFLAGS_STRICT)
		@echo LDFLAGS_UTIL:'           '$(LDFLAGS_UTIL)
		@echo

.display-pe:
		@echo PE_SUBSYSTEM:'           '$(PE_SUBSYSTEM)
		@echo PE_IMAGE_BASE:'          '$(PE_IMAGE_BASE)
		@echo PE_CONFIG_DEFS:'         '$(PE_CONFIG_DEFS)
		@echo

.display-elf:
		@echo ELF_EH_FRAME:'           '$(ELF_EH_FRAME)
		@echo ELF_HASH_STYLE:'         '$(ELF_HASH_STYLE)
		@echo ELF_CONFIG_DEFS:'        '$(ELF_CONFIG_DEFS)
		@echo

.display-dirs:
		@echo PREFIX:'                 '$(PREFIX)
		@echo EXEC_PREFIX:'            '$(EXEC_PREFIX)
		@echo BINDIR:'                 '$(BINDIR)
		@echo LIBDIR:'                 '$(LIBDIR)
		@echo INCLUDEDIR:'             '$(INCLUDEDIR)
		@echo MANDIR:'                 '$(MANDIR)
		@echo DOCDIR:'                 '$(DOCDIR)
		@echo LIBEXECDIR:'             '$(LIBEXECDIR)
		@echo

.display-build:
		@echo NATIVE_CC:'              '$(NATIVE_CC)
		@echo NATIVE_OS:'              '$(NATIVE_OS)
		@echo NATIVE_OS_BITS:'         '$(NATIVE_OS_BITS)
		@echo NATIVE_OS_UNDERSCORE:'   '$(NATIVE_OS_UNDERSCORE)
		@echo
		@echo USER_CC:'                '$(USER_CC)
		@echo USER_CPP:'               '$(USER_CPP)
		@echo USER_CXX:'               '$(USER_CXX)
		@echo

.display-config:
		@echo ALL_SHARED:'             '$(ALL_SHARED)
		@echo ALL_STATIC:'             '$(ALL_STATIC)
		@echo DISABLE_SHARED:'         '$(DISABLE_SHARED)
		@echo DISABLE_STATIC:'         '$(DISABLE_STATIC)

.display-host:
		@$(CC) $(CFLAGS) -dumpmachine

.display-cc:
		@echo $(CC)

.display-cflags:
		@echo $(CFLAGS)


.PHONY:		all install shared static app \
		package-app \
		shared-objs shared-lib \
		static-objs static-lib \
		default-app shared-app static-app \
		install-shared install-static \
		install-headers install-app \
		clean distclean clean-implib version \
		.display .conf \
		.display-project .display-env .display-tools .display-flags \
		.display-pe .display-elf .display-dirs .display-build \
		implib implib-ver implib-soname implib-solink \
		install-implib install-implib-ver \
		install-implib-soname install-implib-solink