NAME = fistree
NAMELIB = libfispro.so
ARCHIVER= g++ -shared -o
INCLUDE= -I../base -I./
BIN=../../bin
ifeq ($(OS),WIN32)
BIN=../../bin-x86
endif
ifeq ($(OS),WIN64)
BIN=../../bin-amd64
endif
LIB_DIR = -L$(BIN)
CC = g++
OBJECTS= $(BIN)/maintree.o $(BIN)/calctree.o $(BIN)/fistree.o  $(BIN)/tree.o $(BIN)/prune.o $(BIN)/criteria.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


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

OBJ=$(OBJECTS)

ifeq ($(NODYN),true)
OBJ+=$(OBJECTSLIB)
else
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)
ifeq ($(ARCH),x86_64)
OPT+=-fPIC
endif
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)

$(BIN)/$(NAME) : $(OBJECTS) $(OBJECTSLIB)
	$(CC) -o $(BIN)/$(NAME) $(LIB_DIR) $(OPT)  $(OBJ) $(LIBF) -lm $(LIBOMP) 
$(BIN)/maintree.o : maintree.cpp fistree.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/maintree.o maintree.cpp

$(BIN)/calctree.o : calctree.cpp fistree.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/calctree.o calctree.cpp

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

$(BIN)/tree.o : tree.cpp fistree.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/tree.o tree.cpp

$(BIN)/prune.o : prune.cpp fistree.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/prune.o prune.cpp

$(BIN)/criteria.o : criteria.cpp fistree.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/criteria.o criteria.cpp

$(BIN)/$(NAMELIB) : $(OBJECTSLIB)  
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB)

$(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  $(OBJECTS) $(BIN)/$(NAME) 
