# To test with valgrind:
# make -i tests NORANDOMIZE="" VALGRIND="valgrind --tool=memcheck --log-file=/some/where.%p" 
SHELL	= /bin/sh
WARN    = -Wmissing-prototypes -Wformat -Wno-comment -fno-common
OPTS	= 'WARN=$(WARN)'
DIRS	= src/util src/global src/dns src/tls src/xsasl src/master src/milter \
	src/postfix src/fsstone src/smtpstone \
	src/sendmail src/error src/pickup src/cleanup src/smtpd src/local \
	src/trivial-rewrite src/qmgr src/oqmgr src/smtp src/bounce \
	src/pipe src/showq src/postalias src/postcat src/postconf src/postdrop \
	src/postkick src/postlock src/postlog src/postmap src/postqueue \
	src/postsuper src/qmqpd src/spawn src/flush src/verify \
	src/virtual src/proxymap src/anvil src/scache src/discard src/tlsmgr \
	src/postmulti src/postscreen src/dnsblog src/tlsproxy \
	src/posttls-finger src/postlogd src/nbdb_reindexd src/ptest src/testing
MANDIRS	= proto man html
LIBEXEC	= libexec/post-install libexec/postfix-script libexec/postfix-wrapper \
	libexec/postmulti-script libexec/postfix-non-bdb-script \
	libexec/postfix-tls-script
PLUGINS	= meta/dynamicmaps.cf
META	= meta/main.cf.proto meta/master.cf.proto meta/postfix-files \
	meta/makedefs.out $(PLUGINS)
TESTING	= test-conf/main.cf
EXPAND	= sed -e "s;\$${LIB_PREFIX};$(LIB_PREFIX);" \
	    -e "s;\$${LIB_SUFFIX};$(LIB_SUFFIX);"
SHLIB_DIR_OVERRIDE = \
	$${shlib_directory:-`$(SHLIB_ENV) bin/postconf -dhx shlib_directory`}

default: update

# While generating the top-level Makefile, we must get the PLUGIN_LD
# setting directly from the latest makedefs.out result.

makefiles Makefiles conf/makedefs.out:
	(echo "# Do not edit -- this file documents how Postfix was built for your machine."; $(SHELL) makedefs) >makedefs.tmp
	set +e; if cmp makedefs.tmp conf/makedefs.out; then rm makedefs.tmp; \
	else mv makedefs.tmp conf/makedefs.out; fi >/dev/null 2>/dev/null
	set -e; for i in $(DIRS); do \
	 (set -e; echo "[$$i]"; cd $$i; rm -f Makefile; \
	 $(MAKE) -f Makefile.in Makefile MAKELEVEL=) || exit 1; \
	done
	@set -- `grep '^PLUGIN_LD' conf/makedefs.out`; \
	rm -f Makefile; (cat conf/makedefs.out; \
	case  "$$3" in \
	""|":") grep -v '^PLUGINS' Makefile.in;; \
	     *) cat Makefile.in;; \
	esac) >Makefile

update tests root_tests:
	set -e; for i in $(DIRS); do \
	 (set -e; echo "[$$i]"; cd $$i; $(MAKE) $(OPTS) $@ MAKELEVEL=) || exit 1; \
	done

update: $(META) $(TESTING) $(LIBEXEC)

libexec/post-install: conf/post-install
	rm -f $@ && ln -f $? $@

# Censor out build directory information.

meta/makedefs.out: conf/makedefs.out
	grep -v SHLIB_ENV $? > $@

