speedo: Revamped speedo and include a w32 installer.
[gnupg.git] / build-aux / speedo.mk
index 4870256..34d5f98 100644 (file)
@@ -19,7 +19,7 @@
 # speedo does only work with GNU make.  The build system is similar to
 # that of gpg4win.  The following commands are supported:
 #
-#   make -f speedo.mk all
+#   make -f speedo.mk all  pkg2rep=/dir/with/tarballs
 # or
 #   make -f speedo.mk
 #
 # Lists packages and versions.
 #
 
+# We need to know our own name.
+SPEEDO_MK := $(realpath $(lastword $(MAKEFILE_LIST)))
+
 
 # Set this to "git" or "release".
-WHAT=release
+WHAT=git
 
 # Set target to "native" or "w32"
-TARGETOS=native
+TARGETOS=w32
+
+# Set to the location of the directory with traballs of
+# external packages.
+TARBALLS=$(shell pwd)/../tarballs
 
 #  Number of parallel make jobs
 MAKE_J=3
 
+# =====BEGIN LIST OF PACKAGES=====
 # The packages that should be built.  The order is also the build order.
-speedo_spkgs  = libgpg-error npth libgcrypt libassuan libksba gnupg gpgme
+# Fixme: Do we need to build pkg-config for cross-building?
+
+speedo_spkgs  = \
+       libgpg-error npth libgcrypt
+
+ifeq ($(TARGETOS),w32)
+speedo_spkgs += \
+       zlib libiconv gettext
+endif
+
+speedo_spkgs += \
+       libassuan libksba gnupg
 
-ifneq ($(TARGETOS),w32)
-speedo_spkgs +=        gpa
+ifeq ($(TARGETOS),w32)
+speedo_spkgs += \
+       libffi glib pkg-config
 endif
 
+speedo_spkgs += \
+       gpgme
+
 ifeq ($(TARGETOS),w32)
-speedo_spkgs += gpgex
+speedo_spkgs += \
+       libpng \
+       gdk-pixbuf atk pixman cairo pango gtk+
 endif
 
+speedo_spkgs += \
+       pinentry gpa
+
+ifeq ($(TARGETOS),w32)
+speedo_spkgs += \
+       gpgex
+endif
+
+# =====END LIST OF PACKAGES=====
+
+
+# Packages which are additionally build for 64 bit Windows
+speedo_w64_spkgs  = \
+       libgpg-error libiconv gettext libassuan gpgex
+
+# Packages which use the gnupg autogen.sh build style
+speedo_gnupg_style = \
+       libgpg-error npth libgcrypt  \
+       libassuan libksba gnupg gpgme \
+       pinentry gpa gpgex
+
+# Packages which use only make and no build directory
+speedo_make_only_style = \
+       zlib
 
 # Version numbers of the released packages
 # Fixme: Take the version numbers from gnupg-doc/web/swdb.mac
-libgpg_error_ver = 1.12
+libgpg_error_ver = 1.13
 npth_ver = 0.91
-libgcrypt_ver = 1.6.0
+libgcrypt_ver = 1.6.1
 libassuan_ver = 2.1.1
 libksba_ver = 1.3.0
-gnupg_ver = 2.0.22
 gpgme_ver = 1.5.0
+pinentry_ver = 0.8.4
 gpa_ver = 0.9.5
 gpgex_ver = 1.0.0
 
+
+# Version number for external packages
+pkg_config_ver = 0.23
+zlib_ver = 1.2.8
+libiconv_ver = 1.14
+gettext_ver = 0.18.2.1
+libffi_ver = 3.0.13
+glib_ver = 2.34.3
+libpng_ver = 1.4.12
+gdk_pixbuf_ver = 2.26.5
+atk_ver = 1.32.0
+pango_ver = 1.29.4
+pixman_ver = 0.32.4
+cairo_ver = 1.12.16
+gtk__ver = 2.24.17
+
+
 # The GIT repository.  Using a local repo is much faster.
 #gitrep = git://git.gnupg.org
 gitrep = ${HOME}/s
 
-# The tarball directory
+# The tarball directories
 pkgrep = ftp://ftp.gnupg.org/gcrypt
-
+pkg2rep = $(TARBALLS)
 
 # For each package, the following variables can be defined:
 #
@@ -117,10 +183,10 @@ ifeq ($(WHAT),git)
   speedo_pkg_libgcrypt_gitref = LIBGCRYPT-1-6-BRANCH
   speedo_pkg_libksba_git = $(gitrep)/libksba
   speedo_pkg_libksba_gitref = master
