# C Compiler - make sure gcc-v returns gcc version >=3.0
CC= g++
ARCHIVER= g++ -shared -o
BASE= ../base
GENFIS= ../genfis
FPAFIS= ../fpa
WMFIS= ../wm
LIB_DIR = -L$(BIN)
INCLUDE = -I$(BASE) -I$(GENFIS) -I$(FPAFIS) -I$(WMFIS)


# if NODYN flag do not use libfispro.so 
ifndef NODYN
NODYN=true
endif

ifneq ($(NODYN),true)
LIBF=-lfispro
endif

# OS-default=LINUX
# for win32 run OS=WIN32;make
ifndef OS
OS=LINUX
endif

# the arch command is only valid under Linux/UNIX
#ARCH=$(shell arch)
ARCH=$(shell uname -m)
export ARCH

# flag -DDEBUG
ifdef DEBUG
OPT=-g -DDEBUG
else
OPT=-O3 -DNDEBUG
endif

# win32
ifeq ($(OS),WIN32)
OPT+= -m32
endif
# win64
ifeq ($(OS),WIN64)
OPT+= -m64
endif

ifeq ($(OS),LINUX)
NAMELIB = libfispro.so
ifeq ($(ARCH),x86_64)
OPT+=-fPIC
endif
endif

ifeq ($(OS),$(filter $(OS),WIN32 WIN64))
NAMELIB = libfispro.a
endif

ifdef OPENMP
ifeq ($(CXX),g++)
OPT+=-fopenmp
LIBOMP=-lgomp
endif
endif

ifeq ($(OS),$(filter $(OS),WIN32 WIN64))
LIB_DIR+=-static
endif
  

CCFLAGS=$(INCLUDE) -Wall $(OPT)

# path for binaries
BIN=../../bin
ifeq ($(OS),WIN32)
BIN=../../bin-x86
endif
ifeq ($(OS),WIN64)
BIN=../../bin-amd64
endif

# objects
OBJECTSCFG= $(BIN)/mainhfpcfg.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/genfis.o  $(BIN)/fpa.o $(BIN)/fiswm.o
OBJECTSFIS= $(BIN)/mainhfpfis.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/genfis.o  $(BIN)/fpa.o $(BIN)/fiswm.o
OBJECTSVER= $(BIN)/mainhfpvertex.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/genfis.o  $(BIN)/fpa.o $(BIN)/fiswm.o
OBJECTSSEL= $(BIN)/mainhfpselect.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/genfis.o  $(BIN)/fpa.o $(BIN)/fiswm.o
OBJECTSSET=  $(BIN)/mainsethfpfis.o $(BIN)/sethfpfis.o 
OBJECTSFISSR=  $(BIN)/mainhfpfissr.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/genfis.o  $(BIN)/fpa.o $(BIN)/fiswm.o
OBJECTSSR=  $(BIN)/mainhfpsr.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/sethfpfis.o $(BIN)/genfis.o $(BIN)/fpa.o $(BIN)/fiswm.o
OBJECTSLIB= $(BIN)/fis.o $(BIN)/out.o $(BIN)/in.o $(BIN)/mf.o $(BIN)/rule.o $(BIN)/defuz.o $(BIN)/common.o $(BIN)/aggreg.o $(BIN)/mfdposs.o $(BIN)/pt.o

OBJCFG=$(OBJECTSCFG)
OBJFIS=$(OBJECTSFIS)
OBJVER=$(OBJECTSVER)
OBJSEL=$(OBJECTSSEL)
OBJSET=$(OBJECTSSET)
OBJFISSR=$(OBJECTSFISSR)
OBJSR=$(OBJECTSSR)


ifeq ($(NODYN),true)
OBJCFG+=$(OBJECTSLIB)
OBJFIS+=$(OBJECTSLIB)
OBJVER+=$(OBJECTSLIB)
OBJSEL+=$(OBJECTSLIB)
OBJSET+=$(OBJECTSLIB)
OBJFISSR+=$(OBJECTSLIB)
OBJSR+=$(OBJECTSLIB)
endif

all : $(BIN)/hfpcfg $(BIN)/hfpfis $(BIN)/hfpselect $(BIN)/hfpvertex $(BIN)/sethfpfis $(BIN)/hfpfissr $(BIN)/hfpsr


$(BIN)/hfpcfg : $(OBJCFG) $(OBJECTSLIB) 
	$(CC) -o $(BIN)/hfpcfg  $(LIB_DIR) $(OPT)   $(OBJCFG) -lm $(LIBOMP) $(LIBF)

$(BIN)/hfpfis : $(OBJFIS)  $(OBJECTSLIB)
	$(CC) -o $(BIN)/hfpfis  $(LIB_DIR) $(OPT)   $(OBJFIS) -lm $(LIBOMP) $(LIBF)

