#
#Makefile
#

VERSION      = 0.8

OWS          = openwebspider

OWSSOURCE    = openwebspider-0.8.c

UNAME_S := $(shell uname -s)
UNAME_M := $(shell uname -m 2>/dev/null || uname -p 2>/dev/null || echo unknown)
DEFAULT_PREFIX := $(if $(filter AIX,$(UNAME_S)),/opt/freeware,$(if $(filter OS400,$(UNAME_S)),/QOpenSys/pkgs,/usr/local))

PREFIX       ?= $(DEFAULT_PREFIX)
BINDIR       ?= $(PREFIX)/bin
LIBDIR       ?= $(PREFIX)/lib/openwebspider
SYSCONFDIR   ?= $(PREFIX)/etc/openwebspider
INSTALL      ?= install
INSTALL_PROGRAM ?= $(INSTALL) -m 755
INSTALL_DATA ?= $(INSTALL) -m 644
MKDIR_P      ?= mkdir -p

CC            ?= cc
PKG_CONFIG   ?= pkg-config
COMMON_CFLAGS ?= -Wall -O2
PIC_CFLAGS    ?= -fPIC
MOD_CFLAGS    ?= -g $(PIC_CFLAGS)
CONFIG_CFLAGS = -DOWS_SYSCONFDIR=\"$(SYSCONFDIR)\"
BREW_PREFIX ?= $(shell command -v brew >/dev/null 2>&1 && brew --prefix 2>/dev/null || if [ -d /opt/homebrew ]; then echo /opt/homebrew; elif [ -d /usr/local/Homebrew ] || [ -d /usr/local/Cellar ]; then echo /usr/local; fi)
ifeq ($(BREW_PREFIX),)
BREW_PKG_CONFIG_PATH =
else
BREW_PKG_CONFIG_PATH = $(BREW_PREFIX)/opt/mariadb-connector-c/lib/pkgconfig:$(BREW_PREFIX)/opt/openssl@3/lib/pkgconfig:$(BREW_PREFIX)/opt/zlib/lib/pkgconfig:$(BREW_PREFIX)/lib/pkgconfig
endif
ifeq ($(UNAME_S), Darwin)
ifneq ($(BREW_PKG_CONFIG_PATH),)
PKG_CONFIG_ENV = PKG_CONFIG_PATH="$(BREW_PKG_CONFIG_PATH):$(PKG_CONFIG_PATH)"
else
PKG_CONFIG_ENV =
endif
else ifeq ($(UNAME_S), FreeBSD)
PKG_CONFIG_ENV = PKG_CONFIG_PATH="$(LOCALBASE)/libdata/pkgconfig:$(LOCALBASE)/lib/pkgconfig:$(PKG_CONFIG_PATH)"
else ifeq ($(UNAME_S), OpenBSD)
PKG_CONFIG_ENV = PKG_CONFIG_PATH="$(LOCALBASE)/lib/pkgconfig:$(PKG_CONFIG_PATH)"
else ifeq ($(UNAME_S), NetBSD)
PKG_CONFIG_ENV = PKG_CONFIG_PATH="$(LOCALBASE)/lib/pkgconfig:$(LOCALBASE)/libdata/pkgconfig:$(PKG_CONFIG_PATH)"
else ifeq ($(UNAME_S), AIX)
PKG_CONFIG_ENV = PKG_CONFIG_PATH="$(LOCALBASE)/lib/pkgconfig:$(LOCALBASE)/lib64/pkgconfig:$(LOCALBASE)/share/pkgconfig:$(PKG_CONFIG_PATH)"
else ifeq ($(UNAME_S), OS400)
PKG_CONFIG_ENV = PKG_CONFIG_PATH="$(LOCALBASE)/lib/pkgconfig:$(LOCALBASE)/lib64/pkgconfig:$(LOCALBASE)/share/pkgconfig:$(PKG_CONFIG_PATH)"
else
PKG_CONFIG_ENV =
endif
MYSQL_CFLAGS  = $(shell $(PKG_CONFIG_ENV) $(PKG_CONFIG) --cflags libmariadb 2>/dev/null || $(PKG_CONFIG_ENV) $(PKG_CONFIG) --cflags mariadb 2>/dev/null || mysql_config --cflags 2>/dev/null || mariadb_config --cflags 2>/dev/null)
MYSQL_LIBS    = $(shell $(PKG_CONFIG_ENV) $(PKG_CONFIG) --libs libmariadb 2>/dev/null || $(PKG_CONFIG_ENV) $(PKG_CONFIG) --libs mariadb 2>/dev/null || mysql_config --libs 2>/dev/null || mariadb_config --libs 2>/dev/null)
OPENSSL_CFLAGS = $(shell $(PKG_CONFIG_ENV) $(PKG_CONFIG) --cflags openssl 2>/dev/null)
OPENSSL_LIBS   = $(shell $(PKG_CONFIG_ENV) $(PKG_CONFIG) --libs openssl 2>/dev/null || echo -lssl -lcrypto)
ZLIB_LIBS      = $(shell $(PKG_CONFIG_ENV) $(PKG_CONFIG) --libs zlib 2>/dev/null || echo -lz)
MYSQLSHIM	= $(shell if [ ! -f /usr/include/mysql/mysql.h ] && [ -f /usr/include/mariadb/mysql.h ]; then mkdir -p /tmp/ows-include/mysql && ln -sf /usr/include/mariadb/mysql.h /tmp/ows-include/mysql/mysql.h && echo -I/tmp/ows-include; fi)
ASANFLAGS    = -fsanitize=address -fno-omit-frame-pointer -g -O1