meta/postfix-files: conf/postfix-files conf/makedefs.out Makefile
	rm -f $@
	(if [ "${SHLIB_DIR}" = "no" -o "${SHLIB_DIR}" = "" ]; then \
	    sed -e '/^\$$shlib_directory/d' \
		-e '/dynamicmaps.cf/d' conf/postfix-files; \
	elif [ "${PLUGIN_LD}" = ":" -o "${PLUGIN_LD}" = "" ]; then \
	    sed -e '/dynamicmaps.cf/d' \
		-e '/^\$$shlib_directory\/\$${LIB_PREFIX}/d' \
		conf/postfix-files | $(EXPAND); \
	else \
	    $(EXPAND) conf/postfix-files | awk -F: ' \
		BEGIN { \
		    count = split("'"$(DEFINED_MAP_TYPES)"'", names, " "); \
		    for (n = 1; n <= count; n++) \
			have["$$shlib_directory/$(LIB_PREFIX)" names[n] \
			    "$(LIB_SUFFIX)"] = 1; } \
		/^[$$]shlib_directory.$(LIB_PREFIX)/ { \
		    if (have[$$1]) print; next } \
		{ print } \
	    '; \
	fi) | case "$(MAKE_FIX)" in \
	 *) cat;; \
	esac > $@

libexec/postfix-script: conf/postfix-script
	rm -f $@ && ln -f $? $@

libexec/postfix-non-bdb-script: conf/postfix-non-bdb-script
	rm -f $@ && ln -f $? $@

libexec/postfix-tls-script: conf/postfix-tls-script
	rm -f $@ && ln -f $? $@

libexec/postfix-wrapper: conf/postfix-wrapper
	rm -f $@ && ln -f $? $@

meta/main.cf.proto: conf/main.cf
	rm -f $@ && ln -f $? $@

test-conf/main.cf:
	rm -f $@
	mkdir -p test-conf
	echo 'meta_directory = $(BUILD_ROOT)/meta' >> $@
	echo 'shlib_directory = $(BUILD_ROOT)/lib' >> $@

meta/master.cf.proto: conf/master.cf
	rm -f $@ && ln -f $? $@

libexec/postmulti-script: conf/postmulti-script
	rm -f $@ && ln -f $? $@

meta/dynamicmaps.cf: conf/dynamicmaps.cf Makefile
	rm -f $@ && $(EXPAND) conf/dynamicmaps.cf | $(AWK) ' \
		BEGIN { split("'"$(DEFINED_MAP_TYPES)"'", map_types); \
			for (n in map_types) has_type[map_types[n]] = n; \
			if (has_type["db"]) { \
			    has_type["hash"] = has_type["btree"] = 1; \
			    delete has_type["db"] } } \
		/^#/ { print } \
		/^[a-z]/ { if (has_type[$$1]) print } \
	' >$@

manpages:
	set -e; for i in $(MANDIRS); do \
	 (set -e; echo "[$$i]"; cd $$i; $(MAKE) -f Makefile.in $(OPTS) MAKELEVEL=) || exit 1; \
	done </dev/null

# Some checks require a bin/postconf executable.
pre-release-checks: update typo-check double-check \
	missing-proxy-read-maps-check \
	postlink-check postfix-files-check \
	postconf-unimplemented-check postconf-undocumented-check \
	check-table-proto check-see-postconf-d-output \
	check-param-defaults \
	check-snapshot-nonprod

postfix-files-check:
	mantools/check-postfix-files | diff /dev/null -

postlink-check:
	$(SHLIB_ENV) mantools/check-postlink | diff /dev/null -

postconf-undocumented-check:
	$(SHLIB_ENV) mantools/check-postconf-undocumented | diff /dev/null -

postconf-unimplemented-check:
	$(SHLIB_ENV) mantools/check-postconf-unimplemented | diff /dev/null -

missing-proxy-read-maps-check:
	$(SHLIB_ENV) mantools/missing-proxy-read-maps | diff /dev/null -
	$(SHLIB_ENV) mantools/check-proxy-type-table | diff /dev/null -

typo-check: spell-cc spell-install-proto-text spell-proto-html \
	check-spell-history

double-check: double-cc double-install-proto-text double-proto-html \
	check-double-history 

spell-cc:
	mantools/check-spell-cc | diff /dev/null -

spell-install-proto-text:
	mantools/check-spell-install-proto-text | diff /dev/null -

