# Copyright © 2009-2015 Jakub Wilk <jwilk@jwilk.net>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 dated June, 1991.

usr = $(CURDIR)
host = i686-w64-mingw32
docbook_xsl = http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl

version := $(shell cat ../doc/changelog | head -n1 | cut -d' ' -f2 | tr -d '()')

djvulibre_tools = bzz c44 cjb2 csepdjvu djvuextract djvumake djvused djvmcvt

wget = cd dcache && wget -c
untar = tar --strip-components=1 -xf
ship_dll = cp bin/$1*.dll dist/ && $(STRIP) dist/$1*.dll && chmod a-x dist/$1*.dll

export CC = $(host)-gcc
export CXX = $(host)-g++
export AS = $(host)-as
export DLLTOOL = $(host)-dlltool
export OBJDUMP = $(host)-objdump
export STRIP = $(host)-strip

export PKG_CONFIG_PATH = $(usr)/lib/pkgconfig
export CPATH = $(usr)/include
export LDFLAGS = -L$(usr)/lib

export CFLAGS = -Os
export CXXFLAGS = -Os
export CPPFLAGS = -D__USE_MINGW_ANSI_STDIO

export WINEDEBUG ?= fixme+all,err+all
export V = 1

.PHONY: all
all:
	@echo Usage:
	@echo '  make source-dist'
	@echo '  make binary-dist'

.PHONY: clean

# Source tarballs

src_tarball_topdir = pdf2djvu-win32-source-$(version)
src_tarball_name = pdf2djvu-win32-source-$(version)
tar_opts = --owner root --group root --mode a+rX --format ustar
xz_opts = -8e

.PHONY: source-dist
source-dist:
	rm -rf src/*/
	$(MAKE) $(shell grep '[^ ]*source[-]stamp:' Makefile | cut -d: -f1)
	rm -rf $(src_tarball_topdir)
	mkdir $(src_tarball_topdir)
	cp -rl src/*/ $(src_tarball_topdir)/
	find $(src_tarball_topdir) -name source-stamp -delete
	tar $(tar_opts) -I 'xz -v $(xz_opts)' -cf $(src_tarball_name).tar.xz $(src_tarball_topdir)
	rm -rf $(src_tarball_topdir)

.PHONY: clean-source
clean: clean-source
clean-source:
	rm -rf src/
	rm -rf $(src_tarball_topdir)
	rm -f $(src_tarball_name).tar.xz

# Binary zipballs

zipball_topdir = pdf2djvu-$(version)
zipball_name = pdf2djvu-win32-$(version)
zip_opts = -9 -X -r