IS_WINDOWS := $(findstring MINGW,$(UNAME_S))$(findstring MSYS,$(UNAME_S))$(findstring CYGWIN,$(UNAME_S))
WINDOWS_BITS := $(shell getconf LONG_BIT 2>/dev/null || echo 32)
LOCALBASE ?= $(if $(filter NetBSD,$(UNAME_S)),/usr/pkg,$(if $(filter AIX,$(UNAME_S)),/opt/freeware,$(if $(filter OS400,$(UNAME_S)),/QOpenSys/pkgs,/usr/local)))
PTHREAD_FLAGS ?= -pthread
ifeq ($(UNAME_S), Linux)
LIBS = $(MYSQL_LIBS) -lpthread -ldl $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .so
EXEEXT =
REGEXFILTER_SONAME = -Wl,-soname,regexFilter$(EXT).0
MOD_PDF_SONAME = -Wl,-soname,mod_pdf$(EXT).0
MOD_IMAGE_SONAME = -Wl,-soname,mod_image$(EXT).0
MOD_VIDEO_SONAME = -Wl,-soname,mod_video$(EXT).0
SHARED = -shared
MODULE_LDFLAGS =
EXPORT_DYNAMIC = -rdynamic
CFLAGS_EXTRA = $(if $(filter s390x s390,$(UNAME_M)),-DOWS_IBM_Z,)
else ifeq ($(UNAME_S), Darwin)
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) -lpthread $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .dylib
EXEEXT =
REGEXFILTER_SONAME =
MOD_PDF_SONAME =
MOD_IMAGE_SONAME =
MOD_VIDEO_SONAME =
SHARED = -bundle
MODULE_LDFLAGS = -undefined dynamic_lookup
EXPORT_DYNAMIC = -Wl,-export_dynamic
CFLAGS_EXTRA = -D_DARWIN_C_SOURCE
else ifeq ($(UNAME_S), FreeBSD)
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) $(PTHREAD_FLAGS) $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .so
EXEEXT =
REGEXFILTER_SONAME = -Wl,-soname,regexFilter$(EXT).0
MOD_PDF_SONAME = -Wl,-soname,mod_pdf$(EXT).0
MOD_IMAGE_SONAME = -Wl,-soname,mod_image$(EXT).0
MOD_VIDEO_SONAME = -Wl,-soname,mod_video$(EXT).0
SHARED = -shared
MODULE_LDFLAGS =
EXPORT_DYNAMIC = -Wl,-E
CFLAGS_EXTRA = -D_BSD_SOURCE
else ifeq ($(UNAME_S), OpenBSD)
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) $(PTHREAD_FLAGS) $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .so
EXEEXT =
REGEXFILTER_SONAME = -Wl,-soname,regexFilter$(EXT).0
MOD_PDF_SONAME = -Wl,-soname,mod_pdf$(EXT).0
MOD_IMAGE_SONAME = -Wl,-soname,mod_image$(EXT).0
MOD_VIDEO_SONAME = -Wl,-soname,mod_video$(EXT).0
SHARED = -shared
MODULE_LDFLAGS =
EXPORT_DYNAMIC = -Wl,-E
CFLAGS_EXTRA =
else ifeq ($(UNAME_S), NetBSD)
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) $(PTHREAD_FLAGS) $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .so
EXEEXT =
REGEXFILTER_SONAME = -Wl,-soname,regexFilter$(EXT).0
MOD_PDF_SONAME = -Wl,-soname,mod_pdf$(EXT).0
MOD_IMAGE_SONAME = -Wl,-soname,mod_image$(EXT).0
MOD_VIDEO_SONAME = -Wl,-soname,mod_video$(EXT).0
SHARED = -shared
MODULE_LDFLAGS =
EXPORT_DYNAMIC = -Wl,-E
CFLAGS_EXTRA =
else ifeq ($(UNAME_S), AIX)
OBJECT_MODE ?= 64
export OBJECT_MODE
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) $(PTHREAD_FLAGS) -ldl $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .so
EXEEXT =
REGEXFILTER_SONAME =
MOD_PDF_SONAME =
MOD_IMAGE_SONAME =
MOD_VIDEO_SONAME =
SHARED ?= -shared
MODULE_LDFLAGS = -Wl,-G -Wl,-brtl -Wl,-bexpall
EXPORT_DYNAMIC = -Wl,-brtl -Wl,-bexpall
CFLAGS_EXTRA = -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES
else ifeq ($(UNAME_S), OS400)
OBJECT_MODE ?= 64
export OBJECT_MODE
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) $(PTHREAD_FLAGS) -ldl $(OPENSSL_LIBS) $(ZLIB_LIBS)
EXT = .so
EXEEXT =
REGEXFILTER_SONAME =
MOD_PDF_SONAME =
MOD_IMAGE_SONAME =
MOD_VIDEO_SONAME =
SHARED ?= -shared
MODULE_LDFLAGS = -Wl,-G -Wl,-brtl -Wl,-bexpall
EXPORT_DYNAMIC = -Wl,-brtl -Wl,-bexpall
CFLAGS_EXTRA = -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -DOWS_IBM_I_PASE
else ifneq ($(IS_WINDOWS),)
MYSQL_CFLAGS = -I/usr/include/mysql
MYSQL_LIBS = -L/usr/lib -lmysqlclient
MYSQLSHIM =
LIBS = $(MYSQL_LIBS) -lws2_32 $(OPENSSL_LIBS)
EXT = .dll
EXEEXT = .exe
REGEXFILTER_SONAME =
MOD_PDF_SONAME =
MOD_IMAGE_SONAME =
MOD_VIDEO_SONAME =
SHARED = -shared
MODULE_LDFLAGS =
EXPORT_DYNAMIC =
CFLAGS_EXTRA = -DWIN32 -D_WIN32
ifeq ($(WINDOWS_BITS),64)
CFLAGS_EXTRA += -D_WIN64
endif
else
$(error Unsupported platform "$(UNAME_S)"; set UNAME_S=Linux, Darwin, FreeBSD, OpenBSD, NetBSD, AIX, OS400, or a supported Windows POSIX shell)
endif


