#uncomment for debug mode
#DEBUG=true
NAME=fis
# OS-default=LINUX
# for win32 run OS=WIN32;make

# 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
OBJECTSGSL=-lgsl -lgslcblas
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


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

# C Compiler - make sure gcc-v returns gcc version >=3.0
CC=g++


ifndef OS
OS=LINUX
endif

# flag -DDEBUG
ifdef DEBUG
OPT=-g -DDEBUG -O0
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
OBJECTSGSL=-lgsl -lgslcblas
endif
endif

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

INCLUDE=-I../base -I../fpa -I../genfis -I../fistree -I../links -I../hfp -I../simple -I../fisopt -I../wm -I../ols -I$(INCLUDEGSL)
LIB_DIR=-L$(BIN)

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

CCFLAGS=$(INCLUDE) -Wall $(OPT)
LIB_DIR+= -L$(BIN) $(OPT)
# path for binaries
BIN=../../bin
ifeq ($(OS),WIN32)
BIN=../../bin-x86
endif
ifeq ($(OS),WIN64)
BIN=../../bin-amd64
endif

# objects
OBJECTS=$(BIN)/common.o $(BIN)/aggreg.o $(BIN)/defuz.o $(BIN)/fis.o $(BIN)/in.o $(BIN)/out.o $(BIN)/mf.o $(BIN)/rule.o $(BIN)/gensample.o $(BIN)/fpa.o $(BIN)/genfis.o $(BIN)/fistree.o $(BIN)/calctree.o $(BIN)/prune.o $(BIN)/criteria.o $(BIN)/tree.o $(BIN)/linkfis.o $(BIN)/hfpfis.o $(BIN)/hfpin.o $(BIN)/hfpintri.o $(BIN)/sethfpfis.o $(BIN)/fisimple.o $(BIN)/fiswm.o $(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 $(BIN)/ols.o $(BIN)/fisols.o $(BIN)/mfdposs.o $(BIN)/pt.o $(BIN)/testfis.o

$(BIN)/$(NAME) : $(OBJECTS) 
	echo building fis
	$(CC) $(LIB_DIR) -o $(BIN)/$(NAME) $(OBJECTS) $(OBJECTSGSL)

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

# compile common
$(BIN)/common.o : ../base/common.cpp ../base/common.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/common.o ../base/common.cpp

# compile aggreg
$(BIN)/aggreg.o : ../base/aggreg.cpp ../base/fis.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/aggreg.o ../base/aggreg.cpp

# compile defuz
$(BIN)/defuz.o : ../base/defuz.cpp ../base/defuz.h ../base/fis.h
	$(CC) -c $(CCFLAGS) -o $(BIN)/defuz.o ../base/defuz.cpp

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

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

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

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

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

# compile pt
$(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

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

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

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

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

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

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

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

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

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

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

# compile hfpfis
$(BIN)/hfpfis.o : ../hfp/hfpfis.cpp ../hfp/hfpfis.h ../hfp/hfpin.h ../base/fis.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/hfpfis.o ../hfp/hfpfis.cpp 

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

# compile hfpintri
$(BIN)/hfpintri.o : ../hfp/hfpintri.cpp ../hfp/hfpin.h ../base/fis.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h 
	$(CC) -c $(CCFLAGS) -o $(BIN)/hfpintri.o ../hfp/hfpintri.cpp 

$(BIN)/sethfpfis.o : ../hfp/sethfpfis.cpp  ../hfp/sethfpfis.h ../base/common.h ../base/common.cpp 
	$(CC) -c $(CCFLAGS) -o $(BIN)/sethfpfis.o ../hfp/sethfpfis.cpp

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

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

# compile fisopt
$(BIN)/algo.o : ../fisopt/algo.cpp ../fisopt/algo.h ../base/fis.h ../base/common.h ../base/mf.h ../base/rule.h ../base/defuz.h 
	$(CC) -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 
	$(CC) -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 
	$(CC) -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 
	$(CC) -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
	$(CC) -c $(CCFLAGS) -o $(BIN)/sw.o ../fisopt/sw.cpp

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

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

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

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

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

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

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

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

clean :
	/bin/rm -f $(BIN)/$(OBJECTS) $(BIN)/$(NAME)

cleanall :
	/bin/rm -f $(BIN)/$(OBJECTS) $(BIN)/$(NAME)

