#!/usr/bin/make -f
include /usr/share/dpkg/pkg-info.mk

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

# Exclude .svn directories from packages
export DH_ALWAYS_EXCLUDE=.svn

# Enable hardening
export DEB_BUILD_MAINT_OPTIONS=hardening=+all

VERSION=$(DEB_VERSION)
PREFIX=/usr
DATADIR=$(PREFIX)/share/nsis
DOCDIR=$(PREFIX)/share/doc/nsis
SYSCONF=/etc
BUILDDIR=build
UNICODE=yes
TESTDIR=$(CURDIR)/$(BUILDDIR)/test

# Decomposition of version string
define SPLIT
	$(if $(2),$(call SPLIT,$(subst $(firstword $(2)), ,$(1)),$(filter-out $(firstword $(2)), $(2))), $(1))
endef
VERSION_DECOMPOSED=$(call SPLIT,$(VERSION),. - + ~)
VER_MAJOR=$(firstword $(VERSION_DECOMPOSED))
VER_MINOR=$(word 2,$(VERSION_DECOMPOSED))
VER_REVISION=$(word 3,$(VERSION_DECOMPOSED))

# Variables for Win32/Win64 cross compiler
XGCC_W32_X86 = i686-w64-mingw32-gcc
XGCC_W32_X86_PATH = $(abspath $(shell $(XGCC_W32_X86) -print-file-name=libkernel32.a)/../..)
XGCC_W32_X86_PREFIX = $(subst -gcc,-,$(XGCC_W32_X86))
XGCC_W32_AMD64 = x86_64-w64-mingw32-gcc
XGCC_W32_AMD64_PATH = $(abspath $(shell $(XGCC_W32_AMD64) -print-file-name=libkernel32.a)/../..)
XGCC_W32_AMD64_PREFIX = $(subst -gcc,-,$(XGCC_W32_AMD64))


# Evaluate parallel build option
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
ifeq (,$(shell dh_listpackages -i))
	NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
	SCONSFLAGS = -j $(NUMJOBS)
endif
endif

# Honor hardening flags
SCONSHOSTFLAGS = APPEND_CCFLAGS="$(shell dpkg-buildflags --get CPPFLAGS) \
  $(shell dpkg-buildflags --get CFLAGS)" \
  APPEND_LINKFLAGS="$(shell dpkg-buildflags --get LDFLAGS)"

SCONSOPTS = $(SCONSFLAGS) VERSION=$(VERSION) VER_MAJOR=$(VER_MAJOR) \
  VER_MINOR=$(VER_MINOR) VER_REVISION=$(VER_REVISION) \
  PREFIX=$(PREFIX) PREFIX_CONF=$(SYSCONF) CHMDOCS=0 \
  STRIP_CP=no \
  $(if $(findstring nostripfull,$(DEB_BUILD_OPTIONS)),STRIP_W32=no,)

ifneq (,$(UNICODE),yes)
	SCONSOPTS += UNICODE=yes
	BUILDTYPE := u
endif

ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
	SCONSOPTS += DEBUG=yes
	BUILDTYPE := $(BUILDTYPE)debug
else
	BUILDTYPE := $(BUILDTYPE)release
endif

ifdef XGCC_W32_X86_PATH
SCONSOPTS_X86 = PREFIX_PLUGINAPI_INC=$(XGCC_W32_X86_PATH)/include/ \
  PREFIX_PLUGINAPI_LIB=$(XGCC_W32_X86_PATH)/lib/ \
  XGCC_W32_PREFIX=$(XGCC_W32_X86_PREFIX) \
  TARGET_ARCH=x86
endif

ifdef XGCC_W32_AMD64_PATH
SCONSOPTS_AMD64 = PREFIX_PLUGINAPI_INC=$(XGCC_W32_AMD64_PATH)/include/ \
  PREFIX_PLUGINAPI_LIB=$(XGCC_W32_AMD64_PATH)/lib/ \
  XGCC_W32_PREFIX=$(XGCC_W32_AMD64_PREFIX) \
  TARGET_ARCH=amd64
