NAME = distoptimFP
NAMELIB = libfispro.so
ARCHIVER= g++ -shared -o
COMPILER= g++
BIN= ../../bin
LIB_DIR = -L$(BIN)
OBJECTS= $(BIN)/maindistoptimFP.o $(BIN)/dist.o $(BIN)/distoptim.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
OBJECTSOPT = $(BIN)/algo.o $(BIN)/avect.o $(BIN)/conteneur.o $(BIN)/fib.o $(BIN)/sw.o $(BIN)/permutation.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
OBJ+=$(OBJECTSOPT)

INCLUDE = -I. -I../fisopt

# 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

ifeq ($(OS),LINUX)
ifeq ($(ARCH),x86_64)
OPT+=-fPIC
endif
endif

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

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

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

$(BIN)/$(NAME) : $(OBJECTS)  $(OBJECTSLIB) $(OBJECTSOPT) 
	$(COMPILER) -o $(BIN)/$(NAME)  $(LIB_DIR) $(OPT) $(OBJ) -lm $(LIBF) $(LIBOMP)

$(BIN)/maindistoptimFP.o : maindistoptimFP.cpp fis.h distoptim.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/maindistoptimFP.o maindistoptimFP.cpp

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

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

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

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

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

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

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

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

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

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

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

$(BIN)/algo.o : ../fisopt/algo.cpp ../fisopt/algo.h ../base/fis.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/algo.o ../fisopt/algo.cpp

$(BIN)/avect.o : ../fisopt/avect.cpp ../fisopt/avect.h ../base/fis.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/avect.o ../fisopt/avect.cpp

$(BIN)/conteneur.o : ../fisopt/conteneur.cpp ../fisopt/conteneur.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/conteneur.o ../fisopt/conteneur.cpp

$(BIN)/fib.o : ../fisopt/fib.cpp ../fisopt/algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/fib.o ../fisopt/fib.cpp

$(BIN)/sw.o : ../fisopt/sw.cpp ../fisopt/algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/sw.o ../fisopt/sw.cpp

$(BIN)/permutation.o :
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/permutation.o ../fisopt/permutation.cpp


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

allclean :
	 rm  $(OBJECTS) $(BIN)/$(NAME) $(OBJECTSLIBASE) $(OBJECTSOPT)