-  speedo_pkg_gnupg_git = $(gitrep)/gnupg
-  speedo_pkg_gnupg_gitref = master
   speedo_pkg_gpgme_git = $(gitrep)/gpgme
   speedo_pkg_gpgme_gitref = master
+  speedo_pkg_pinentry_git = $(gitrep)/pinentry
+  speedo_pkg_pinentry_gitref = master
   speedo_pkg_gpa_git = $(gitrep)/gpa
   speedo_pkg_gpa_gitref = master
   speedo_pkg_gpgex_git = $(gitrep)/gpgex
@@ -136,57 +202,182 @@ else
        $(pkgrep)/libgcrypt/libgcrypt-$(libgcrypt_ver).tar.bz2
   speedo_pkg_libksba_tar = \
        $(pkgrep)/libksba/libksba-$(libksba_ver).tar.bz2
-  speedo_pkg_gnupg_tar = \
-       $(pkgrep)/gnupg/gnupg-$(gnupg_ver).tar.bz2
   speedo_pkg_gpgme_tar = \
        $(pkgrep)/gpgme/gpgme-$(gpgme_ver).tar.bz2
+  speedo_pkg_pinentry_tar = \
+       $(pkgrep)/pinentry/pinentry-$(pinentry_ver).tar.bz2
   speedo_pkg_gpa_tar = \
        $(pkgrep)/gpa/gpa-$(gpa_ver).tar.bz2
-  speedo_pkg_gpex_tar = \
+  speedo_pkg_gpgex_tar = \
        $(pkgrep)/gpex/gpgex-$(gpa_ver).tar.bz2
 endif
 
+speedo_pkg_pkg_config_tar = $(pkg2rep)/pkg-config-$(pkg_config_ver).tar.gz
+speedo_pkg_zlib_tar       = $(pkg2rep)/zlib-$(zlib_ver).tar.gz
+speedo_pkg_libiconv_tar   = $(pkg2rep)/libiconv-$(libiconv_ver).tar.gz
+speedo_pkg_gettext_tar    = $(pkg2rep)/gettext-$(gettext_ver).tar.gz
+speedo_pkg_libffi_tar     = $(pkg2rep)/libffi-$(libffi_ver).tar.gz
+speedo_pkg_glib_tar       = $(pkg2rep)/glib-$(glib_ver).tar.xz
+speedo_pkg_libpng_tar     = $(pkg2rep)/libpng-$(libpng_ver).tar.bz2
+speedo_pkg_gdk_pixbuf_tar = $(pkg2rep)/gdk-pixbuf-$(gdk_pixbuf_ver).tar.xz
+speedo_pkg_atk_tar        = $(pkg2rep)/atk-$(atk_ver).tar.bz2
+speedo_pkg_pango_tar      = $(pkg2rep)/pango-$(pango_ver).tar.bz2
+speedo_pkg_pixman_tar     = $(pkg2rep)/pixman-$(pixman_ver).tar.gz
+speedo_pkg_cairo_tar      = $(pkg2rep)/cairo-$(cairo_ver).tar.xz
+speedo_pkg_gtk__tar       = $(pkg2rep)/gtk+-$(gtk__ver).tar.xz
+
+
+#
+# Package build options
+#
+
 speedo_pkg_libgpg_error_configure = --enable-static
+speedo_pkg_w64_libgpg_error_configure = --enable-static
 
 speedo_pkg_libassuan_configure = --enable-static
+speedo_pkg_w64_libassuan_configure = --enable-static
 
 speedo_pkg_libgcrypt_configure = --disable-static
 
 speedo_pkg_libksba_configure = --disable-static
 