endif

COMMA := ,

UTILS_ALL = 'Library/RegTool,MakeLangId,Makensisw,NSIS Menu,UIs,SubStart,VPatch/Source/GenPat,zip2exe'

# Only build GenPat for the host system
IGNORE_UTILS_NSIS   := $(subst $(COMMA)VPatch/Source/GenPat,,$(UTILS_ALL))

# Build the win32 user interfaces (UIs) and RegTool
IGNORE_UTILS_COMMON := $(subst Library/RegTool,,$(UTILS_ALL))
IGNORE_UTILS_COMMON := $(subst $(COMMA)UIs,,$(IGNORE_UTILS_COMMON))

SCONSOPTS_HOST   := $(SCONSHOSTFLAGS) $(SCONSOPTS) \
  SKIPPLUGINS=all SKIPSTUBS=all \
  SKIPUTILS=$(IGNORE_UTILS_NSIS) SKIPDOC=COPYING
SCONSOPTS_COMMON := $(SCONSOPTS) SKIPUTILS=$(IGNORE_UTILS_COMMON) \
  SKIPDOC=COPYING

INSTALL_nsis = install-utils install-compiler install-conf
INSTALL_FLAGS_nsis = $(SCONSOPTS_HOST)
INSTALL_nsis-common = install-stubs install-plugins install-data install-utils
INSTALL_FLAGS_nsis-common = $(SCONSOPTS_COMMON)
INSTALL_nsis-pluginapi = install-pluginapi
INSTALL_FLAGS_nsis-pluginapi = $(SCONSOPTS_COMMON)
INSTALL_nsis-doc = install-examples install-doc install-docs
INSTALL_FLAGS_nsis-doc = $(SCONSHOSTFLAGS) $(SCONSOPTS) \
  SKIPUTILS=$(IGNORE_UTILS_COMMON) SKIPDOC=COPYING

# Exclude test scripts which are not appropriate for POSIX platforms.
IGNORE_TESTS = makensis.nsi|gfx.nsi

# Path to .nsi scripts
SCRIPTS_PATH = $(DOCDIR)/Examples

define DO_SCONS_INSTALL
	scons $(INSTALL_FLAGS_$(1)) $(2) PREFIX_DEST="$(CURDIR)/debian/$(1)" $(INSTALL_$(1)) || exit 1;
endef

# Substitute reference to License text file in Modern UI examples
# with source file to enable their compilation with makensis
define SANITIZE_MODERN_UI
	for f in $$(find "$(1)" -type f -name '*.nsi' -print0 | xargs -0 -n 1 basename); \
	do \
		sed -i \
		-e "s&\$${NSISDIR}\\\\Docs\\\\Modern UI\\\\License.txt&$${f}&g" \
		"$(1)/$${f}"; \
	done
endef

# Replace duplicate files with symbolic link
define SYMLINK_DUPLICATES
	for f in $$(ls -1 "$(1)"); \
	do \
		cmp -s "$(1)/$${f}" "$(2)/$${f}"; \
		if [ $$? -eq 0 ]; \
		then \
			ln -sf "$(3)/$${f}" "$(2)/$${f}"; \
			echo $${f}; \
		fi; \
	done
endef

%:
	dh "$@"

override_dh_auto_clean:
	# Remove build directory instead of removing target files
	# via Scons due to pull in of dependencies.
	-rm -rf .sconf_temp .sconsign.dblite SCons/Tools/__pycache__ SCons/Tools/crossmingw.pyc build config.log .test $(BUILDDIR) $(TESTDIR)
	-rm -f Source/exehead/sconf.h Source/version.h Source/defines.h config.log