.PHONY: binary-dist
binary-dist: install
	mkdir -p $(zipball_topdir)
	cp -rl dist/* $(zipball_topdir)
	chmod a-x $(zipball_topdir)/*.exe
	chmod -R a+rX $(zipball_topdir)
	zip $(zip_opts) $(zipball_name).zip $(zipball_topdir)
	rm -r $(zipball_topdir)

.PHONY: clean-binary
clean: clean-binary
clean-binary:
	rm -rf bin/ etc/ include/ lib/ share/
	rm -rf dist/
	rm -rf $(zipball_topdir)
	rm -f $(zipball_name).zip

.PHONY: install
install: src/pdf2djvu/install-stamp
install: src/libs-install-stamp
install: src/urw-fonts/install-stamp

# pdf2djvu

src/pdf2djvu/source-stamp: dcache/pdf2djvu-$(version).tar.xz
	mkdir -p $(dir $@)
	$(untar) $(<) -C $(dir $@)
	rm -f $(dir $@)/paths.hh
	touch $(@)

src/pdf2djvu/config.status: src/pdf2djvu/source-stamp
src/pdf2djvu/config.status: src/djvulibre/install-stamp
src/pdf2djvu/config.status: src/gettext/install-stamp
src/pdf2djvu/config.status: src/graphicsmagick/install-stamp
src/pdf2djvu/config.status: src/libxslt/install-stamp
src/pdf2djvu/config.status: src/mingwrt/install-stamp
src/pdf2djvu/config.status: src/poppler/install-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--bindir=$(usr)/dist/ \
		--localedir=$(usr)/dist/locale/ \
		--with-graphicsmagick \
		--with-xslt \
		--disable-openmp

src/pdf2djvu/build-stamp: src/pdf2djvu/config.status
	$(MAKE) djvulibre_bindir=. localedir=./locale -C $(dir $@)
	touch $(@)

src/pdf2djvu/install-stamp: src/pdf2djvu/build-stamp
	mkdir -p dist/doc/
	$(MAKE) install -C $(dir $@)
	$(STRIP) dist/pdf2djvu.exe
	xsltproc --nonet $(docbook_xsl) src/pdf2djvu/doc/pdf2djvu.xml > dist/doc/manual-page.html
	$(MAKE) -C $(dir $@)/doc/po/ xml
	cd src/pdf2djvu/doc/po/ && set -e && \
		for file in pdf2djvu.*.xml; do \
			suffix="$${file#*.}"; \
			locale="$${suffix%.*}"; \
			xsltproc --nonet $(docbook_xsl) $$file > $(usr)/dist/doc/manual-page-$$locale.html; \
		done
	sed -e 's/$$/\r/' < src/pdf2djvu/doc/COPYING > dist/doc/COPYING.txt
	cd src/pdf2djvu/doc && set -e && \
		for file in *.txt; do \
			rst2html $$file > $(usr)/dist/doc/$${file%.txt}.html; \
		done
	sed -e 's/$$/\r/' < src/pdf2djvu/doc/changelog > dist/doc/changelog.txt
	touch $(@)

# Various libraries

src/libs-install-stamp: src/djvulibre/install-stamp
src/libs-install-stamp: src/fontconfig/install-stamp
src/libs-install-stamp: src/freetype/install-stamp
src/libs-install-stamp: src/gettext/install-stamp
src/libs-install-stamp: src/graphicsmagick/install-stamp
src/libs-install-stamp: src/libjpeg/install-stamp
src/libs-install-stamp: src/libxml2/install-stamp
src/libs-install-stamp: src/libxslt/install-stamp
src/libs-install-stamp: src/poppler/install-stamp
src/libs-install-stamp: src/winiconv/install-stamp
	mkdir -p dist/doc/
	rst2html COPYING.libs.txt > dist/doc/COPYING.libs.html
	touch $(@)

# Poppler

src/poppler/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://poppler.freedesktop.org/poppler-0.18.4.tar.gz
	echo '33421148cdc8e043da291dece2cce1cea6220d49a50c00c56d56d6435501d42e  dcache/poppler-0.18.4.tar.gz' | sha256sum -c
	$(untar) dcache/poppler-*.tar.gz -C $(dir $@)
	cd $(dir $@) && sed -i -e '/^SUBDIRS =/ s/ test / /' Makefile*
	touch $(@)

src/poppler/config.status: src/poppler/source-stamp
src/poppler/config.status: src/fontconfig/install-stamp
src/poppler/config.status: src/libjpeg/install-stamp
	cd $(dir $@) && \
		CPPFLAGS='-DWIN32_LEAN_AND_MEAN -DXMD_H' \
		./configure --host=$(host) --prefix=$(usr) \
		--with-font-configuration=fontconfig \
		--enable-xpdf-headers \
		--disable-static \
		--disable-cms \
		--disable-abiword-output \
		--disable-cairo-output \
		--disable-poppler-cpp \
		--disable-poppler-glib \
		--disable-poppler-qt \
		--disable-poppler-qt4 \
		--disable-utils \
		--disable-libpng \
		--disable-compile-warnings
	sed -i -e 's!^\(#define POPPLER_DATADIR\) .*!\1 "./poppler-data/"!' $(dir $@)/config.h

src/poppler/build-stamp: src/poppler/config.status
	$(MAKE) -C $(dir $@)
	touch $(@)

src/poppler/install-stamp: src/poppler/build-stamp
	$(MAKE) -C $(dir $@) install
	$(call ship_dll,libpoppler)
	touch $(@)

# DjVuLibre

src/djvulibre/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://downloads.sourceforge.net/djvu/djvulibre-3.5.27.tar.gz
	echo 'e69668252565603875fb88500cde02bf93d12d48a3884e472696c896e81f505f  dcache/djvulibre-3.5.27.tar.gz' | sha256sum -c
	$(untar) dcache/djvulibre-*.tar.gz -C $(dir $@)
	sed -i -e 's/[A-Z]\+_EXPORT/DLL_EXPORT/' $(dir $@)/libdjvu/*.h
	sed -i -e 's/#if.*def.*AUTOCONF.*/#if 0/' $(dir $@)/libdjvu/DjVuMessage.cpp
	touch $(@)