$(BIN)/hfpselect : $(OBJSEL)  $(OBJECTSLIB)
	$(CC) -o $(BIN)/hfpselect  $(LIB_DIR) $(OPT)   $(OBJSEL) -lm $(LIBOMP) $(LIBF)

$(BIN)/hfpvertex : $(OBJVER)  $(OBJECTSLIB)
	$(CC) -o $(BIN)/hfpvertex  $(LIB_DIR) $(OPT)   $(OBJVER) -lm $(LIBOMP) $(LIBF)

$(BIN)/sethfpfis : $(OBJSET)  $(OBJECTSLIB)
	$(CC) -o $(BIN)/sethfpfis  $(LIB_DIR) $(OPT)   $(OBJSET) -lm $(LIBOMP) $(LIBF)

$(BIN)/hfpfissr : $(OBJFISSR) $(OBJECTSLIB) 
	$(CC) -o $(BIN)/hfpfissr  $(LIB_DIR) $(OPT)   $(OBJFISSR) -lm $(LIBOMP) $(LIBF)

$(BIN)/hfpsr : $(OBJSR)  $(OBJECTSLIB)
	$(CC) -o $(BIN)/hfpsr  $(LIB_DIR) $(OPT)   $(OBJSR) -lm $(LIBOMP) $(LIBF)

$(BIN)/mainhfpcfg.o : mainhfpcfg.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainhfpcfg.o mainhfpcfg.cpp

$(BIN)/mainhfpfis.o : mainhfpfis.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainhfpfis.o mainhfpfis.cpp

$(BIN)/mainhfpselect.o : mainhfpselect.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainhfpselect.o mainhfpselect.cpp

$(BIN)/mainhfpvertex.o : mainhfpvertex.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainhfpvertex.o mainhfpvertex.cpp

$(BIN)/mainsethfpfis.o : mainsethfpfis.cpp  sethfpfis.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainsethfpfis.o mainsethfpfis.cpp 

$(BIN)/mainhfpfissr.o : mainhfpfissr.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainhfpfissr.o mainhfpfissr.cpp

$(BIN)/mainhfpsr.o : mainhfpsr.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainhfpsr.o mainhfpsr.cpp

$(BIN)/hfpfis.o : hfpfis.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/hfpfis.o hfpfis.cpp

$(BIN)/sethfpfis.o : sethfpfis.cpp sethfpfis.h hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/sethfpfis.o sethfpfis.cpp

$(BIN)/hfpin.o : hfpin.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/hfpin.o hfpin.cpp

$(BIN)/hfpintri.o : hfpintri.cpp hfpfis.h hfpin.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/hfpintri.o hfpintri.cpp

$(BIN)/genfis.o : $(GENFIS)/genfis.cpp $(GENFIS)/genfis.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/genfis.o $(GENFIS)/genfis.cpp

$(BIN)/fpa.o : $(FPAFIS)/fpa.cpp $(FPAFIS)/fpa.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/fpa.o $(FPAFIS)/fpa.cpp

$(BIN)/fiswm.o : $(WMFIS)/fiswm.cpp $(WMFIS)/fiswm.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/fiswm.o $(WMFIS)/fiswm.cpp

$(BIN)/$(NAMELIB) : $(OBJECTSLIB)  
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/fis.o : $(BASE)/fis.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/fis.o $(BASE)/fis.cpp

$(BIN)/in.o : $(BASE)/in.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/in.o $(BASE)/in.cpp

$(BIN)/out.o : $(BASE)/out.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/out.o $(BASE)/out.cpp

$(BIN)/mf.o : $(BASE)/mf.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mf.o $(BASE)/mf.cpp

$(BIN)/rule.o : $(BASE)/rule.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/rule.o $(BASE)/rule.cpp

$(BIN)/defuz.o : $(BASE)/defuz.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/defuz.o $(BASE)/defuz.cpp

$(BIN)/common.o : $(BASE)/common.cpp $(BASE)/common.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/common.o $(BASE)/common.cpp

$(BIN)/aggreg.o : $(BASE)/aggreg.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/aggreg.o $(BASE)/aggreg.cpp

$(BIN)/mfdposs.o : $(BASE)/mfdposs.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/mfdposs.o $(BASE)/mfdposs.cpp

$(BIN)/pt.o : $(BASE)/pt.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/pt.o $(BASE)/pt.cpp

clean : 
	rm $(OBJECTSCFG)  $(OBJECTSFIS)  $(OBJECTSVER) $(OBJECTSSEL) $(OBJECTSSET) $(OBJECTSFISSR) $(OBJECTSSR) 
	rm $(BIN)/hfpcfg $(BIN)/hfpfis $(BIN)/hfpselect $(BIN)/hfpvertex $(BIN)/sethfpfis $(BIN)/hfpfissr $(BIN)/hfpsr
