##################################################
# Compiler Options                               #
##################################################
include Config

##################################################
# Names and Version Numbers                      #
##################################################
NAME          = OpenCL
LC_NAME       = opencl

MAJOR         = 0
MINOR         = 7
BUG           = 1

##################################################
# Installation Settings                          #
##################################################
INSTALLROOT   = /usr/local

LIBDIR        = $(INSTALLROOT)/lib
HEADERDIR     = $(INSTALLROOT)/include/$(LC_NAME)
DOCDIR        = $(INSTALLROOT)/share/doc/$(NAME)-$(VERSION)

OWNER         = root
GROUP         = root
DATA_MODE     = 644
EXEC_MODE     = 755

##################################################
# Functions                                      *
##################################################
# Disabled for now, maybe once GNU make 3.78+ is
# more widely distrubted...
#INSTALL       = @install -c -o $(OWNER) -g $(GROUP) -m $(1) $(2) $(3)
#LN            = $(CD) $(1); ln -fs $(2) $(3)

INSTALL        = @install -c -o $(OWNER) -g $(GROUP) -m
LN             = @ln -fs

##################################################
# Aliases for Common Programs                    #
##################################################
AR            = ar crs
CD            = @cd
ECHO          = @echo
MKDIR         = @mkdir
MKDIR_INSTALL = @umask 022; mkdir -p -m $(EXEC_MODE)
STRIP         = @strip
RM            = @rm -f
RM_R          = @rm -rf

##################################################
# General Setup                                  #
##################################################
FLAGS         = $(strip $(OPT_FLAGS) $(MACH_FLAGS) $(LANG_FLAGS) $(WARN_FLAGS))
CHECK_FLAGS   = $(FLAGS)

ifneq (,$(findstring yes,$(MAKE_SHARED)))
   LIB_FLAGS  = $(strip $(FLAGS) $(SO_OBJ_FLAGS))
else
   LIB_FLAGS  = $(FLAGS)
endif