$(BUILDDIR)/NEWS:
	scons $(SCONSOPTS_HOST) Docs/src; \
	html2text -nobs "$(BUILDDIR)/$(BUILDTYPE)/Docs/html/AppendixF.html" | \
	sed -e '0,/^\*\*\*\*\*/c\NSIS Release Notes (automatically converted from AppendixF.html)' -e 's/F\.[.0-9]* //g' -e 's/^\*\*\*\** *\([^*]*\)  *\**\*\*\*/\n\1\n/g' -e '/Changelog/d' -e '/^NSIS_1.x_version_history/,/^=/c\    http://nsis.sourceforge.net/download/nsis1/' -e 's/^\(Released.*\)/    \1\n/g' | cat -s > "$@"

# Convert DocBook to man page
$(BUILDDIR)/%.1: debian/%.xml
	xsltproc --nonet --output $@ $<

override_dh_auto_build-arch: $(BUILDDIR)/NEWS $(BUILDDIR)/GenPat.1 $(BUILDDIR)/makensis.1
	scons $(SCONSOPTS_HOST) utils makensis

override_dh_auto_build-indep: $(BUILDDIR)/NEWS
	# nsis-common must be built on little-endian
	[ "$(shell dpkg-architecture -qDEB_BUILD_ARCH_ENDIAN)" = "little" ]
	
	scons $(SCONSOPTS_HOST) makensis
ifdef XGCC_W32_X86_PATH
	scons $(SCONSOPTS_COMMON) $(SCONSOPTS_X86) stubs plugins utils
endif
ifdef XGCC_W32_AMD64_PATH
	scons $(SCONSOPTS_COMMON) $(SCONSOPTS_AMD64) stubs plugins utils
endif
	html2text -style pretty -nobs -o "$(BUILDDIR)/README.Modern UI" "Contrib/Modern UI/Readme.html"
	html2text -style pretty -nobs -o "$(BUILDDIR)/README.Modern UI 2" "Contrib/Modern UI 2/Readme.html"
	html2text -style pretty -nobs -o $(BUILDDIR)/README.VPatch Contrib/VPatch/Readme.html
	html2text -style pretty -nobs -o $(BUILDDIR)/README.InstallOptions Contrib/InstallOptions/Readme.html
	html2text -style pretty -nobs -o $(BUILDDIR)/README.MultiUser Contrib/MultiUser/Readme.html
	html2text -style pretty -nobs -o $(BUILDDIR)/README.nsDialogs Contrib/nsDialogs/Readme.html

override_dh_auto_test-arch:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	scons $(SCONSOPTS_HOST) test-code
endif

override_dh_auto_test-indep:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	test -x "$(BUILDDIR)/$(BUILDTYPE)/makensis/makensis" && \
	scons $(INSTALL_FLAGS_nsis) PREFIX_DEST="$(TESTDIR)"\
		install-compiler install-conf && \
	scons $(INSTALL_FLAGS_nsis-doc) PREFIX_DEST="$(TESTDIR)"\
		install-examples && \
	scons $(INSTALL_FLAGS_nsis-common) $(SCONSOPTS_X86) PREFIX_DEST="$(TESTDIR)" \
		$(INSTALL_nsis-common) && \
	scons $(INSTALL_FLAGS_nsis-common) $(SCONSOPTS_AMD64) PREFIX_DEST="$(TESTDIR)" \
		$(INSTALL_nsis-common) && \
	$(call SANITIZE_MODERN_UI,$(TESTDIR)$(DOCDIR)/Examples/Modern UI) && \
	for script_path in $(TESTDIR)$(SCRIPTS_PATH)/*.nsi \
		$(TESTDIR)$(SCRIPTS_PATH)/*/*.nsi; do \
		script=$${script_path#$(TESTDIR)$(SCRIPTS_PATH)/}; \
		if [ "$${script%/*}" != "$${script}" ]; then \
			mkdir -p "$(TESTDIR)/$${script%/*}"; \
		fi; \
		case $${script} in \
		$(IGNORE_TESTS)) ;; \
		*) \
		if [ -f "$${script_path}" ]; then \
			PATH=$(TESTDIR)$(PREFIX)/bin:$(PATH) \
			NSISDIR=$(TESTDIR)$(DATADIR) \
			NSISCONFDIR=$(TESTDIR)$(SYSCONF) \
			"$(TESTDIR)$(PREFIX)/bin/makensis" \
			"$${script_path}" \
			-X"OutFile \"$(TESTDIR)/$${script%.nsi}.exe\"" \
			|| exit 1; \
		fi;; \
		esac; \
	done;
	# Fail the build if libwinpthread is needed at runtime (see #722898)
	test `find $(TESTDIR)$(DATADIR)/Plugins -iname "*.dll" -exec objdump -p {} \; | grep -E "file format|DLL Name" | grep -cim1 libwinpthread` -eq 0