+speedo_pkg_gnupg_configure = --enable-gpg2-is-gpg --disable-g13
+speedo_pkg_gnupg_extracflags = -g
+
+define speedo_pkg_gnupg_post_install
+(set -e; \
+ sed -n  's/.*PACKAGE_VERSION "\(.*\)"/\1/p' config.h >$(idir)/INST_VERSION; \
+ sed -n  's/.*W32INFO_VI_PRODUCTVERSION \(.*\)/\1/p' common/w32info-rc.h \
+    |sed 's/,/./g' >$(idir)/INST_PROD_VERSION )
+endef
+
+
+# The LDFLAGS is needed for -lintl for glib.
+speedo_pkg_gpgme_configure = \
+       --enable-static --enable-w32-glib --disable-w32-qt \
+       --with-gpg-error-prefix=$(idir) \
+       LDFLAGS=-L$(idir)/lib
+
+speedo_pkg_pinentry_configure = \
+       --disable-pinentry-qt --disable-pinentry-qt4 --disable-pinentry-gtk \
+       --enable-pinentry-gtk2 \
+       --with-glib-prefix=$(idir) --with-gtk-prefix=$(idir) \
+       CPPFLAGS=-I$(idir)/include   \
+       LDFLAGS=-L$(idir)/lib        \
+       CXXFLAGS=-static-libstdc++
+
+speedo_pkg_gpa_configure = \
+        --with-libiconv-prefix=$(idir) --with-libintl-prefix=$(idir) \
+        --with-gpgme-prefix=$(idir) --with-zlib=$(idir) \
+        --with-libassuan-prefix=$(idir) --with-gpg-error-prefix=$(idir)
+
+speedo_pkg_gpgex_configure = \
+       --with-gpg-error-prefix=$(idir) \
+       --with-libassuan-prefix=$(idir)
+
+speedo_pkg_w64_gpgex_configure = \
+       --with-gpg-error-prefix=$(idir6) \
+       --with-libassuan-prefix=$(idir6)
+
+
+#
+# External packages
+#
+
+speedo_pkg_zlib_make_args = \
+        -fwin32/Makefile.gcc PREFIX=$(host)- IMPLIB=libz.dll.a
+
+speedo_pkg_zlib_make_args_inst = \
+        -fwin32/Makefile.gcc \
+        BINARY_PATH=$(idir)/bin INCLUDE_PATH=$(idir)/include \
+       LIBRARY_PATH=$(idir)/lib SHARED_MODE=1 IMPLIB=libz.dll.a
+
+# Zlib needs some special magic to generate a libtool file.
+# We also install the pc file here.
+define speedo_pkg_zlib_post_install
+(set -e; mkdir $(idir)/lib/pkgconfig || true;          \
+cp $(auxsrc)/zlib.pc $(idir)/lib/pkgconfig/;           \
+cd $(idir);                                            \
+echo "# Generated by libtool" > lib/libz.la            \
+echo "dlname='../bin/zlib1.dll'" >> lib/libz.la;       \
+echo "library_names='libz.dll.a'" >> lib/libz.la;      \
+echo "old_library='libz.a'" >> lib/libz.la;            \
+echo "dependency_libs=''" >> lib/libz.la;              \
+echo "current=1" >> lib/libz.la;                       \
+echo "age=2" >> lib/libz.la;                           \
+echo "revision=5" >> lib/libz.la;                      \
+echo "installed=yes" >> lib/libz.la;                   \
+echo "shouldnotlink=no" >> lib/libz.la;                        \
+echo "dlopen=''" >> lib/libz.la;                       \
+echo "dlpreopen=''" >> lib/libz.la;                    \
+echo "libdir=\"$(idir)/lib\"" >> lib/libz.la)
+endef
+
+speedo_pkg_w64_libiconv_configure = \
+       --enable-shared=no --enable-static=yes
+
+speedo_pkg_gettext_configure = \
+       --with-lib-prefix=$(idir) --with-libiconv-prefix=$(idir) \
+        CPPFLAGS=-I$(idir)/include LDFLAGS=-L$(idir)/lib
+speedo_pkg_w64_gettext_configure = \
+       --with-lib-prefix=$(idir) --with-libiconv-prefix=$(idir) \
+        CPPFLAGS=-I$(idir6)/include LDFLAGS=-L$(idir6)/lib
+speedo_pkg_gettext_extracflags = -O2
+# We only need gettext-runtime and there is sadly no top level
+# configure option for this
+speedo_pkg_gettext_make_dir = gettext-runtime
+
+
+speedo_pkg_glib_configure = \
+       --disable-modular-tests \
+       --with-lib-prefix=$(idir) --with-libiconv-prefix=$(idir) \
+       CPPFLAGS=-I$(idir)/include \
+       LDFLAGS=-L$(idir)/lib \
+       CCC=$(host)-g++ \
+        LIBFFI_CFLAGS=-I$(idir)/lib/libffi-$(libffi_ver)/include \
+       LIBFFI_LIBS=\"-L$(idir)/lib -lffi\"
+speedo_pkg_glib_extracflags = -march=i486
+
+
+speedo_pkg_libpng_configure = \
+       CPPFLAGS=\"-I$(idir)/include -DPNG_BUILD_DLL\" \
+       LDFLAGS=\"-L$(idir)/lib\" LIBPNG_DEFINES=\"-DPNG_BUILD_DLL\"
+
+speedo_pkg_pixman_configure = \
+       CPPFLAGS=-I$(idir)/include \
+       LDFLAGS=-L$(idir)/lib
+
+speedo_pkg_cairo_configure = \
+       --disable-qt --disable-ft --disable-fc \
+       --enable-win32 --enable-win32-font \
+       CPPFLAGS=-I$(idir)/include \
+       LDFLAGS=-L$(idir)/lib
+
+speedo_pkg_pango_configure = \
+       --disable-gtk-doc  \
+       CPPFLAGS=-I$(idir)/include \
+       LDFLAGS=-L$(idir)/lib
+
+speedo_pkg_gtk__configure = \
+       --disable-cups \
+       CPPFLAGS=-I$(idir)/include \
+       LDFLAGS=-L$(idir)/lib
+
 
 # ---------
 
 all: all-speedo