src/djvulibre/config.status: src/djvulibre/source-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--without-jpeg \
		--disable-static

src/djvulibre/build-stamp: src/djvulibre/config.status
	$(MAKE) -C $(dir $@)/libdjvu
	$(MAKE) -C $(dir $@)/tools
	touch $(@)

src/djvulibre/install-stamp: src/djvulibre/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@)/libdjvu install
	$(MAKE) -C $(dir $@)/tools install
	set -e && \
	for tool in $(djvulibre_tools); do \
		cp bin/$$tool.exe bin/$$tool; \
		cp bin/$$tool.exe dist/; \
		$(STRIP) dist/$$tool.exe; \
	done
	$(call ship_dll,libdjvulibre)
	touch $(@)

# GraphicsMagick

src/graphicsmagick/source-stamp:
	mkdir -p $(dir $@)
	$(wget) ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/1.3/GraphicsMagick-1.3.20.tar.xz
	echo '35fa21da4c1479e08da8351c5b1e363adaca803a0064cfc83084363adce387c9  dcache/GraphicsMagick-1.3.20.tar.xz' | sha256sum -c
	$(untar) dcache/GraphicsMagick-*.tar.xz -C $(dir $@)
	touch $(@)

src/graphicsmagick/config.status: src/graphicsmagick/source-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
			--disable-installed \
			--disable-openmp --without-threads \
			--enable-shared --disable-static \
			--without-frozenpaths \
			--without-perl \
			--without-bzlib \
			--without-dps \
			--without-fpx \
			--without-gslib \
			--without-jbig \
			--without-webp \
			--without-jpeg \
			--without-jp2 \
			--without-lcms \
			--without-lcms2 \
			--without-lzma \
			--without-png \
			--without-tiff \
			--without-trio \
			--without-ttf \
			--without-umem \
			--without-wmf \
			--without-xml \
			--without-zlib \
			--without-x \
			--without-png

src/graphicsmagick/build-stamp: src/graphicsmagick/config.status
	sed -i -e '/^#define GM_BUILD_/d' $(dir $@)/magick/magick_config.h
	$(MAKE) -C $(dir $@)
	touch $(@)

src/graphicsmagick/install-stamp: src/graphicsmagick/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@) install
	$(call ship_dll,libGraphicsMagick)
	touch $(@)

# libxml2

src/libxml2/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://xmlsoft.org/sources/libxml2-2.7.8.tar.gz
	echo 'cda23bc9ebd26474ca8f3d67e7d1c4a1f1e7106364b690d822e009fdc3c417ec  dcache/libxml2-2.7.8.tar.gz' | sha256sum -c
	$(untar) dcache/libxml2-*.tar.gz -C $(dir $@)
	sed -i -e '/^#undef v\?snprintf$$/d' $(dir $@)/config.h.in
	rm -r src/libxml2/test
	rm -r src/libxml2/result
	touch $(@)

src/libxml2/config.status: src/libxml2/source-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--disable-static \
		--with-minimum \
		--with-html \
		--with-output \
		--with-tree \
		--with-writer \
		--with-xpath \
		--with-sax1

src/libxml2/build-stamp: src/libxml2/config.status
	$(MAKE) -C $(dir $@)
	touch $(@)

src/libxml2/install-stamp: src/libxml2/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@) install
	cp xmlexports.h include/libxml2/libxml/xmlexports.h
	$(call ship_dll,libxml2)
	touch $(@)

# libxslt

src/libxslt/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://xmlsoft.org/sources/libxslt-1.1.26.tar.gz
	echo '55dd52b42861f8a02989d701ef716d6280bfa02971e967c285016f99c66e3db1  dcache/libxslt-1.1.26.tar.gz' | sha256sum -c
	$(untar) dcache/libxslt-*.tar.gz -C $(dir $@)
	sed -i -e '/^#define.*nprintf/d' $(dir $@)/libxslt/win32config.h
	sed -i -e 's/^\(#if defined(WIN32)\).*/\1/' $(dir $@)/libxslt/libxslt.h
	touch $(@)