all: openwebspider mod_regexfilter mod_pdf mod_image mod_video

core: openwebspider

macos: all
freebsd: all
openbsd: all
netbsd: all
ibmz: all
aix: all
ibmi: all

print-platform:
	@echo "UNAME_S=$(UNAME_S)"
	@echo "UNAME_M=$(UNAME_M)"
	@echo "PREFIX=$(PREFIX)"
	@echo "LOCALBASE=$(LOCALBASE)"
	@echo "SYSCONFDIR=$(SYSCONFDIR)"
	@echo "CC=$(CC)"
	@echo "COMMON_CFLAGS=$(COMMON_CFLAGS)"
	@echo "PIC_CFLAGS=$(PIC_CFLAGS)"
	@echo "MOD_CFLAGS=$(MOD_CFLAGS)"
	@echo "CFLAGS_EXTRA=$(CFLAGS_EXTRA)"
	@echo "LIBS=$(LIBS)"
	@echo "SHARED=$(SHARED)"
	@echo "MODULE_LDFLAGS=$(MODULE_LDFLAGS)"
	@echo "EXPORT_DYNAMIC=$(EXPORT_DYNAMIC)"

openwebspider :
		$(CC) $(CFLAGS_EXTRA) $(CONFIG_CFLAGS) $(MYSQLSHIM) $(MYSQL_CFLAGS) $(OPENSSL_CFLAGS) $(OWSSOURCE) -o $(OWS)$(EXEEXT) $(LIBS) $(EXPORT_DYNAMIC) $(COMMON_CFLAGS)

openwebspider-asan:
		$(CC) $(CFLAGS_EXTRA) $(CONFIG_CFLAGS) $(MYSQLSHIM) $(MYSQL_CFLAGS) $(OPENSSL_CFLAGS) $(OWSSOURCE) -o $(OWS)-asan$(EXEEXT) $(LIBS) $(EXPORT_DYNAMIC) -Wall $(ASANFLAGS)