endif

override_dh_auto_install-arch:
	$(foreach p,$(shell dh_listpackages -a),$(call DO_SCONS_INSTALL,$(p)))

override_dh_fixperms-arch:
	dh_fixperms
	find "$(CURDIR)/debian/nsis/$(SYSCONF)" \
		-type f -perm /111 -exec chmod a-x {} \;

override_dh_auto_install-indep:
	$(foreach p,$(shell dh_listpackages -i),$(call DO_SCONS_INSTALL,$(p), $(SCONSOPTS_X86)))
	$(foreach p,$(shell dh_listpackages -i),$(call DO_SCONS_INSTALL,$(p), $(SCONSOPTS_AMD64)))
	# Exclude any architecture dependent binaries from nsis-common
	rm -rf "$(CURDIR)/debian/nsis-common$(PREFIX)/bin"
	# Clean up examples and documentation
	# The docs file can't seem to have spaces within the file name(s)
	dh_installdocs -pnsis-doc "$(BUILDDIR)/README.Modern UI" \
		"$(BUILDDIR)/README.Modern UI 2"
	rm "debian/nsis-doc$(DOCDIR)/Docs/Modern UI/License.txt"
	rm "debian/nsis-doc$(DOCDIR)/Docs/Modern UI 2/License.txt"
	rm "debian/nsis-doc$(DOCDIR)/Docs/NSISdl/License.txt"
	$(call SANITIZE_MODERN_UI,$(CURDIR)/debian/nsis-doc$(DOCDIR)/Examples/Modern UI)
	# Replace duplicate image files with symbolic links
	$(call SYMLINK_DUPLICATES,$(CURDIR)/debian/nsis-doc$(DOCDIR)/Docs/Modern UI/images,$(CURDIR)/debian/nsis-doc$(DOCDIR)/Docs/Modern UI 2/images,../../Modern UI/images)

override_dh_compress-indep:
	dh_compress -X.nlf -X.nsh -X.nsi -X.dll
	# Adapt links to documents with those of their compressed version
	if [ -d debian/nsis-doc$(DOCDIR) ]; then \
		cd debian/nsis-doc$(DOCDIR) ; \
		find -mindepth 2 -name \*.gz | \
		sed -e 's,^\.\(.\+\)\.gz$$,\1,g' -e 's, ,%20,g' | \
		xargs -i88 sh -c 'fgrep -rl "88\"" . | \
		xargs -i{} sed -i -e "s|88\"|88.gz\"|g" "{}"'; \
	fi

override_dh_fixperms-indep:
	dh_fixperms
	# Remove executable flag from data files
	find "$(CURDIR)/debian/nsis-common$(DATADIR)" \
		-type f -perm /111 -exec chmod a-x {} \;
	# Fix permissions for plugin API header and library files
ifdef XGCC_W32_X86_PATH
	find "$(CURDIR)/debian/nsis-pluginapi$(XGCC_W32_X86_PATH)" \
		-type f -perm /111 -exec chmod a-x {} \;
endif
ifdef XGCC_W32_AMD64_PATH
	find "$(CURDIR)/debian/nsis-pluginapi$(XGCC_W32_AMD64_PATH)" \
		-type f -perm /111 -exec chmod a-x {} \;
endif
