NAME = fisopt

CC=g++

BIN= ../../bin
ifeq ($(OS),WIN32)
BIN=../../bin-x86
endif
ifeq ($(OS),WIN64)
BIN=../../bin-amd64
endif
BASE=../base
OBJECTS = $(BIN)/mainfisopt.o 
OBJECTSLIB = $(BIN)/algo.o $(BIN)/avect.o $(BIN)/conteneur.o $(BIN)/fib.o $(BIN)/sifopt.o $(BIN)/sw.o $(BIN)/optotd.o  $(BIN)/optdto.o $(BIN)/optconstraint.o  $(BIN)/optkeyutil.o $(BIN)/permutation.o
OBJECTSLIBASE= $(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

# gsl package needed - dynamic library needs to be in path for linux
# for win32 -no gsl package needed - static link - libraries in
# subdirectory 
ifeq ($(OS),$(filter $(OS),WIN32 WIN64))
# enter path to GSL library
GSL=/e/cpp/gsl/1.8
INCLUDEGSL=$(GSL)/include
ifeq ($(OS),WIN32)
OBJECTSGSL=$(GSL)/lib/libgsl.a $(GSL)/lib/libgslcblas.a
endif
ifeq ($(OS),WIN64)
OBJECTSGSL=$(GSL)/lib64/libgsl.a $(GSL)/lib64/libgslcblas.a
endif
else
OBJECTSGSL=-lgsl -lgslcblas
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=-g -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

INCLUDE = -I../base -I./

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

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

$(BIN)/$(NAME) : $(OBJECTS)  $(OBJECTSLIB) $(OBJECTSLIBASE)
	$(CC) -o $(BIN)/$(NAME)  $(LIB_DIR) $(OPT) $(OBJECTS) $(OBJECTSLIB) $(OBJECTSLIBASE) -lm $(LIBOMP)

$(BIN)/mainfisopt.o : ./mainfisopt.cpp ../base/common.h ../base/fis.h ./sifopt.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/mainfisopt.o mainfisopt.cpp

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

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

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

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

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

$(BIN)/sifopt.o : ./sifopt.cpp ./sifopt.h ./algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/sifopt.o ./sifopt.cpp

$(BIN)/optotd.o : ./optotd.cpp ./sifopt.h ./algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/optotd.o ./optotd.cpp

$(BIN)/optdto.o : ./optdto.cpp ./sifopt.h ./algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/optdto.o ./optdto.cpp

$(BIN)/optkeyutil.o : ./optkeyutil.cpp ./sifopt.h ./algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/optkeyutil.o ./optkeyutil.cpp

$(BIN)/optconstraint.o : ./optconstraint.cpp ./sifopt.h ./algo.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/optconstraint.o ./optconstraint.cpp

$(BIN)/permutation.o :
	$(CC) -c $(CCFLAGS) -o $(BIN)/permutation.o permutation.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 
	$(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) $(OBJECTSLIB) $(BIN)/$(NAME) 


