UNAME =$(shell uname -s)

REDHAT_RELEASE = $(if $(wildcard /etc/redhat-release), -DREDHAT_RELEASE)

LINKER = ar cru
CXX = g++
TARGET = libvm.a
DBG := $(UNAME)/dbg/$(TARGET)
OPT := $(UNAME)/opt/$(TARGET)

PLATFORM := $(top_srcdir)/os/$(UNAME)/platform_sticky_flag

NON_ORP_NATIVE_LIBS = #-DNON_ORP_NATIVE_LIBS
OLD_VERSION_CLASSPATH = #-DOLD_VERSION_CLASSPATH
LINUX_TLS_OPT = -DLINUX_TLS_OPT
USE_SEGMENT = #-DUSE_SEGMENT #see os/linux/include/platform.h for detail
MONITOR_STO = #-DMONITOR_STO
OLV2 = -DOBJECT_LOCK_V2 
LAZY_LOCK = -DLAZY_LOCK
CONCURRENCY_ANALYSIS = #-DCONCURRENCY_ANALYSIS

GC = V2
ifeq ($(GC), V1)
	GC_MODULE = gc
else
	GC_MODULE = gc_v2
    GC_OPTIONS = -DGC_REWORK
endif


CPP_DEFINES = -DORP_POSIX -D_REENTRANT -D__SMP__ \
	$(CONCURRENCY_ANALYSIS) \
	$(OLV2) $(LAZY_LOCK)\
	$(REDHAT_RELEASE) \
	$(LINUX_TLS_OPT) $(USE_SEGMENT) \
	$(MONITOR_STO) \
	$(OLD_VERSION_CLASSPATH) \
	$(GC_OPTIONS) \
    $(NON_ORP_NATIVE_LIBS)

CPPFLAGS = $(CPP_DEFINES) $(CPP_EXTRAS)

DBG_CPPFLAGS = -D_DEBUG -DORP_STATS -DSIGNAL_DEBUG
DBG_CXXFLAGS = -w -g -O0
OPT_CPPFLAGS = -DNDEBUG
OPT_CXXFLAGS = -w -O

DBGOBJ := $(SOURCES:%.cpp=$(UNAME)/dbg/%.o)
OPTOBJ := $(SOURCES:%.cpp=$(UNAME)/opt/%.o)
DBGDEP := $(SOURCES:%.cpp=$(UNAME)/dbg/dep/%.d)
OPTDEP := $(SOURCES:%.cpp=$(UNAME)/opt/dep/%.d)
DBG_READY_DEPS := $(wildcard $(DBGDEP))
OPT_READY_DEPS := $(wildcard $(OPTDEP))
DBG_MISSED_DEPS := $(filter-out $(DBG_READY_DEPS), $(DBGDEP))
OPT_MISSED_DEPS := $(filter-out $(OPT_READY_DEPS), $(OPTDEP))


.PHONY: all clean dbg opt

all: dbg opt

clean: 
	@(!(test -e $(UNAME))&&(echo Already cleaned.))|| (rm -fr $(UNAME); echo rm -fr $(UNAME))

dbg: $(DBG)
$(DBG): $(DBG_MISSED_DEPS) $(DBGOBJ)
	@test -x $(UNAME)/dbg || mkdir -p $(UNAME)/dbg
	@test -x $(UNAME)/dbg/dep || mkdir -p $(UNAME)/dbg/dep
	$(LINKER) $@ $(DBGOBJ) $(LDFLAGS)

opt: $(OPT)
$(OPT): $(OPT_MISSED_DEPS) $(OPTOBJ)
	@test -x $(UNAME)/opt || mkdir -p $(UNAME)/opt
	@test -x $(UNAME)/opt/dep || mkdir -p $(UNAME)/opt/dep
	$(LINKER) $@ $(OPTOBJ) $(LDFLAGS)

$(UNAME)/dbg/%.o: %.cpp $(PLATFORM)
	@test -x $(UNAME)/dbg || mkdir -p $(UNAME)/dbg
	$(CXX) -c $(DBG_CXXFLAGS) $(DBG_CPPFLAGS) $(CPPFLAGS) $(INCLUDES) $< -o $@

$(UNAME)/opt/%.o: %.cpp $(PLATFORM)
	@test -x $(UNAME)/opt || mkdir -p $(UNAME)/opt
	$(CXX) -c $(OPT_CXXFLAGS) $(OPT_CPPFLAGS) $(CPPFLAGS) $(INCLUDES) $< -o $@

$(UNAME)/dbg/dep/%.d: %.cpp $(PLATFORM)
	@test -x $(UNAME)/dbg || mkdir -p $(UNAME)/dbg
	@test -x $(UNAME)/dbg/dep || mkdir -p $(UNAME)/dbg/dep
	@!(test -e $@) || rm -f $@
	$(CXX) -w -MM $(CPPFLAGS) $(DBG_CPPFLAGS) $(INCLUDES) $< \
	| sed 's|$*\.o[ :]*|$@ $(UNAME)/dbg/$*.o : |g' > $@

$(UNAME)/opt/dep/%.d: %.cpp $(PLATFORM)
	@test -x $(UNAME)/opt || mkdir -p $(UNAME)/opt
	@test -x $(UNAME)/opt/dep || mkdir -p $(UNAME)/opt/dep
	@!(test -e $@) || rm -f $@
	$(CXX) -w -MM $(CPPFLAGS) $(OPT_CPPFLAGS) $(INCLUDES) $< \
	| sed 's|$*\.o[ :]*|$@ $(UNAME)/opt/$*.o : |g' > $@

ifeq ($(MAKECMDGOALS), dbg)
-include $(DBGDEP)
else
ifeq ($(MAKECMDGOALS), opt)
-include $(OPTDEP)
endif
endif

$(PLATFORM):
	if [ $(UNAME) = "Linux" ]; then \
		test -L $(top_srcdir)/os/Linux || ln -sfn linux $(top_srcdir)/os/Linux;\
        touch $(top_srcdir)/os/Linux/platform_sticky_flag; \
	elif echo $(UNAME) | grep -qi bsd; then \
		test -L $(top_srcdir)/os/$(UNAME) || ln -sfn bsd $(top_srcdir)/os/$(UNAME);\
        touch $(top_srcdir)/os/$(UNAME)/platform_sticky_flag; \
	fi