LIBSRCS       = $(wildcard src/*.cpp)
HEADERS       = $(wildcard include/$(LC_NAME)/*.h)
CHECKSRCS     = $(wildcard checks/*.cpp)

LIBOBJS       = $(patsubst src/%.cpp,build/lib/%.o,$(LIBSRCS))
CHECKOBJS     = $(patsubst checks/%.cpp,build/checks/%.o,$(CHECKSRCS))

DOCS          = readme.txt $(wildcard doc/*.*)
USER_DOCS     = readme.txt doc/license.txt doc/thanks.txt
DEVEL_DOCS    = $(filter-out $(USER_DOCS),$(DOCS))

CHECK         = check

LIBNAME       = lib$(LC_NAME)
STATIC_LIB    = $(LIBNAME).a

VERSION       = $(MAJOR).$(MINOR).$(BUG)

ifneq (,$(findstring yes,$(MAKE_SHARED)))
SHARED_LIB    = $(LIBNAME)-$(MAJOR).$(MINOR).$(BUG).so
SONAME        = $(LIBNAME)-$(MAJOR).so

SYMLINK0      = $(LIBNAME)-$(MAJOR).$(MINOR).$(BUG).so
SYMLINK1      = $(LIBNAME)-$(MAJOR).$(MINOR).so
SYMLINK2      = $(LIBNAME)-$(MAJOR).so
SYMLINK3      = $(LIBNAME).so
SYMLINKS      = $(SYMLINK1) $(SYMLINK2) $(SYMLINK3)

LIBRARIES     = $(STATIC_LIB) $(SHARED_LIB)
else
LIBRARIES     = $(STATIC_LIB)
endif

all: $(LIBRARIES)

-include Dependencies

##################################################
# Link Commands                                  #
##################################################
$(CHECK): $(LIBRARIES) $(CHECKOBJS)
	$(CXX) $(CHECKOBJS) -L. -L/usr/local/lib -l$(LC_NAME) -o $(CHECK)
	$(STRIP) $(CHECK)
	@./$(CHECK) --validate

$(STATIC_LIB): $(LIBOBJS)
	$(RM) $(STATIC_LIB)
	$(AR) $(STATIC_LIB) $(LIBOBJS)

ifneq (,$(findstring yes,$(MAKE_SHARED)))
$(SHARED_LIB): $(LIBOBJS)
	$(CXX) $(SO_LINK_FLAGS) $(LIBOBJS) -o $(SHARED_LIB)

	$(LN) $(SYMLINK0) $(SYMLINK1)
	$(LN) $(SYMLINK1) $(SYMLINK2)
	$(LN) $(SYMLINK2) $(SYMLINK3)

#	$(call LN,.,$(SYMLINK0),$(SYMLINK1))
#	$(call LN,.,$(SYMLINK1),$(SYMLINK2))
#	$(call LN,.,$(SYMLINK2),$(SYMLINK3))
endif

##################################################
# Build Commands                                 #
##################################################
build/lib/%.o: src/%.cpp build
	$(CXX) -Iinclude/ $(LIB_FLAGS) -c $< -o $@

build/checks/%.o: checks/%.cpp build
	$(CXX) -Iinclude/ $(CHECK_FLAGS) -c $< -o $@

##################################################
# Misc Targets                                   #
##################################################
build:
	$(MKDIR) build build/lib build/checks

static: $(STATIC_LIB)

shared: $(SHARED_LIB)

##################################################
# Fake Targets                                   #
##################################################
.PHONY = clean distclean install install_user install_devel

clean:
	$(RM_R) build
	$(RM) $(LIBRARIES) $(SYMLINKS) $(CHECK)

distclean: clean
	$(RM) Config Dependencies

##################################################
# Install Scripts                                #
##################################################
install: $(LIBRARIES)
	$(ECHO) "Installing $(NAME) into $(INSTALLROOT)... "
	$(MKDIR_INSTALL) $(DOCDIR)
	$(MKDIR_INSTALL) $(HEADERDIR)
	$(MKDIR_INSTALL) $(LIBDIR)

	$(INSTALL) $(DATA_MODE) $(DOCS) $(DOCDIR)
	$(INSTALL) $(DATA_MODE) $(HEADERS) $(HEADERDIR)
	$(INSTALL) $(DATA_MODE) $(STATIC_LIB) $(LIBDIR)
#	$(call INSTALL,$(DATA_MODE),$(DOCS),$(DOCDIR))
#	$(call INSTALL,$(DATA_MODE),$(HEADERS),$(HEADERDIR))
#	$(call INSTALL,$(DATA_MODE),$(STATIC_LIB),$(LIBDIR))

ifneq (,$(findstring yes,$(MAKE_SHARED)))
	$(INSTALL) $(EXEC_MODE) $(SHARED_LIB) $(LIBDIR)
	$(CD) $(LIBDIR); $(LN) $(SYMLINK0) $(SYMLINK1)
	$(CD) $(LIBDIR); $(LN) $(SYMLINK1) $(SYMLINK2)
	$(CD) $(LIBDIR); $(LN) $(SYMLINK2) $(SYMLINK3)

#	$(call INSTALL,$(EXEC_MODE),$(SHARED_LIB),$(LIBDIR))
#	$(call LN,$(LIBDIR),$(SYMLINK0),$(SYMLINK1))
#	$(call LN,$(LIBDIR),$(SYMLINK1),$(SYMLINK2))
#	$(call LN,$(LIBDIR),$(SYMLINK2),$(SYMLINK3))
endif

install_user: $(LIBRARIES)
	$(MKDIR_INSTALL) $(DOCDIR)
	$(MKDIR_INSTALL) $(LIBDIR)

#	$(call INSTALL,$(DATA_MODE),$(USER_DOCS),$(DOCDIR))
	$(INSTALL) $(DATA_MODE) $(USER_DOCS) $(DOCDIR)

ifneq (,$(findstring yes,$(MAKE_SHARED)))
	$(INSTALL) $(EXEC_MODE) $(SHARED_LIB) $(LIBDIR)
	$(CD) $(LIBDIR); $(LN) $(SYMLINK0) $(SYMLINK1)
	$(CD) $(LIBDIR); $(LN) $(SYMLINK1) $(SYMLINK2)
	$(CD) $(LIBDIR); $(LN) $(SYMLINK2) $(SYMLINK3)

#	$(call INSTALL,$(EXEC_MODE),$(SHARED_LIB),$(LIBDIR))
#	$(call LN,$(LIBDIR),$(SYMLINK0),$(SYMLINK1))
#	$(call LN,$(LIBDIR),$(SYMLINK1),$(SYMLINK2))
#	$(call LN,$(LIBDIR),$(SYMLINK2),$(SYMLINK3))
endif

install_devel: $(LIBRARIES)
	$(MKDIR_INSTALL) $(DOCDIR)
	$(MKDIR_INSTALL) $(HEADERDIR)
	$(MKDIR_INSTALL) $(LIBDIR)
	$(INSTALL) $(DATA_MODE) $(DEVEL_DOCS) $(DOCDIR)
	$(INSTALL) $(DATA_MODE) $(HEADERS) $(HEADERDIR)
	$(INSTALL) $(DATA_MODE) $(STATIC_LIB) $(LIBDIR)

#	$(call INSTALL,$(DATA_MODE),$(DEVEL_DOCS),$(DOCDIR))
#	$(call INSTALL,$(DATA_MODE),$(HEADERS),$(HEADERDIR))
#	$(call INSTALL,$(DATA_MODE),$(STATIC_LIB),$(LIBDIR))