src/libxslt/config.status: src/libxslt/source-stamp
src/libxslt/config.status: src/libxml2/install-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--disable-static \
		--with-libxml-prefix=$(usr) \
		--with-libxml-include-prefix=$(usr)/include/libxml2/ \
		--without-crypto \
		--without-debug \
		--without-debugger \
		--without-plugins

src/libxslt/build-stamp: src/libxslt/config.status
	$(MAKE) -C $(dir $@)/libxslt/
	touch $(@)

src/libxslt/install-stamp: src/libxslt/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@)/libxslt/ install
	$(call ship_dll,libxslt)
	touch $(@)

# FreeType

src/freetype/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://download.savannah.gnu.org/releases/freetype/freetype-2.4.9.tar.bz2
	echo 'c4204ac1d48e99d4375a2f32bf4f3f92780a9d9f015e64e57e852f6c004859b9  dcache/freetype-2.4.9.tar.bz2' | sha256sum -c
	$(untar) dcache/freetype-*.tar.bz2 -C $(dir $@)
	touch $(@)

src/freetype/config.status: src/freetype/source-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--without-zlib \
		--disable-static
	touch $(@)

src/freetype/build-stamp: src/freetype/config.status
	$(MAKE) -C $(dir $@)
	touch $(@)

src/freetype/install-stamp: src/freetype/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@) install
	$(call ship_dll,libfreetype)
	touch $(@)

# fontconfig

