CROSS_COMPILE =

CXX = $(CROSS_COMPILE)g++
CPP = $(CXX) -E
INSTALL = /usr/bin/install

LIBPATH =
CXXFLAGS = -W -Wall -O3 -fno-exceptions $(ADD_CXXFLAGS)
LDFLAGS  = 

###############################################################################

VERSION := $(shell build/print_version_str ..)

TARGET := $(shell $(CXX) -dumpmachine)
ifeq ($(TARGET),)
$(error Unable to determine compiler target)
endif

BUILDDIR = ../build/$(TARGET)

ifeq (,$(findstring clean,$(MAKECMDGOALS)))
-include $(BUILDDIR)/config.mk
endif

PROGS = hoichess hoixiangqi

ifeq ($(wildcard vhdlchess/),vhdlchess/)
include vhdlchess/Makefile.inc
endif


#
# define SOURCES, CXXFLAGS, INCLUDE, etc.
# (ADD_SOURCES can optionally be set at make command line)
#

SOURCES = $(wildcard *.cc common/*.cc) $(ADD_SOURCES)
INCLUDE = -I. -Icommon -Ilib

hoichess_SOURCES = $(SOURCES) $(wildcard chess/*.cc)
all-hoichess: override CXXFLAGS += -DHOICHESS
all-hoichess: override INCLUDE += -Ichess

hoixiangqi_SOURCES = $(SOURCES) $(wildcard xiangqi/*.cc)
all-hoixiangqi: override CXXFLAGS += -DHOIXIANGQI
all-hoixiangqi: override INCLUDE += -Ixiangqi

$(foreach p,$(PROGS),all-$(p)): override CXXFLAGS += -DVERSION='"$(VERSION)"'


ifneq (,$(findstring mingw32,$(TARGET)))
override INCLUDE += -Iwin32 -Ilib
override LDFLAGS += -static-libgcc -static-libstdc++
SOURCES += $(wildcard win32/*.cc)
SOURCES += lib/snprintf.cc lib/strtok_r.cc
BIN_SUFFIX = .exe
else
BIN_SUFFIX = 
endif

ifneq (,$(findstring sparc,$(TARGET)))
override INCLUDE += -Isparc32
ifneq (,$(shell echo '' | $(CXX) -E -dM - | grep __leonbare__))
override INCLUDE += -Isparc32/leon
SOURCES += $(wildcard sparc32/leon/*.cc)
endif
SOURCES += $(wildcard sparc32/*.cc)
SOURCES += lib/snprintf.cc
endif


ifeq ($(HAVE_READLINE),1)
override CXXFLAGS += -DHAVE_READLINE
LIBS += -lreadline
endif

ifeq ($(HAVE_PTHREAD),1)
override CXXFLAGS += -DHAVE_PTHREAD
LIBS += -lpthread
endif

ifeq ($(HAVE_GETOPT),1)
override CXXFLAGS += -DHAVE_GETOPT
else
SOURCES += lib/my_getopt.cc
endif

ifneq ($(datadir),)
override CXXFLAGS += -DDATADIR='"$(datadir)"'
endif


###############################################################################

.DEFAULT_GOAL = all

.PHONY: all
all: $(foreach p,$(PROGS),all-$(p))

.PHONY: install
install: $(foreach p,$(PROGS),install-$(p))

.PHONY: clean
clean:
	rm -rf ../build

.PHONY: maintainer-clean
maintainer-clean: clean


# auto configuration
$(BUILDDIR)/config.mk:
	mkdir -p $(dir $@)
	CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" build/configure.sh $(BUILDDIR)


#
# building targets
#

define gen_prog_rules
# object files for program
$(1)_OBJS = $$(patsubst %.cc,$$(BUILDDIR)/build-$(1)/%.o,$$($(1)_SOURCES))

# all- target
.PHONY: all-$(1)
all-$(1): $$(BUILDDIR)/$(1)$(BIN_SUFFIX)

# compile sources
$$(BUILDDIR)/build-$(1)/%.o: %.cc
	@mkdir -p $$(dir $$@)
	$$(CXX) $$(CXXFLAGS) $$(INCLUDE) -MT $$@ -MD -MF $$(patsubst %.o,%.d,$$@) -c -o $$@ $$<

# link binary
$$(BUILDDIR)/$(1)$(BIN_SUFFIX): $$($(1)_OBJS)
	@mkdir -p $$(dir $$@)
	$$(CXX) $$(CXXFLAGS) -c -o $$(BUILDDIR)/build-$(1)/version.o version.cc
	$$(CXX) $$(CXXFLAGS) $$(LDFLAGS) -o $$@ $$^ $$(LIBPATH) $$(LIBS)

# include dependencies
-include $$(patsubst %.o,%.d,$$($(1)_OBJS))

# install- target
.PHONY: install-$(1)
install-$(1): all-$(1)
	$$(INSTALL) -m 755 -D $$(BUILDDIR)/$(1)$(BIN_SUFFIX) $(DESTDIR)$(bindir)/$$(notdir $$(BUILDDIR)/$(1)$(BIN_SUFFIX))
endef

$(foreach p,$(PROGS),$(eval $(call gen_prog_rules,$(p))))


