#
# 3 proxy Makefile for GCC/Linux/Cygwin
#
# remove -DNOODBC from CFLAGS and add -lodbc to LIBS to compile with ODBC
# library support. Add -DSAFESQL for poorely written ODBC library / drivers.

BUILDDIR = ../bin/
CC ?= gcc

CFLAGS := -g  -fPIC -O2 -fno-strict-aliasing -c -pthread -DWITHSPLICE -D_GNU_SOURCE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC  -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER $(CFLAGS)
COUT = -o 
LN ?= ${CC}
DCFLAGS ?= 
LDFLAGS := -fPIC -O2 -fno-strict-aliasing -pthread $(LDFLAGS)
DLFLAGS ?= -shared
DLSUFFICS = .ld.so
# -lpthreads may be reuqired on some platforms instead of -pthreads
LIBSPREFIX = -l
LIBSSUFFIX = 
LNOUT = -o 
EXESUFFICS =
OBJSUFFICS = .o
DEFINEOPTION = -D
COMPFILES = *~
REMOVECOMMAND = rm -f
AFTERCLEAN = (find . -type f -name "*.o" -delete && find src/ -type f -name "Makefile.var" -delete && find bin/ -type f -executable -delete) || true
TYPECOMMAND = cat
COMPATLIBS =
MAKEFILE = Makefile.Linux
# PamAuth requires libpam, you may require pam-devel package to be installed
# SSLPlugin requires  -lcrypto -lssl
#LIBS = -lcrypto -lssl -ldl 
LIBS ?= -ldl 
#PLUGINS = SSLPlugin StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin PamAuth
PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin
OPENSSL_CHECK = $(shell echo "\#include <openssl/ssl.h>\\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testssl.o - 2>/dev/null && $(CC) $(LDFLAGS) -otestssl testssl.o -lcrypto -lssl 2>/dev/null && rm testssl testssl.o && echo true||echo false)
ifeq ($(OPENSSL_CHECK), true)
    LIBS += -l crypto -l ssl
    PLUGINS += SSLPlugin
endif
PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include <pcre2.h>\\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpcre.o - 2>/dev/null && $(CC) -o testpcre testpcre.o $(LDFLAGS) -lpcre2-8 2>/dev/null && rm testpcre testpcre.o && echo true||echo false)
ifeq ($(PCRE_CHECK), true)
    PLUGINS += PCREPlugin
endif
PAM_CHECK = $(shell echo "\#include <security/pam_appl.h>\\n int main(){return 0;}" | tr -d \\\\ | $(CC) -x c $(CFLAGS) -o testpam.o - 2>/dev/null && $(CC) $(LDFLAGS) -o testpam testpam.o -lpam 2>/dev/null && rm testpam testpam.o && echo true||echo false)
ifeq ($(PAM_CHECK), true)
    PLUGINS += PamAuth
endif
include Makefile.inc

allplugins:
	@list='$(PLUGINS)'; for p in $$list; do cp Makefile Makefile.var plugins/$$p; cd plugins/$$p ; make ;	cd ../.. ; done

DESTDIR		=
prefix		= 
exec_prefix	= $(prefix)
man_prefix	= /usr/share
chroot_prefix	= /usr/local

INSTALL		= /usr/bin/install
INSTALL_BIN	= $(INSTALL) -m 755
INSTALL_DATA	= $(INSTALL) -m 644
INSTALL_OBJS	= bin/3proxy \
		  bin/ftppr \
		  bin/mycrypt \
		  bin/pop3p \
		  bin/proxy \
		  bin/socks \
		  bin/tcppm \
		  bin/udppm \
		  bin/tlspr
		  

INSTALL_CFG	 = scripts/3proxy.cfg.chroot
INSTALL_CFG_INCHROOT = scripts/3proxy.cfg.inchroot
INSTALL_CFG_OBJS = scripts/add3proxyuser.sh

INSTALL_CFG_OBJS2 = counters bandlimiters