-       @echo export PATH=\"$(idir)/bin\":\$$PATH
-       @echo export LD_LIBRARY_PATH=\"$(idir)/lib\":\$$LD_LIBRARY_PATH
-       @echo hash -r
 
 report: report-speedo
 
 clean: clean-speedo
 
-
-# Fixme: The dist target does not work anymore.
+ifeq ($(TARGETOS),w32)
 STRIP = i686-w64-mingw32-strip
-
-dist: all
-       set -e; date=$$(date -u +%Y%m%d); pkgname=gpg-w32-dev-$$date; \
-       rm -rf $$pkgname $${pkgname}.zip || true; \
-       cp -rL playground/install $${pkgname}; \
-       rm -r $${pkgname}/share/info || true; \
-       mkdir -p $${pkgname}/share/doc/gpg-w32-dev ;\
-       echo "Included versions:" > $${pkgname}/README.txt ; \
-       echo ""                   >> $${pkgname}/README.txt ; \
-       $(MAKE) --no-print-directory report \
-              | awk '{print $$2}' >> $${pkgname}/README.txt ; \
-       cp GNUmakefile speedo.mk $${pkgname}/README.txt \
-                  $${pkgname}/share/doc/gpg-w32-dev/ ; \
-       $(STRIP) $${pkgname}/bin/*.dll ; \
-       zip -r9 $${pkgname}.zip $${pkgname} >/dev/null ; \
-       rm -rf $$pkgname; \
-       echo "$$pkgname.zip ready for distribution" >&2
-
+else
+STRIP = strip
+endif
+W32CC = i686-w64-mingw32-gcc
 
 -include config.mk
 
@@ -195,21 +386,45 @@ dist: all
 #
 
 MKDIR=mkdir
-
+MAKENSIS=makensis
+BUILD_ISODATE=$(shell date -u +%Y-%m-%d)
 
 # These paths must be absolute, as we switch directories pretty often.
 root := $(shell pwd)/play
-stampdir := $(root)/stamps
 sdir := $(root)/src
 bdir := $(root)/build
+bdir6:= $(root)/build-w64
 idir := $(root)/inst
+idir6:= $(root)/inst-w64
+stampdir := $(root)/stamps
+topsrc := $(shell cd $(dir $(SPEEDO_MK)).. && pwd)
+auxsrc := $(topsrc)/build-aux/speedo
+patdir := $(topsrc)/build-aux/speedo/patches
+w32src := $(topsrc)/build-aux/speedo/w32
 
+# The next two macros will work only after gnupg has been build.
+INST_VERSION=$(shell head -1 $(idir)/INST_VERSION)
+INST_PROD_VERSION=$(shell head -1 $(idir)/INST_PROD_VERSION)
+
+# List with packages
 speedo_build_list = $(speedo_spkgs)
+speedo_w64_build_list = $(speedo_w64_spkgs)
 
+# Determine build and host system
+build := $(shell $(topsrc)/autogen.sh --silent --print-build)
 ifeq ($(TARGETOS),w32)
-  speedo_autogen_buildopt="--build-w32"
+  speedo_autogen_buildopt := --build-w32
+  speedo_autogen_buildopt6 := --build-w64
+  host := $(shell $(topsrc)/autogen.sh --silent --print-host --build-w32)
+  host6:= $(shell $(topsrc)/autogen.sh --silent --print-host --build-w64)
+  speedo_host_build_option := --host=$(host) --build=$(build)
+  speedo_host_build_option6 := --host=$(host6) --build=$(build)
+  speedo_w32_cflags := -mms-bitfields
 else
-  speedo_autogen_buildopt=
+  speedo_autogen_buildopt :=
+  host :=
+  speedo_host_build_option :=
+  speedo_w32_cflags :=
 endif
 
 ifeq ($(MAKE_J),)
@@ -219,14 +434,20 @@ else
 endif
 
 
+
+
 # The playground area is our scratch area, where we unpack, build and
 # install the packages.
 $(stampdir)/stamp-directories:
-       $(MKDIR) $(root)
-       $(MKDIR) $(stampdir)
-       $(MKDIR) $(sdir)
-       $(MKDIR) $(bdir)
-       $(MKDIR) $(idir)
+       $(MKDIR) $(root) || true
+       $(MKDIR) $(stampdir) || true
+       $(MKDIR) $(sdir)  || true
+       $(MKDIR) $(bdir)  || true
+       $(MKDIR) $(idir)   || true
+ifeq ($(TARGETOS),w32)
+       $(MKDIR) $(bdir6)  || true
+       $(MKDIR) $(idir6)   || true
+endif
        touch $(stampdir)/stamp-directories
 
 # Frob the name $1 by converting all '-' and '+' characters to '_'.
@@ -246,17 +467,60 @@ define SETVARS
        gitref="$(call GETVAR,speedo_pkg_$(1)_gitref)";                 \
        tar="$(call GETVAR,speedo_pkg_$(1)_tar)";                       \
        pkgsdir="$(sdir)/$(1)";                                         \
+       if [ "$(1)" = "gnupg" ]; then                                   \
+         git='';                                                       \
+         gitref='';                                                    \
+         tar='';                                                       \
+          pkgsdir="$(topsrc)";                                          \
+        fi;                                                             \
        pkgbdir="$(bdir)/$(1)";                                         \
        pkgcfg="$(call GETVAR,speedo_pkg_$(1)_configure)";              \
+       pkgextracflags="$(call GETVAR,speedo_pkg_$(1)_extracflags)";    \
+       pkgmkdir="$(call GETVAR,speedo_pkg_$(1)_make_dir)";             \
        pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)";           \
        pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
+       export PKG_CONFIG="/usr/bin/pkg-config";                        \
+       export PKG_CONFIG_PATH="$(idir)/lib/pkgconfig";                 \
+       export PKG_CONFIG_LIBDIR="";                                    \
+       export SYSROOT="$(idir)";                                       \
        export PATH="$(idir)/bin:$${PATH}";                             \
        export LD_LIBRARY_PATH="$(idir)/lib:$${LD_LIBRARY_PATH}"
 endef
 
+define SETVARS_W64
+       pkg="$(1)";                                                     \
+       git="$(call GETVAR,speedo_pkg_$(1)_git)";                       \
+       gitref="$(call GETVAR,speedo_pkg_$(1)_gitref)";                 \
+       tar="$(call GETVAR,speedo_pkg_$(1)_tar)";                       \
+       pkgsdir="$(sdir)/$(1)";                                         \
+       if [ "$(1)" = "gnupg" ]; then                                   \
+         git='';                                                       \
+         gitref='';                                                    \
+         tar='';                                                       \
+          pkgsdir="$(topsrc)";                                          \
+        fi;                                                             \
+       pkgbdir="$(bdir6)/$(1)";                                        \
+       pkgcfg="$(call GETVAR,speedo_pkg_w64_$(1)_configure)";          \
+       pkgextracflags="$(call GETVAR,speedo_pkg_$(1)_extracflags)";    \
+       pkgmkdir="$(call GETVAR,speedo_pkg_$(1)_make_dir)";             \
+       pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)";           \
+       pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
+       export PKG_CONFIG="/usr/bin/pkg-config";                        \
+       export PKG_CONFIG_PATH="$(idir6)/lib/pkgconfig";                \
+       export PKG_CONFIG_LIBDIR="";                                    \
+       export SYSROOT="$(idir6)";                                      \
+       export PATH="$(idir6)/bin:$${PATH}";                            \
+       export LD_LIBRARY_PATH="$(idir6)/lib:$${LD_LIBRARY_PATH}"
+endef
+
 
 # Template for source packages.
-
+#
+# Note that the gnupg package is special: The package source dir is
+# the same as the topsrc dir and thus we need to detect the gnupg
+# package and cd to that directory.  We also test that no in-source build
+# has been done.  autogen.sh is not run for gnupg.
+#
 define SPKG_template
 
 $(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
@@ -265,7 +529,15 @@ $(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
        @echo "speedo:  */"
        @(set -e; cd $(sdir);                           \
         $(call SETVARS,$(1));                          \
-        if [ -n "$$$${git}" ]; then                    \
+        if [ "$(1)" = "gnupg" ]; then                  \
+          cd $$$${pkgsdir};                            \
+           if [ -f config.log ]; then                   \
+             echo "GnuPG has already been build in-source" >&2  ;\
+            echo "Please run \"make distclean\" and retry" >&2 ;\
+            exit 1 ;                                   \
+           fi;                                          \
+          echo "speedo: unpacking gnupg not needed";   \
+        elif [ -n "$$$${git}" ]; then                  \
           echo "speedo: unpacking $(1) from $$$${git}:$$$${gitref}"; \
            git clone -b "$$$${gitref}" "$$$${git}" "$$$${pkg}"; \
           cd "$$$${pkg}";                              \
@@ -275,6 +547,7 @@ $(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
            case "$$$${tar}" in                         \
              *.gz) opt=z ;;                            \
              *.bz2) opt=j ;;                           \