mod_regexfilter :
	$(CC) $(CFLAGS_EXTRA) $(CONFIG_CFLAGS) $(MOD_CFLAGS) -c modules/regexFilter/regexFilter.c
	$(CC) $(CFLAGS_EXTRA) -g $(SHARED) $(MODULE_LDFLAGS) $(REGEXFILTER_SONAME) -o modules/regexFilter/regexFilter$(EXT) regexFilter.o -lc

# mod_pdf needs pdftotext
mod_pdf	:
	$(CC) $(CFLAGS_EXTRA) $(CONFIG_CFLAGS) $(MYSQLSHIM) $(MYSQL_CFLAGS) $(OPENSSL_CFLAGS) $(MOD_CFLAGS) -c modules/mod_pdf/mod_pdf.c
	$(CC) $(CFLAGS_EXTRA) -g $(SHARED) $(MODULE_LDFLAGS) $(MOD_PDF_SONAME) -o modules/mod_pdf/mod_pdf$(EXT) mod_pdf.o -lc $(OPENSSL_LIBS)

mod_image :
	$(CC) $(CFLAGS_EXTRA) $(CONFIG_CFLAGS) $(MYSQLSHIM) $(MYSQL_CFLAGS) $(MOD_CFLAGS) -c modules/mod_image/mod_image.c
	$(CC) $(CFLAGS_EXTRA) -g $(SHARED) $(MODULE_LDFLAGS) $(MOD_IMAGE_SONAME) -o modules/mod_image/mod_image$(EXT) mod_image.o -lc

mod_video :
	$(CC) $(CFLAGS_EXTRA) $(CONFIG_CFLAGS) $(MYSQLSHIM) $(MYSQL_CFLAGS) $(MOD_CFLAGS) -c modules/mod_video/mod_video.c
	$(CC) $(CFLAGS_EXTRA) -g $(SHARED) $(MODULE_LDFLAGS) $(MOD_VIDEO_SONAME) -o modules/mod_video/mod_video$(EXT) mod_video.o -lc

install: all
	$(MKDIR_P) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(SYSCONFDIR)
	$(INSTALL_PROGRAM) $(OWS)$(EXEEXT) $(DESTDIR)$(BINDIR)/$(OWS)$(EXEEXT)
	$(INSTALL_PROGRAM) modules/regexFilter/regexFilter$(EXT) $(DESTDIR)$(LIBDIR)/regexFilter$(EXT)
	$(INSTALL_PROGRAM) modules/mod_pdf/mod_pdf$(EXT) $(DESTDIR)$(LIBDIR)/mod_pdf$(EXT)
	$(INSTALL_PROGRAM) modules/mod_image/mod_image$(EXT) $(DESTDIR)$(LIBDIR)/mod_image$(EXT)
	$(INSTALL_PROGRAM) modules/mod_video/mod_video$(EXT) $(DESTDIR)$(LIBDIR)/mod_video$(EXT)
	$(INSTALL_DATA) openwebspider.conf $(DESTDIR)$(SYSCONFDIR)/openwebspider.conf.sample
	$(INSTALL_DATA) mod_pdf.conf $(DESTDIR)$(SYSCONFDIR)/mod_pdf.conf.sample
	$(INSTALL_DATA) mod_image.conf $(DESTDIR)$(SYSCONFDIR)/mod_image.conf.sample
	$(INSTALL_DATA) mod_video.conf $(DESTDIR)$(SYSCONFDIR)/mod_video.conf.sample
	$(INSTALL_DATA) rank_weights.conf $(DESTDIR)$(SYSCONFDIR)/rank_weights.conf.sample

clean :
	rm -f $(PROG)
	rm -f *.o $(OWS) $(OWS).exe $(OWS)-asan $(OWS)-asan.exe
	rm -f modules/regexFilter/regexFilter.so modules/regexFilter/regexFilter.dylib modules/regexFilter/regexFilter.dll
	rm -f modules/mod_pdf/mod_pdf.so modules/mod_pdf/mod_pdf.dylib modules/mod_pdf/mod_pdf.dll
	rm -f modules/mod_image/mod_image.so modules/mod_image/mod_image.dylib modules/mod_image/mod_image.dll
	rm -f modules/mod_video/mod_video.so modules/mod_video/mod_video.dylib modules/mod_video/mod_video.dll

download :
	tar -czf /tmp/openwebspider-64bit.tar.gz .

#
#
#
