NAME = ols
NAMELIB = libfispro.so
ARCHIVER= g++ -shared -o
BASE = ../base
BIN = ../../bin
ifeq ($(OS),WIN32)
BIN=../../bin-x86/
endif
ifeq ($(OS),WIN64)
BIN=../../bin-amd64/
endif
LIB_DIR = -L$(BIN)
COMPILER= g++
OBJECTS= $(BIN)/mainols.o $(BIN)/fisols.o $(BIN)/ols.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

# OS-default=LINUX
# for win32 run OS=WIN32;make
# or OS=WIN64;make

ifndef OS
OS=LINUX
endif


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

OBJ=$(OBJECTS)

ifeq ($(NODYN),true)
OBJ+=$(OBJECTSLIB)
else
LIBF=-lfispro
endif

# gsl package needed - dynamic library needs to be in path for linux
# for win32 -no gsl package needed - static link - libraries in
# subdirectory 
# enter path to GSL library
GSL=/usr/include
ifeq ($(OS),$(filter $(OS),WIN32 WIN64))
GSL=/e/cpp/gsl/1.8
endif
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


# 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
  
INCLUDE = -I../base -I./ -I$(INCLUDEGSL)

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


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

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

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

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

$(BIN)/$(NAMELIB) : $(OBJECTSLIB)  
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/fis.o : $(BASE)/fis.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/fis.o $(BASE)/fis.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)	

$(BIN)/in.o : $(BASE)/in.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/in.o $(BASE)/in.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/out.o : $(BASE)/out.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/out.o $(BASE)/out.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/mf.o : $(BASE)/mf.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/mf.o $(BASE)/mf.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/rule.o : $(BASE)/rule.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/rule.o $(BASE)/rule.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/defuz.o : $(BASE)/defuz.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/defuz.o $(BASE)/defuz.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/common.o : $(BASE)/common.cpp $(BASE)/common.h
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/common.o $(BASE)/common.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(BIN)/aggreg.o : $(BASE)/aggreg.cpp $(BASE)/fis.h $(BASE)/mf.h $(BASE)/rule.h $(BASE)/defuz.h $(BASE)/common.h 
	$(COMPILER) -c $(CCFLAGS) -o $(BIN)/aggreg.o $(BASE)/aggreg.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(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
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

$(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 pt.cpp
	$(ARCHIVER) $(BIN)/$(NAMELIB) $(OBJECTSLIB) -lm $(LIBOMP)

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