src/fontconfig/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://www.freedesktop.org/software/fontconfig/release/fontconfig-2.9.0.tar.gz
	echo 'ca7e25071cf044bdcdaf7c48845243c115b9269b4e369c6bd78a29e71f01b41a  dcache/fontconfig-2.9.0.tar.gz' | sha256sum -c
	$(untar) dcache/fontconfig-*.tar.gz -C $(dir $@)
	sed -i -e 's/"append"/"prepend"/g' src/fontconfig/conf.d/*-urw-aliases.conf
	touch $(@)

src/fontconfig/config.status: src/fontconfig/source-stamp
src/fontconfig/config.status: src/freetype/install-stamp
src/fontconfig/config.status: src/libxml2/install-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--with-freetype-config=$(usr)/freetype-config \
		--with-add-fonts=CUSTOMFONTDIR \
		--enable-libxml2 \
		--disable-static \
		--disable-docs

src/fontconfig/build-stamp: src/fontconfig/config.status
	$(MAKE) -C $(dir $@)/
	touch $(@)

src/fontconfig/install-stamp: src/fontconfig/build-stamp
	mkdir -p dist/etc/fonts/conf.d/
	$(MAKE) -C $(dir $@)/ install RUN_FC_CACHE_TEST=false
	$(call ship_dll,libfontconfig)
	cp etc/fonts/fonts.conf dist/etc/fonts/
	cp etc/fonts/fonts.dtd dist/etc/fonts/
	cp etc/fonts/conf.d/[3-6]*.conf dist/etc/fonts/conf.d/
	touch $(@)

# GNU gettext

src/gettext/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.1.1.tar.gz
	echo '93ac71a7afa5b70c1b1032516663658c51e653087f42a3fc8044752c026443e9  dcache/gettext-0.18.1.1.tar.gz' | sha256sum -c
	$(untar) dcache/gettext-*.tar.gz --exclude='gettext-tools' -C $(dir $@)
	sed -r -i -e '/(#undef|#define|extern .*) (v?sn?printf|[*]?setlocale)/d' $(dir $@)/gettext-runtime/intl/libgnuintl.h.in
	sed -r -i -e 's/(-DENABLE_RELOCATABLE)=1/\1=0/' $(dir $@)/gettext-runtime/intl/Makefile.in
	touch $(@)

src/gettext/config.status: src/gettext/source-stamp
src/gettext/config.status: src/winiconv/install-stamp
	cp lib/libiconv.dll $(dir $@)/gettext-runtime/
	cd $(dir $@)/gettext-runtime/ && \
		./configure --host=$(host) --prefix=$(usr) \
		--disable-static \
		--disable-libasprintf \
		--disable-threads
	touch $(@)

src/gettext/build-stamp: src/gettext/config.status
	$(MAKE) -C $(dir $@)/gettext-runtime/intl/ \
		aliaspath='\""; return NULL; "\"' \
		localedir='.'
	touch $(@)

src/gettext/install-stamp: src/gettext/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@)/gettext-runtime/intl/ install
	$(call ship_dll,libintl)
	touch $(@)

# winiconv

src/winiconv/source-stamp:
	mkdir -p $(dir $@)
	$(wget) ftp://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/win-iconv-dev_tml-20100912_win32.zip
	echo 'a5a8f1f6578ce6fcce88bd0fe3b4e7866d4fc158ee6d5dec164f10b443c82f6e  dcache/win-iconv-dev_tml-20100912_win32.zip' | sha256sum -c
	unzip dcache/win-iconv-dev_tml-20100912_win32.zip 'src/tml/win_iconv/*'
	mv src/tml/win_iconv/* $(dir $@)
	rm -r src/tml/
	sed -i -e '/iconv(/ s/const//' $(dir $@)/iconv.h
	touch $(@)

src/winiconv/build-stamp: src/winiconv/source-stamp
	$(CC) $(CFLAGS) -shared $(dir $@)/win_iconv.c -o $(dir $@)/libiconv.dll
	touch $(@)

src/winiconv/install-stamp: src/winiconv/build-stamp
	mkdir -p include/ bin/ lib/ dist/
	cp $(dir $@)/iconv.h include/
	cp $(dir $@)/libiconv.dll bin/
	cp $(dir $@)/libiconv.dll lib/
	$(call ship_dll,libiconv)
	touch $(@)

# libjpeg

src/libjpeg/source-stamp:
	mkdir -p $(dir $@)
	$(wget) http://ftp.debian.org/debian/pool/main/libj/libjpeg6b/libjpeg6b_6b1.orig.tar.gz
	echo 'dbe673129e69eaaed47e3cfccf86b1582fa19862a3ce8189ea8f8cfc1800d9aa  dcache/libjpeg6b_6b1.orig.tar.gz' | sha256sum -c
	$(untar) dcache/libjpeg6b_*.tar.gz -C $(dir $@)
	touch $(@)

src/libjpeg/config.status: src/libjpeg/source-stamp
	cd $(dir $@) && \
		./configure --host=$(host) --prefix=$(usr) \
		--disable-static

src/libjpeg/build-stamp: src/libjpeg/config.status
	$(MAKE) -C $(dir $@)
	touch $(@)

src/libjpeg/install-stamp: src/libjpeg/build-stamp
	mkdir -p dist/
	$(MAKE) -C $(dir $@) install
	$(call ship_dll,libjpeg)
	touch $(@)

# URW fonts

src/urw-fonts/source-stamp:
	mkdir -p dcache/urw-fonts/ $(dir $@)
	cd dcache/urw-fonts/ && wget -c -A '*.pfb' -r -nd -np http://svn.ghostscript.com/ghostscript/tags/urw-fonts-1.0.7pre44/
	[ "$$(cat dcache/urw-fonts/*.pfb | sha256sum)" = '41eab7d27c2ba72e68d851d7574a66f9a618d9cca10feb14e137b53917f3f2b2  -' ]
	cp dcache/urw-fonts/*.pfb $(dir $@)
	touch $(@)

src/urw-fonts/build-stamp: src/urw-fonts/source-stamp
	touch $(@)

src/urw-fonts/install-stamp: src/urw-fonts/build-stamp
	mkdir -p dist/fonts/ dist/doc/
	cp $(dir $@)/*.pfb dist/fonts/
	rst2html COPYING.fonts.txt > dist/doc/COPYING.fonts.html
	touch $(@)

# MinGW runtime

src/mingwrt/install-stamp:
	mkdir -p $(dir $@) bin/ dist/
	cp $(shell $(CXX) -print-file-name=libstdc++-6.dll) bin/
	cp $(shell $(CXX) -print-file-name=libgcc_s_sjlj-1.dll) bin/
	$(call ship_dll,libstdc++)
	$(call ship_dll,libgcc_s)
	touch $(@)

# tests

.PHONY: test
test: install
	 $(MAKE) -C ../tests/ pdf2djvu='wine32 ../win32/dist/pdf2djvu.exe'

# vim:ts=4 sts=4 sw=4 noet