+            *.xz) opt=J ;;                             \
              *) opt= ;;                                        \
            esac;                                       \
            case "$$$${tar}" in                         \
@@ -285,6 +558,13 @@ $(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
           base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
                  | sed -e 's,\.tar.*$$$$,,'`;          \
           mv $$$${base} $(1);                          \
+          patch="$(patdir)/$(1)-$$$${base#$(1)-}.patch";\
+          if [ -x "$$$${patch}" ]; then                \
+             echo "speedo: applying patch $$$${patch}"; \
+             cd $(1); "$$$${patch}";                   \
+          elif [ -f "$$$${patch}" ]; then              \
+             echo "speedo: warning: $$$${patch} is not executable"; \
+          fi;                                          \
         else                                           \
           echo "speedo: unpacking $(1) from UNKNOWN";  \
         fi)
@@ -292,43 +572,152 @@ $(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
 
 $(stampdir)/stamp-$(1)-01-configure: $(stampdir)/stamp-$(1)-00-unpack
        @echo "speedo: configuring $(1)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
+       @echo "speedo: configure run not required"
+else ifneq ($(findstring $(1),$(speedo_gnupg_style)),)
        @($(call SETVARS,$(1));                         \
         mkdir "$$$${pkgbdir}";                         \
-        cd "$$$${pkgbdir}";                            \
-        if [ -n "$(speedo_autogen_buildopt)" ]; then   \
-           eval AUTOGEN_SH_SILENT=1 w32root="$(idir)"  \
-                 "$$$${pkgsdir}/autogen.sh"             \
-                 $(speedo_autogen_buildopt)             \
-                $$$${pkgcfg};                          \
-        else                                           \
+        cd "$$$${pkgbdir}";                            \
+         if [ -n "$(speedo_autogen_buildopt)" ]; then   \
+            eval AUTOGEN_SH_SILENT=1 w32root="$(idir)"  \
+               "$$$${pkgsdir}/autogen.sh"               \
+               $(speedo_autogen_buildopt)              \
+               $$$${pkgcfg}                            \
+               CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
+         else                                          \
             eval "$$$${pkgsdir}/configure"             \
-                --silent                               \
-                --enable-maintainer-mode               \
-                 --prefix="$(idir)"                    \
-                $$$${pkgcfg};                          \
+              --silent                                 \
+              --enable-maintainer-mode                 \
+               --prefix="$(idir)"                      \
+               $$$${pkgcfg}                            \
+               CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
         fi)
+else
+       @($(call SETVARS,$(1));                         \
+        mkdir "$$$${pkgbdir}";                         \
+        cd "$$$${pkgbdir}";                            \
+        eval "$$$${pkgsdir}/configure"                 \
+            --silent $(speedo_host_build_option)       \
+             --prefix="$(idir)"                                \
+            $$$${pkgcfg}                               \
+             CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
+        )
+endif
        @touch $(stampdir)/stamp-$(1)-01-configure
 
+# Note that unpack has no 64 bit version becuase it is just the source.
+# Fixme: We should use templates to create the standard and w64
+# version of these rules.
+$(stampdir)/stamp-w64-$(1)-01-configure: $(stampdir)/stamp-$(1)-00-unpack
+       @echo "speedo: configuring $(1) (64 bit)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
+       @echo "speedo: configure run not required"
+else ifneq ($(findstring $(1),$(speedo_gnupg_style)),)
+       @($(call SETVARS_W64,$(1));                     \
+        mkdir "$$$${pkgbdir}";                         \
+        cd "$$$${pkgbdir}";                            \
+         if [ -n "$(speedo_autogen_buildopt)" ]; then   \
+            eval AUTOGEN_SH_SILENT=1 w64root="$(idir6)" \
+               "$$$${pkgsdir}/autogen.sh"               \
+               $(speedo_autogen_buildopt6)             \
+               $$$${pkgcfg}                            \
+               CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
+         else                                          \
+            eval "$$$${pkgsdir}/configure"             \
+              --silent                                 \
+              --enable-maintainer-mode                 \
+               --prefix="$(idir6)"                     \
+               $$$${pkgcfg}                            \
+               CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
+        fi)
+else
+       @($(call SETVARS_W64,$(1));                     \
+        mkdir "$$$${pkgbdir}";                         \
+        cd "$$$${pkgbdir}";                            \
+        eval "$$$${pkgsdir}/configure"                 \
+            --silent $(speedo_host_build_option6)      \
+             --prefix="$(idir6)"                       \
+            $$$${pkgcfg}                               \
+             CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
+        )
+endif
+       @touch $(stampdir)/stamp-w64-$(1)-01-configure
+
+
 $(stampdir)/stamp-$(1)-02-make: $(stampdir)/stamp-$(1)-01-configure
        @echo "speedo: making $(1)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
        @($(call SETVARS,$(1));                         \
-         cd "$$$${pkgbdir}";                           \
+          cd "$$$${pkgsdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
          $(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
+else
+       @($(call SETVARS,$(1));                         \
+          cd "$$$${pkgbdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
+         $(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=1)
+endif
        @touch $(stampdir)/stamp-$(1)-02-make
 
+$(stampdir)/stamp-w64-$(1)-02-make: $(stampdir)/stamp-w64-$(1)-01-configure
+       @echo "speedo: making $(1) (64 bit)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
+       @($(call SETVARS_W64,$(1));                             \
+          cd "$$$${pkgsdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
+         $(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
+else
+       @($(call SETVARS_W64,$(1));                             \
+          cd "$$$${pkgbdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
+         $(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=1)
+endif
+       @touch $(stampdir)/stamp-w64-$(1)-02-make
+
 # Note that post_install must come last because it may be empty and
 # "; ;" is a syntax error.
 $(stampdir)/stamp-$(1)-03-install: $(stampdir)/stamp-$(1)-02-make
        @echo "speedo: installing $(1)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
        @($(call SETVARS,$(1));                         \
-         cd "$$$${pkgbdir}";                           \
+          cd "$$$${pkgsdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
+         $(MAKE) --no-print-directory $$$${pkgmkargs_inst} install V=1;\
+         $(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
+else
+       @($(call SETVARS,$(1));                         \
+          cd "$$$${pkgbdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
+         $(MAKE) --no-print-directory $$$${pkgmkargs_inst} install-strip V=0;\
+         $(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
+endif
+       touch $(stampdir)/stamp-$(1)-03-install
+
+$(stampdir)/stamp-w64-$(1)-03-install: $(stampdir)/stamp-w64-$(1)-02-make
+       @echo "speedo: installing $(1) (64 bit)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
+       @($(call SETVARS_W64,$(1));                             \
+          cd "$$$${pkgsdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
+         $(MAKE) --no-print-directory $$$${pkgmkargs_inst} install V=1;\
+         $(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
+else
+       @($(call SETVARS_W64,$(1));                             \
+          cd "$$$${pkgbdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
          $(MAKE) --no-print-directory $$$${pkgmkargs_inst} install-strip V=0;\
-         $(call gpg4win_pkg_$(call FROB_macro,$(1))_post_install))
-       @touch $(stampdir)/stamp-$(1)-03-install
+         $(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
+endif
+       touch $(stampdir)/stamp-w64-$(1)-03-install
 
 $(stampdir)/stamp-final-$(1): $(stampdir)/stamp-$(1)-03-install
+       @echo "speedo: $(1) done"
        @touch $(stampdir)/stamp-final-$(1)
 
+$(stampdir)/stamp-w64-final-$(1): $(stampdir)/stamp-w64-$(1)-03-install
+       @echo "speedo: $(1) (64 bit) done"
+       @touch $(stampdir)/stamp-w64-final-$(1)
+
 .PHONY : clean-$(1)
 clean-$(1):
        @echo "speedo: uninstalling $(1)"
@@ -339,6 +728,11 @@ clean-$(1):
         rm -fR "$$$${pkgsdir}" "$$$${pkgbdir}" || true)
        -rm -f $(stampdir)/stamp-final-$(1) $(stampdir)/stamp-$(1)-*
 
+
+.PHONY : build-$(1)
+build-$(1): $(stampdir)/stamp-final-$(1)
+
+
 .PHONY : report-$(1)
 report-$(1):
        @($(call SETVARS,$(1));                         \
@@ -363,6 +757,9 @@ endef
 $(foreach spkg, $(speedo_spkgs), $(eval $(call SPKG_template,$(spkg))))
 
 $(stampdir)/stamp-final: $(stampdir)/stamp-directories
+ifeq ($(TARGETOS),w32)
+$(stampdir)/stamp-final: $(addprefix $(stampdir)/stamp-w64-final-,$(speedo_w64_build_list))
+endif
 $(stampdir)/stamp-final: $(addprefix $(stampdir)/stamp-final-,$(speedo_build_list))
        touch $(stampdir)/stamp-final
 
@@ -377,4 +774,55 @@ clean-stamps:
 clean-speedo:
        $(RM) -fR play
 
-.PHONY : all-speedo report-speedo clean-stamps clean-speedo
+
+#
+# Windows installer
+#
+
+dist-source: all
+       for i in 00 01 02 03; do sleep 1;touch play/stamps/stamp-*-${i}-*;done
+       tar -cvJf gnupg-$(INST_VERSION)_$(BUILD_ISODATE).tar.xz \
+           --exclude-backups --exclude-vc \
+           patches play/stamps/stamp-*-00-unpack play/src
+
+
+$(bdir)/NEWS.tmp: $(topsrc)/NEWS
+       sed -e '/^#/d' <$(topsrc)/NEWS >$(bdir)/NEWS.tmp
+
+$(bdir)/README.txt: $(bdir)/NEWS.tmp $(w32src)/README.txt \
+                    $(w32src)/pkg-copyright.txt
+       sed -e '/^;.*/d;' \
+       -e '/!NEWSFILE!/{r NEWS.tmp' -e 'd;}' \
+        -e '/!PKG-COPYRIGHT!/{r $(w32src)/pkg-copyright.txt' -e 'd;}' \
+        -e 's,!VERSION!,$(INST_VERSION),g' \
+          < $(w32src)/README.txt \
+           | awk '{printf "%s\r\n", $$0}' >$(bdir)/README.txt
+
+$(bdir)/g4wihelp.dll: $(w32src)/g4wihelp.c $(w32src)/exdll.h
+       (set -e; cd $(bdir); \
+        $(W32CC) -I. -shared -O2 -o g4wihelp.dll $(w32src)/g4wihelp.c \
+                 -lwinmm -lgdi32; \
+        $(STRIP) g4wihelp.dll)
+
+w32_insthelpers: $(bdir)/g4wihelp.dll
+
+$(bdir)/inst-options.ini: $(w32src)/inst-options.ini
+       cat $(w32src)/inst-options.ini >$(bdir)/inst-options.ini
+
+installer: all w32_insthelpers $(bdir)/inst-options.ini $(bdir)/README.txt
+       $(MAKENSIS) -V2 \
+                    -DINST_DIR=$(idir) \
+                    -DINST6_DIR=$(idir6) \
+                    -DBUILD_DIR=$(bdir) \
+                    -DTOP_SRCDIR=$(topsrc) \
+                    -DW32_SRCDIR=$(w32src) \
+                    -DBUILD_ISODATE=$(BUILD_ISODATE) \
+                   -DVERSION=$(INST_VERSION) \
+                   -DPROD_VERSION=$(INST_PROD_VERSION) \
+                   $(w32src)/inst.nsi
+
+#
+# Mark phony targets
+#
+.PHONY: all-speedo report-speedo clean-stamps clean-speedo installer \
+       w32_insthelpers