###################################################################################################
## Very generic Makefile:
## It generates the object files from all cpp or cc files in a directory and links them together.
## You only have to supply it with your TARGET, LIBS, FLAGS, PATHS etc.
###################################################################################################

# ---> WHICH ENDINGS DO THE SOURCE FILES HAVE ?
ENDING_SOURCE := cpp
ENDING_HEADER := hpp

# ---> Is the target a shared lib, a static lib or a executable ?
TARGETTYPE      := executable
#TARGETTYPE      := sharedlib
#TARGETTYPE      := staticlib

# ---> The name of the shared lib, static lib or executable:
TARGETNAME      := ScanDraiD.exe
#TARGETNAME      := libMyLib.so
#TARGETNAME      := libMyLib.a
# ---> Compileroptions
CC              := gcc
CXX             := g++
CFLAGS          := -pipe -mcpu=i686 -march=i686 -O3 -fomit-frame-pointer -Wall -W -g -DDEBUG -D_REENTRANT
#CXXFLAGS        := -pipe -mcpu=i686 -march=i686 -O3 -fno-rtti -Wall -W -g -DDEBUG -D_REENTRANT
CXXFLAGS        := -pipe -O3 -fno-rtti -Wall -W -g -D_REENTRANT -DPATH2CONF=\"ScanDraiD.conf\"  #-DDEBUG
INCPATH         := -I/home/xyz/usr/include/jpeg-6b
# ---> Linkeroptions
LINK            := g++
LFLAGS          :=  # -fPIC
LIBS            := -ljpeg #-lpthread -ldl
LIBPATH         := -L/home/xyz/usr/lib64/
# ---> Options for a shared library
SHARE_LIB_FLAG  := -shared -W1,-soname,
SHARE_COMP_FLAG := -fPIC
SHARE_LINK_FLAG := -rdynamic
MAJOR           := 1
MINOR           := 0
PATCH           := 0
# ---> Dependency options
DEPS            := Makefile.dep
DEP_FLAG        := -MM
# ---> Generates object files of all *.c, *.cc, *.cpp, *.h etc. files thar are found in directory
HEADERS         := $(wildcard *.$(ENDING_HEADER))
SOURCES         := $(wildcard *.$(ENDING_SOURCE))
OBJECTS         := $(patsubst %.$(ENDING_SOURCE),%.o,$(SOURCES))
# --> Tools
LN              := ln -s
TAR             := tar -cf
GZIP            := gzip -9f
BZIP            := bzip2
RM              := rm -vf
TAGS            := ctags --extra=+q
CP              := cp -vf
LDCONFIG        := /sbin/ldconfig
RANLIB          := ranlib
AR              := ar crv

# -------------------> Do not edit <-------------------- #

ifeq ($(TARGETTYPE),sharedlib)
	LFLAGS    := $(LFAGS) $(SHARE_COMP_FLAG) $(SHARE_LINK_FLAG)
	CXXFLAGS  := $(CXXFLAGS) $(SHARE_COMP_FLAG)
	CCFLAGS   := $(CCFLAGS) $(SHARE_COMP_FLAG)
endif

# ---> Implicit rules

.SUFFIXES: .cpp .cxx .cc .C .c

.cpp.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cxx.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cc.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.C.o:
	$(CC) -c  $(CCFLAGS) $(INCPATH)  -o $@ $<
.c.o:
	$(CC) -c  $(CFLAGS) $(INCPATH)   -o $@ $<

# ---> Build rules

.PHONY : all depend objects clean proper world staticlib sharedlib executable


all : $(TARGETTYPE)

executable: $(OBJECTS)
	$(LINK) $(LFLAGS) -o $(TARGETNAME) $(OBJECTS) $(LIBPATH) $(LIBS)

sharedlib: $(OBJECTS)
	$(LINK) $(LFLAGS) $(SHARE_LIB_FLAG)$(TARGETNAME) -o $(TARGETNAME).$(MAJOR).$(MINOR).$(PATCH) $(OBJECTS) $(LIBPATH) $(LIBS)
	$(LN) $(TARGETNAME).$(MAJOR).$(MINOR).$(PATCH) $(TARGETNAME)
	#$(CP) $(TARGETNAME)* /usr/lib/
	#$(LDCONFIG)

staticlib: $(OBJECTS)
	$(AR) $(TARGETNAME) $(OBJECTS)
	$(RANLIB) $(TARGETNAME)

depend:
	$(CXX) ${INCPATH} $(DEP_FLAG) $(SOURCES) > $(DEPS)

objects: $(OBJECTS)

clean:
	$(RM) $(TARGETNAME)*
	$(RM) $(OBJECTS)
	$(RM) *.rpo
	$(RM) *.d
	$(RM) *~ core

proper: clean
	$(RM) *.a
	$(RM) *.bak
	$(RM) *.old
	$(RM) $(DEPS)
	$(RM) tags
	$(RM) *~

tags: $(HEADERS) $(SOURCES)
	$(TAGS) $(HEADERS) $(SOURCES)

world: proper tags depend all

-include $(DEPS)