NAME = superfis
COMPILER= g++
INCLUDE = -I. -I../base
BIN= ../../bin
ifeq ($(OS),WIN32)
BIN=../../bin-x86
endif
ifeq ($(OS),WIN64)
BIN=../../bin-amd64
endif
LIB_DIR = -L$(BIN)
OBJECTS= $(BIN)/main.o $(BIN)/superfis.o $(BIN)/snode.o $(BIN)/sleafnode.o $(BIN)/sparentnode.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)
	$(COMPILER) -o $(BIN)/$(NAME)  $(LIB_DIR) $(OPT) $(OBJ) -lm $(LIBF) $(LIBOMP)

$(BIN)/main.o : main.cpp superfis.h snode.h sleafnode.h sparentnode.h superfis.cpp snode.cpp sleafnode.cpp sparentnode.cpp 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/main.o main.cpp

$(BIN)/superfis.o : superfis.cpp superfis.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/superfis.o superfis.cpp

$(BIN)/snode.o : snode.cpp snode.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/snode.o snode.cpp

$(BIN)/sleafnode.o : sleafnode.cpp sleafnode.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/sleafnode.o sleafnode.cpp

$(BIN)/sparentnode.o : sparentnode.cpp sparentnode.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/sparentnode.o sparentnode.cpp

$(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 
	$(COMPILER) -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 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/pt.o ../base/pt.cpp

clean : 
	rm  $(OBJECTS) $(BIN)/$(NAME)