spell-proto-html:
	mantools/check-spell-proto-html | diff /dev/null -

double-cc:
	mantools/check-double-cc | diff /dev/null -

double-install-proto-text:
	mantools/check-double-install-proto-text | diff /dev/null -

double-proto-html:
	mantools/check-double-proto-html | diff /dev/null -

check-spell-history:
	mantools/check-spell-history | diff /dev/null -

check-double-history:
	mantools/check-double-history | diff /dev/null -

check-table-proto:
	mantools/check-table-proto | diff /dev/null -

check-see-postconf-d-output:
	mantools/check-see-postconf-d-output | diff /dev/null -

check-param-defaults:
	mantools/check-param-defaults | diff /dev/null -

check-snapshot-nonprod:
	mantools/check-snapshot-nonprod

# The build-time shlib_directory setting must take precedence over
# the installed main.cf settings, otherwise we can't update an
# installed system from dynamicmaps=yes<->dynamicmaps=no or from
# shared=yes<->shared=no.

install: update
	SHLIB_ENV_VAR= SHLIB_ENV_VAL= \
	$(SHLIB_ENV) shlib_directory=$(SHLIB_DIR_OVERRIDE) $(SHELL) \
		postfix-install $(POSTFIX_INSTALL_OPTS)

package: update
	SHLIB_ENV_VAR= SHLIB_ENV_VAL= \
	$(SHLIB_ENV) shlib_directory=$(SHLIB_DIR_OVERRIDE) $(SHELL) \
		postfix-install -package $(POSTFIX_INSTALL_OPTS)

upgrade: update
	SHLIB_ENV_VAR= SHLIB_ENV_VAL= \
	$(SHLIB_ENV) shlib_directory=$(SHLIB_DIR_OVERRIDE) $(SHELL) \
		postfix-install -non-interactive $(POSTFIX_INSTALL_OPTS)
	

non-interactive-package: update
	SHLIB_ENV_VAR= SHLIB_ENV_VAL= \
	$(SHLIB_ENV) shlib_directory=$(SHLIB_DIR_OVERRIDE) $(SHELL) \
		postfix-install -non-interactive -package $(POSTFIX_INSTALL_OPTS)

depend clean:
	set -e; for i in $(DIRS); do \
	 (set -e; echo "[$$i]"; cd $$i; $(MAKE) $@) || exit 1; \
	done

depend_update:
	set -e; for i in $(DIRS); do \
	 (set -e; echo "[$$i]"; cd $$i; $(MAKE) depend && $(MAKE) $(OPTS) update) \
	    || exit 1; \
	done

tidy:	clean
	rm -f Makefile */Makefile src/*/Makefile
	cp -p Makefile.init Makefile
	rm -f README_FILES/RELEASE_NOTES
	ln -s ../RELEASE_NOTES README_FILES
	rm -f bin/[!CRS]* lib/[!CRS]* include/[!CRS]* libexec/[!CRS]* \
	    src/*/libpostfix-*.so src/*/libpostfix-*.dylib \
	    src/*/postfix-*.so src/*/postfix-*.dylib \
	    junk */junk */*/junk \
	    *core */*core */*/*core \
	    .nfs* */.nfs* */*/.nfs* \
	    .pure */.pure */*/.pure \
	    *.out */*.out */*/*.out \
	    *.tmp */*.tmp */*/*.tmp \
	    *.a */*.a */*/*.a \
	    *~ */*~ */*/*~ \
	    *- */*- */*/*- \
	    *.orig */*.orig */*/*.orig \
	    *.bak */*.bak */*/*.bak \
	    make.err */make.err */*/make.err \
	    *.gmon */*.gmon */*/*.gmon \
	    conf/main.cf.default conf/bounce.cf.default meta/*
	rm -rf test-conf
	find . -type s -print | xargs rm -f
	find . -type d -print | xargs chmod 755
	find . -type f -print | xargs chmod a+r