INSTALL_INITD_SCRIPT = scripts/init.d/3proxy.sh
INSTALL_SYSTEMD_SCRIPT = scripts/3proxy.service

CHROOTDIR	= $(DESTDIR)$(chroot_prefix)/3proxy
CHROOTREL	= ../..$(chroot_prefix)/3proxy
MANDIR1		= $(DESTDIR)$(man_prefix)/man/man1
MANDIR3		= $(DESTDIR)$(man_prefix)/man/man3
MANDIR8		= $(DESTDIR)$(man_prefix)/man/man8
BINDIR		= $(DESTDIR)$(exec_prefix)/bin
ETCDIR		= $(DESTDIR)/etc/3proxy
INITDDIR	= $(DESTDIR)/etc/init.d
RUNBASE		= $(DESTDIR)/var/run
RUNDIR		= $(RUNBASE)/3proxy
LOGBASE		= $(DESTDIR)/var/log
LOGDIR		= $(LOGBASE)/3proxy
INSTALL_CFG_DEST = $(ETCDIR)/conf
SYSTEMDDIR	= $(DESTDIR)/usr/lib/systemd/system/

install-bin:
	$(INSTALL_BIN) -d $(BINDIR)
	$(INSTALL_BIN) -s $(INSTALL_OBJS) $(BINDIR)
	$(INSTALL_BIN) -s bin/*.ld.so $(CHROOTDIR)/libexec

install-etc-dir:
	$(INSTALL_BIN) -d $(ETCDIR)

install-chroot-dir:
	$(INSTALL_BIN) -d $(CHROOTDIR)
	$(INSTALL_BIN) -d $(CHROOTDIR)/conf
	$(INSTALL_BIN) -d $(CHROOTDIR)/logs
	$(INSTALL_BIN) -d $(CHROOTDIR)/count
	$(INSTALL_BIN) -d $(CHROOTDIR)/libexec
	chmod -R o-rwx $(CHROOTDIR)

install-etc-default-config: install-chroot-dir
	if [ ! -d $(INSTALL_CFG_DEST) ]; then \
	   ln -s $(CHROOTREL)/conf $(INSTALL_CFG_DEST); \
	   $(INSTALL_BIN) $(INSTALL_CFG) $(ETCDIR)/3proxy.cfg; \
	   $(INSTALL_BIN) $(INSTALL_CFG_OBJS) $(INSTALL_CFG_DEST); \
	   $(INSTALL_BIN) $(INSTALL_CFG_INCHROOT) $(INSTALL_CFG_DEST)/3proxy.cfg; \
	fi

install-etc: install-etc-dir install-etc-default-config
	for file in $(INSTALL_CFG_OBJS2); \
	do \
	  touch $(INSTALL_CFG_DEST)/$$file; chmod 0600 $(INSTALL_CFG_DEST)/$$file; \
	done;

install-man:
	$(INSTALL_BIN) -d $(MANDIR3)
	$(INSTALL_BIN) -d $(MANDIR8)
	$(INSTALL_DATA) man/*.3 $(MANDIR3)
	$(INSTALL_DATA) man/*.8 $(MANDIR8)

install-init:
	$(INSTALL_BIN) -d $(INITDDIR)
	$(INSTALL_BIN) $(INSTALL_INITD_SCRIPT) $(INITDDIR)/3proxy
	$(INSTALL_BIN) -d $(SYSTEMDDIR)
	$(INSTALL_DATA) $(INSTALL_SYSTEMD_SCRIPT) $(SYSTEMDDIR)

install-run:
	$(INSTALL_BIN) -d $(RUNDIR)

install-log:
	$(INSTALL_BIN) -d $(LOGBASE)
	@if [ ! -d $(LOGDIR) ]; then \
	 ln -s $(CHROOTREL)/logs $(LOGDIR);\
	fi

install: install-chroot-dir install-bin install-etc install-log install-man install-run install-init
	@if [ "$(DESTDIR)" = "" ]; then \
	 sh debian/preinst; \
	 sh debian/postinst; \
	fi
