speedo: Revamped speedo and include a w32 installer.
authorWerner Koch <wk@gnupg.org>
Tue, 10 Jun 2014 17:42:34 +0000 (19:42 +0200)
committerWerner Koch <wk@gnupg.org>
Tue, 10 Jun 2014 19:34:39 +0000 (21:34 +0200)
* build-aux/speedo/: New.
* build-aux/speedo/w32/: New.
--

The new installer uses some code from Gpg4win but is much smaller and
easier to maintain.  To build an installer, unpack GnuPG and then run

  make -f build-aux/speedo.mk  TARBALLS=~/mytarballs installer

~/mytarballs is a directory with tarballs of external libraries.  See
speedo.mk for a list of them.

WARNING: The installed W32 version does not correctly work right now.

13 files changed:
.gitignore
build-aux/speedo.mk
build-aux/speedo/patches/atk-1.32.0.patch [new file with mode: 0755]
build-aux/speedo/patches/pango-1.29.4.patch [new file with mode: 0755]
build-aux/speedo/w32/README.txt [new file with mode: 0644]
build-aux/speedo/w32/exdll.h [new file with mode: 0644]
build-aux/speedo/w32/g4wihelp.c [new file with mode: 0644]
build-aux/speedo/w32/gdk-pixbuf-loaders.cache [new file with mode: 0755]
build-aux/speedo/w32/inst-options.ini [new file with mode: 0644]
build-aux/speedo/w32/inst.nsi [new file with mode: 0644]
build-aux/speedo/w32/pango.modules [new file with mode: 0755]
build-aux/speedo/w32/pkg-copyright.txt [new file with mode: 0644]
build-aux/speedo/zlib.pc [new file with mode: 0644]

index 6502072..d4816a1 100644 (file)
@@ -21,6 +21,7 @@ keyserver/gpg2keys_test
 tools/gpg-zip
 
 # Files created by make when not using a VPATH build
 tools/gpg-zip
 
 # Files created by make when not using a VPATH build
+play/
 *.o
 po/en@boldquot.insert-header
 po/en@boldquot.po
 *.o
 po/en@boldquot.insert-header
 po/en@boldquot.po
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:
 #
 # 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
 #
 # or
 #   make -f speedo.mk
 #
 # Lists packages and versions.
 #
 
 # Lists packages and versions.
 #
 
+# We need to know our own name.
+SPEEDO_MK := $(realpath $(lastword $(MAKEFILE_LIST)))
+
 
 # Set this to "git" or "release".
 
 # Set this to "git" or "release".
-WHAT=release
+WHAT=git
 
 # Set target to "native" or "w32"
 
 # 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
 
 
 #  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.
 # 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
 
 endif
 
+speedo_spkgs += \
+       gpgme
+
 ifeq ($(TARGETOS),w32)
 ifeq ($(TARGETOS),w32)
-speedo_spkgs += gpgex
+speedo_spkgs += \
+       libpng \
+       gdk-pixbuf atk pixman cairo pango gtk+
 endif
 
 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
 
 # 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
 npth_ver = 0.91
-libgcrypt_ver = 1.6.0
+libgcrypt_ver = 1.6.1
 libassuan_ver = 2.1.1
 libksba_ver = 1.3.0
 libassuan_ver = 2.1.1
 libksba_ver = 1.3.0
-gnupg_ver = 2.0.22
 gpgme_ver = 1.5.0
 gpgme_ver = 1.5.0
+pinentry_ver = 0.8.4
 gpa_ver = 0.9.5
 gpgex_ver = 1.0.0
 
 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 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
 pkgrep = ftp://ftp.gnupg.org/gcrypt
-
+pkg2rep = $(TARBALLS)
 
 # For each package, the following variables can be defined:
 #
 
 # 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_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_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
   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
        $(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_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_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
 
        $(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_libgpg_error_configure = --enable-static
+speedo_pkg_w64_libgpg_error_configure = --enable-static
 
 speedo_pkg_libassuan_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_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
 
 # ---------
 
 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
 
 
 report: report-speedo
 
 clean: clean-speedo
 
-
-# Fixme: The dist target does not work anymore.
+ifeq ($(TARGETOS),w32)
 STRIP = i686-w64-mingw32-strip
 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
 
 
 -include config.mk
 
@@ -195,21 +386,45 @@ dist: all
 #
 
 MKDIR=mkdir
 #
 
 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
 
 # These paths must be absolute, as we switch directories pretty often.
 root := $(shell pwd)/play
-stampdir := $(root)/stamps
 sdir := $(root)/src
 bdir := $(root)/build
 sdir := $(root)/src
 bdir := $(root)/build
+bdir6:= $(root)/build-w64
 idir := $(root)/inst
 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_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)
 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
 else
-  speedo_autogen_buildopt=
+  speedo_autogen_buildopt :=
+  host :=
+  speedo_host_build_option :=
+  speedo_w32_cflags :=
 endif
 
 ifeq ($(MAKE_J),)
 endif
 
 ifeq ($(MAKE_J),)
@@ -219,14 +434,20 @@ else
 endif
 
 
 endif
 
 
+
+
 # The playground area is our scratch area, where we unpack, build and
 # install the packages.
 $(stampdir)/stamp-directories:
 # 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 '_'.
        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)";                                         \
        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)";              \
        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)"; \
        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
 
        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.
 
 # 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
 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));                          \
        @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}";                              \
           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 ;;                           \
            case "$$$${tar}" in                         \
              *.gz) opt=z ;;                            \
              *.bz2) opt=j ;;                           \
+            *.xz) opt=J ;;                             \
              *) opt= ;;                                        \
            esac;                                       \
            case "$$$${tar}" in                         \
              *) 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);                          \
           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)
         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)"
 
 $(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}";                         \
        @($(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"             \
             eval "$$$${pkgsdir}/configure"             \
-                --silent                               \
-                --enable-maintainer-mode               \
-                 --prefix="$(idir)"                    \
-                $$$${pkgcfg};                          \
+              --silent                                 \
+              --enable-maintainer-mode                 \
+               --prefix="$(idir)"                      \
+               $$$${pkgcfg}                            \
+               CFLAGS=\"$(speedo_w32_cflags) $$$${pkgextracflags}\";\
         fi)
         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
 
        @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)"
 $(stampdir)/stamp-$(1)-02-make: $(stampdir)/stamp-$(1)-01-configure
        @echo "speedo: making $(1)"
+ifneq ($(findstring $(1),$(speedo_make_only_style)),)
        @($(call SETVARS,$(1));                         \
        @($(call SETVARS,$(1));                         \
-         cd "$$$${pkgbdir}";                           \
+          cd "$$$${pkgsdir}";                          \
+         test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
          $(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
          $(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
 
        @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)"
 # 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));                         \
        @($(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;\
          $(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
 
 $(stampdir)/stamp-final-$(1): $(stampdir)/stamp-$(1)-03-install
+       @echo "speedo: $(1) done"
        @touch $(stampdir)/stamp-final-$(1)
 
        @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)"
 .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)-*
 
         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));                         \
 .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
 $(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
 
 $(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
 
 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
diff --git a/build-aux/speedo/patches/atk-1.32.0.patch b/build-aux/speedo/patches/atk-1.32.0.patch
new file mode 100755 (executable)
index 0000000..51d7975
--- /dev/null
@@ -0,0 +1,671 @@
+#! /bin/sh
+patch -p1 -l -f $* < $0
+exit $?
+
+
+diff -urpb orig/atk-1.32.0/atk/atkaction.c atk/atk/atkaction.c
+--- orig/atk-1.32.0/atk/atkaction.c    2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkaction.c        2014-02-17 12:30:53.263192763 +0100
+@@ -101,7 +101,7 @@ atk_action_get_n_actions  (AtkAction *ob
+  * Returns a description string, or %NULL
+  * if @action does not implement this interface.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_action_get_description (AtkAction *obj,
+                             gint      i)
+ {
+@@ -140,7 +140,7 @@ atk_action_get_description (AtkAction *o
+  * Returns a name string, or %NULL
+  * if @action does not implement this interface.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_action_get_name (AtkAction *obj,
+                      gint      i)
+ {
+@@ -166,7 +166,7 @@ atk_action_get_name (AtkAction *obj,
+  * Returns a name string, or %NULL
+  * if @action does not implement this interface.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_action_get_localized_name (AtkAction *obj,
+                                gint      i)
+ {
+@@ -203,7 +203,7 @@ atk_action_get_localized_name (AtkAction
+  * if there is no keybinding for this action.
+  *
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_action_get_keybinding (AtkAction *obj,
+                            gint      i)
+ {
+Only in atk/atk: atkaction.c~
+diff -urpb orig/atk-1.32.0/atk/atkaction.h atk/atk/atkaction.h
+--- orig/atk-1.32.0/atk/atkaction.h    2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkaction.h        2014-02-17 12:30:58.907192071 +0100
+@@ -55,16 +55,16 @@ struct _AtkActionIface
+   gboolean                (*do_action)         (AtkAction         *action,
+                                                 gint              i);
+   gint                    (*get_n_actions)     (AtkAction         *action);
+-  G_CONST_RETURN gchar*   (*get_description)   (AtkAction         *action,
++  const gchar*   (*get_description)   (AtkAction         *action,
+                                                 gint              i);
+-  G_CONST_RETURN gchar*   (*get_name)          (AtkAction         *action,
++  const gchar*   (*get_name)          (AtkAction         *action,
+                                                 gint              i);
+-  G_CONST_RETURN gchar*   (*get_keybinding)    (AtkAction         *action,
++  const gchar*   (*get_keybinding)    (AtkAction         *action,
+                                                 gint              i);
+   gboolean                (*set_description)   (AtkAction         *action,
+                                                 gint              i,
+                                                 const gchar       *desc);
+-  G_CONST_RETURN gchar*   (*get_localized_name)(AtkAction         *action,
++  const gchar*   (*get_localized_name)(AtkAction         *action,
+                                                gint              i);
+   AtkFunction             pad2;
+ };
+@@ -85,11 +85,11 @@ GType atk_action_get_type (void);
+ gboolean   atk_action_do_action                (AtkAction         *action,
+                                             gint              i);
+ gint   atk_action_get_n_actions            (AtkAction *action);
+-G_CONST_RETURN gchar* atk_action_get_description  (AtkAction         *action,
++const gchar* atk_action_get_description  (AtkAction         *action,
+                                                    gint              i);
+-G_CONST_RETURN gchar* atk_action_get_name         (AtkAction         *action,
++const gchar* atk_action_get_name         (AtkAction         *action,
+                                                    gint              i);
+-G_CONST_RETURN gchar* atk_action_get_keybinding   (AtkAction         *action,
++const gchar* atk_action_get_keybinding   (AtkAction         *action,
+                                                    gint              i);
+ gboolean              atk_action_set_description  (AtkAction         *action,
+                                                    gint              i,
+@@ -97,7 +97,7 @@ gboolean              atk_action_set_des
+
+ /* NEW in ATK 1.1: */
+
+-G_CONST_RETURN gchar* atk_action_get_localized_name (AtkAction       *action,
++const gchar* atk_action_get_localized_name (AtkAction       *action,
+                                                    gint            i);
+
+ /*
+Only in atk/atk: atkaction.h~
+diff -urpb orig/atk-1.32.0/atk/atkdocument.c atk/atk/atkdocument.c
+--- orig/atk-1.32.0/atk/atkdocument.c  2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkdocument.c      2014-02-17 12:30:58.535192391 +0100
+@@ -93,7 +93,7 @@ atk_document_base_init (AtkDocumentIface
+  *
+  * Returns: a string indicating the document type
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_document_get_document_type (AtkDocument *document)
+ {
+   AtkDocumentIface *iface;
+@@ -155,7 +155,7 @@ atk_document_get_document (AtkDocument *
+  *          locale of the document content as a whole, or NULL if
+  *          the document content does not specify a locale.
+  **/
+-G_CONST_RETURN gchar *
++const gchar *
+ atk_document_get_locale (AtkDocument *document)
+ {
+   AtkDocumentIface *iface;
+@@ -219,7 +219,7 @@ atk_document_get_attributes (AtkDocument
+  *    document, or NULL if a value for #attribute_name has not been specified
+  *    for this document.
+  */
+-G_CONST_RETURN gchar *
++const gchar *
+ atk_document_get_attribute_value (AtkDocument *document,
+                                 const gchar *attribute_name)
+ {
+Only in atk/atk: atkdocument.c~
+diff -urpb orig/atk-1.32.0/atk/atkdocument.h atk/atk/atkdocument.h
+--- orig/atk-1.32.0/atk/atkdocument.h  2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkdocument.h      2014-02-17 12:31:31.691190631 +0100
+@@ -49,12 +49,12 @@ typedef struct _AtkDocumentIface AtkDocu
+ struct _AtkDocumentIface
+ {
+   GTypeInterface parent;
+-  G_CONST_RETURN gchar* ( *get_document_type) (AtkDocument              *document);
++  const gchar* ( *get_document_type) (AtkDocument              *document);
+   gpointer              ( *get_document)      (AtkDocument              *document);
+
+-  G_CONST_RETURN gchar* ( *get_document_locale) (AtkDocument              *document);
++  const gchar* ( *get_document_locale) (AtkDocument              *document);
+   AtkAttributeSet *     ( *get_document_attributes) (AtkDocument        *document);
+-  G_CONST_RETURN gchar* ( *get_document_attribute_value) (AtkDocument   *document,
++  const gchar* ( *get_document_attribute_value) (AtkDocument   *document,
+                                                           const gchar   *attribute_name);
+   gboolean              ( *set_document_attribute) (AtkDocument         *document,
+                                                     const gchar         *attribute_name,
+@@ -68,11 +68,11 @@ struct _AtkDocumentIface
+
+ GType  atk_document_get_type             (void);
+
+-G_CONST_RETURN gchar* atk_document_get_document_type (AtkDocument   *document);
++const gchar* atk_document_get_document_type (AtkDocument   *document);
+ gpointer atk_document_get_document (AtkDocument   *document);
+-G_CONST_RETURN gchar* atk_document_get_locale (AtkDocument *document);
++const gchar* atk_document_get_locale (AtkDocument *document);
+ AtkAttributeSet*      atk_document_get_attributes (AtkDocument *document);
+-G_CONST_RETURN gchar* atk_document_get_attribute_value (AtkDocument *document,
++const gchar* atk_document_get_attribute_value (AtkDocument *document,
+                                                         const gchar *attribute_name);
+ gboolean              atk_document_set_attribute_value (AtkDocument *document,
+                                                         const gchar *attribute_name,
+Only in atk/atk: atkdocument.h~
+diff -urpb orig/atk-1.32.0/atk/atkimage.c atk/atk/atkimage.c
+--- orig/atk-1.32.0/atk/atkimage.c     2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkimage.c 2014-02-17 12:30:58.119192299 +0100
+@@ -46,7 +46,7 @@ atk_image_get_type (void)
+  *
+  * Returns: a string representing the image description
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_image_get_image_description (AtkImage *image)
+ {
+   AtkImageIface *iface;
+@@ -192,7 +192,7 @@ atk_image_get_image_position (AtkImage *
+  * Returns a string corresponding to the POSIX LC_MESSAGES locale used by the image description, or NULL if the image does not specify a locale.
+  *
+  */
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_image_get_image_locale (AtkImage   *image)
+ {
+
+Only in atk/atk: atkimage.c~
+diff -urpb orig/atk-1.32.0/atk/atkimage.h atk/atk/atkimage.h
+--- orig/atk-1.32.0/atk/atkimage.h     2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkimage.h 2014-02-17 12:28:31.599200223 +0100
+@@ -53,13 +53,13 @@ struct _AtkImageIface
+                                                    gint                  *x,
+                                                  gint                  *y,
+                                                  AtkCoordType          coord_type);
+-  G_CONST_RETURN gchar* ( *get_image_description) (AtkImage              *image);
++  const gchar* ( *get_image_description) (AtkImage              *image);
+   void                  ( *get_image_size)        (AtkImage              *image,
+                                                    gint                  *width,
+                                                    gint                  *height);
+   gboolean              ( *set_image_description) (AtkImage              *image,
+                                                    const gchar           *description);
+-  G_CONST_RETURN gchar* ( *get_image_locale)      (AtkImage              *image);
++  const gchar* ( *get_image_locale)      (AtkImage              *image);
+
+   AtkFunction           pad1;
+
+@@ -67,7 +67,7 @@ struct _AtkImageIface
+
+ GType  atk_image_get_type             (void);
+
+-G_CONST_RETURN gchar* atk_image_get_image_description (AtkImage   *image);
++const gchar* atk_image_get_image_description (AtkImage   *image);
+
+ void     atk_image_get_image_size        (AtkImage           *image,
+                                           gint               *width,
+@@ -80,7 +80,7 @@ void     atk_image_get_image_position
+                                         gint               *y,
+                                         AtkCoordType       coord_type);
+
+-G_CONST_RETURN gchar* atk_image_get_image_locale (AtkImage   *image);
++const gchar* atk_image_get_image_locale (AtkImage   *image);
+
+ G_END_DECLS
+
+Only in atk/atk: atkimage.h~
+diff -urpb orig/atk-1.32.0/atk/atkobject.c atk/atk/atkobject.c
+--- orig/atk-1.32.0/atk/atkobject.c    2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkobject.c        2014-02-17 12:28:39.467199803 +0100
+@@ -285,9 +285,9 @@ static void            atk_object_real_g
+                                                      GValue          *value,
+                                                      GParamSpec      *pspec);
+ static void            atk_object_finalize          (GObject         *object);
+-static G_CONST_RETURN gchar*
++static const gchar*
+                        atk_object_real_get_name     (AtkObject       *object);
+-static G_CONST_RETURN gchar*
++static const gchar*
+                        atk_object_real_get_description
+                                                    (AtkObject       *object);
+ static AtkObject*      atk_object_real_get_parent  (AtkObject       *object);
+@@ -692,7 +692,7 @@ atk_implementor_get_type (void)
+  *
+  * Returns: a character string representing the accessible name of the object.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_object_get_name (AtkObject *accessible)
+ {
+   AtkObjectClass *klass;
+@@ -716,7 +716,7 @@ atk_object_get_name (AtkObject *accessib
+  * of the accessible.
+  *
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_object_get_description (AtkObject *accessible)
+ {
+   AtkObjectClass *klass;
+@@ -1123,7 +1123,7 @@ atk_object_notify_state_change (AtkObjec
+                                 AtkState  state,
+                                 gboolean  value)
+ {
+-  G_CONST_RETURN gchar* name;
++  const gchar* name;
+
+   g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+@@ -1319,13 +1319,13 @@ atk_object_finalize (GObject *object)
+   G_OBJECT_CLASS (parent_class)->finalize (object);
+ }
+
+-static G_CONST_RETURN gchar*
++static const gchar*
+ atk_object_real_get_name (AtkObject *object)
+ {
+   return object->name;
+ }
+
+-static G_CONST_RETURN gchar*
++static const gchar*
+ atk_object_real_get_description (AtkObject *object)
+ {
+   return object->description;
+@@ -1487,7 +1487,7 @@ atk_object_notify (GObject     *obj,
+  *
+  * Returns: the string describing the AtkRole
+  */
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_role_get_name (AtkRole role)
+ {
+   if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
+@@ -1514,7 +1514,7 @@ atk_role_get_name (AtkRole role)
+  *
+  * Returns: the localized string describing the AtkRole
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_role_get_localized_name (AtkRole role)
+ {
+   gettext_initialization ();
+Only in atk/atk: atkobject.c~
+diff -urpb orig/atk-1.32.0/atk/atkobject.h atk/atk/atkobject.h
+--- orig/atk-1.32.0/atk/atkobject.h    2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkobject.h        2014-02-17 12:28:48.851199302 +0100
+@@ -381,11 +381,11 @@ struct _AtkObjectClass
+   /*
+    * Gets the accessible name of the object
+    */
+-  G_CONST_RETURN gchar*    (* get_name)            (AtkObject                *accessible);
++  const gchar*    (* get_name)            (AtkObject                *accessible);
+   /*
+    * Gets the accessible description of the object
+    */
+-  G_CONST_RETURN gchar*    (* get_description)     (AtkObject                *accessible);
++  const gchar*    (* get_description)     (AtkObject                *accessible);
+   /*
+    * Gets the accessible parent of the object
+    */
+@@ -535,8 +535,8 @@ AtkObject*              atk_implementor_
+  * Properties directly supported by AtkObject
+  */
+
+-G_CONST_RETURN gchar*   atk_object_get_name                       (AtkObject *accessible);
+-G_CONST_RETURN gchar*   atk_object_get_description                (AtkObject *accessible);
++const gchar*   atk_object_get_name                       (AtkObject *accessible);
++const gchar*   atk_object_get_description                (AtkObject *accessible);
+ AtkObject*              atk_object_get_parent                     (AtkObject *accessible);
+ gint                    atk_object_get_n_accessible_children      (AtkObject *accessible);
+ AtkObject*              atk_object_ref_accessible_child           (AtkObject *accessible,
+@@ -571,7 +571,7 @@ void                 atk_object_notify_s
+ void                 atk_object_initialize                       (AtkObject                     *accessible,
+                                                                   gpointer                      data);
+
+-G_CONST_RETURN gchar* atk_role_get_name      (AtkRole         role);
++const gchar* atk_role_get_name      (AtkRole         role);
+ AtkRole               atk_role_for_name      (const gchar     *name);
+
+
+@@ -582,7 +582,7 @@ gboolean              atk_object_add_rel
+ gboolean              atk_object_remove_relationship           (AtkObject      *object,
+                                                               AtkRelationType relationship,
+                                                               AtkObject      *target);
+-G_CONST_RETURN gchar* atk_role_get_localized_name              (AtkRole     role);
++const gchar* atk_role_get_localized_name              (AtkRole     role);
+
+ /* */
+
+Only in atk/atk: atkobject.h~
+diff -urpb orig/atk-1.32.0/atk/atkrelation.c atk/atk/atkrelation.c
+--- orig/atk-1.32.0/atk/atkrelation.c  2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkrelation.c      2014-02-17 12:29:04.307198532 +0100
+@@ -130,7 +130,7 @@ atk_relation_type_register (const gchar
+  *
+  * Returns: the string describing the AtkRelationType
+  */
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_relation_type_get_name (AtkRelationType type)
+ {
+   GTypeClass *type_class;
+Only in atk/atk: atkrelation.c~
+diff -urpb orig/atk-1.32.0/atk/atkrelation.h atk/atk/atkrelation.h
+--- orig/atk-1.32.0/atk/atkrelation.h  2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkrelation.h      2014-02-17 12:29:12.167198142 +0100
+@@ -61,7 +61,7 @@ struct _AtkRelationClass
+ GType atk_relation_get_type (void);
+
+ AtkRelationType       atk_relation_type_register      (const gchar     *name);
+-G_CONST_RETURN gchar* atk_relation_type_get_name      (AtkRelationType type);
++const gchar* atk_relation_type_get_name      (AtkRelationType type);
+ AtkRelationType       atk_relation_type_for_name      (const gchar     *name);
+
+ /*
+Only in atk/atk: atkrelation.h~
+diff -urpb orig/atk-1.32.0/atk/atkstate.c atk/atk/atkstate.c
+--- orig/atk-1.32.0/atk/atkstate.c     2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkstate.c 2014-02-17 12:29:19.023197754 +0100
+@@ -57,7 +57,7 @@ atk_state_type_register (const gchar *na
+  *
+  * Returns: the string describing the AtkStateType
+  */
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_state_type_get_name (AtkStateType type)
+ {
+   GTypeClass *type_class;
+Only in atk/atk: atkstate.c~
+diff -urpb orig/atk-1.32.0/atk/atkstate.h atk/atk/atkstate.h
+--- orig/atk-1.32.0/atk/atkstate.h     2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkstate.h 2014-02-17 12:26:44.459205944 +0100
+@@ -170,7 +170,7 @@ typedef guint64      AtkState;
+
+ AtkStateType atk_state_type_register            (const gchar *name);
+
+-G_CONST_RETURN gchar* atk_state_type_get_name   (AtkStateType type);
++const gchar* atk_state_type_get_name   (AtkStateType type);
+ AtkStateType          atk_state_type_for_name   (const gchar  *name);
+
+ G_END_DECLS
+Only in atk/atk: atkstate.h~
+diff -urpb orig/atk-1.32.0/atk/atkstreamablecontent.c atk/atk/atkstreamablecontent.c
+--- orig/atk-1.32.0/atk/atkstreamablecontent.c 2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkstreamablecontent.c     2014-02-17 12:30:57.659192412 +0100
+@@ -73,7 +73,7 @@ atk_streamable_content_get_n_mime_types
+  * Returns : a gchar* representing the specified mime type; the caller
+  * should not free the character string.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_streamable_content_get_mime_type (AtkStreamableContent *streamable,
+                                       gint                 i)
+ {
+Only in atk/atk: atkstreamablecontent.c~
+diff -urpb orig/atk-1.32.0/atk/atkstreamablecontent.h atk/atk/atkstreamablecontent.h
+--- orig/atk-1.32.0/atk/atkstreamablecontent.h 2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkstreamablecontent.h     2014-02-17 12:29:49.487196042 +0100
+@@ -54,11 +54,11 @@ struct _AtkStreamableContentIface
+    * at index 0 should be considered the "default" data type for the stream.
+    *
+    * This assumes that the strings for the mime types are stored in the
+-   * AtkStreamableContent. Alternatively the G_CONST_RETURN could be removed
++   * AtkStreamableContent. Alternatively the const could be removed
+    * and the caller would be responsible for calling g_free() on the
+    * returned value.
+    */
+-  G_CONST_RETURN gchar*     (* get_mime_type)     (AtkStreamableContent     *streamable,
++  const gchar*     (* get_mime_type)     (AtkStreamableContent     *streamable,
+                                                    gint                     i);
+   /*
+    * One possible implementation for this method is that it constructs the
+@@ -80,7 +80,7 @@ struct _AtkStreamableContentIface
+  * constructed.  Note that it is possible for get_uri to return NULL but for
+  * get_stream to work nonetheless, since not all GIOChannels connect to URIs.
+  */
+-    G_CONST_RETURN  gchar*  (* get_uri)           (AtkStreamableContent     *streamable,
++    const  gchar*  (* get_uri)           (AtkStreamableContent     *streamable,
+                                                    const gchar              *mime_type);
+
+
+@@ -92,7 +92,7 @@ GType                  atk_streamable_co
+
+ gint                   atk_streamable_content_get_n_mime_types (AtkStreamableContent     *streamable);
+
+-G_CONST_RETURN gchar*  atk_streamable_content_get_mime_type    (AtkStreamableContent     *streamable,
++const gchar*  atk_streamable_content_get_mime_type    (AtkStreamableContent     *streamable,
+                                                                 gint                     i);
+ GIOChannel*             atk_streamable_content_get_stream       (AtkStreamableContent     *streamable,
+                                                                  const gchar              *mime_type);
+Only in atk/atk: atkstreamablecontent.h~
+diff -urpb orig/atk-1.32.0/atk/atktable.c atk/atk/atktable.c
+--- orig/atk-1.32.0/atk/atktable.c     2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atktable.c 2014-02-17 12:30:57.319192444 +0100
+@@ -300,7 +300,7 @@ atk_table_get_n_columns (AtkTable *table
+  * Returns: a gchar* representing the column description, or %NULL
+  * if value does not implement this interface.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_table_get_column_description (AtkTable *table,
+                                   gint     column)
+ {
+@@ -404,7 +404,7 @@ atk_table_get_n_rows (AtkTable *table)
+  * Returns: a gchar* representing the row description, or %NULL
+  * if value does not implement this interface.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_table_get_row_description (AtkTable *table,
+                                gint      row)
+ {
+Only in atk/atk: atktable.c~
+diff -urpb orig/atk-1.32.0/atk/atktable.h atk/atk/atktable.h
+--- orig/atk-1.32.0/atk/atktable.h     2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atktable.h 2014-02-17 12:30:08.035195073 +0100
+@@ -69,12 +69,12 @@ struct _AtkTableIface
+                                                   gint          column);
+   AtkObject*
+                     (* get_caption)              (AtkTable      *table);
+-  G_CONST_RETURN gchar*
++  const gchar*
+                     (* get_column_description)   (AtkTable      *table,
+                                                   gint          column);
+   AtkObject*        (* get_column_header)        (AtkTable      *table,
+                                                 gint          column);
+-  G_CONST_RETURN gchar*
++  const gchar*
+                     (* get_row_description)      (AtkTable      *table,
+                                                   gint          row);
+   AtkObject*        (* get_row_header)           (AtkTable      *table,
+@@ -163,12 +163,12 @@ gint              atk_table_get_row_exte
+                                                   gint             column);
+ AtkObject*
+                   atk_table_get_caption          (AtkTable         *table);
+-G_CONST_RETURN gchar*
++const gchar*
+                   atk_table_get_column_description (AtkTable         *table,
+                                                   gint             column);
+ AtkObject*        atk_table_get_column_header    (AtkTable         *table,
+                                                 gint             column);
+-G_CONST_RETURN gchar*
++const gchar*
+                   atk_table_get_row_description  (AtkTable         *table,
+                                                   gint             row);
+ AtkObject*        atk_table_get_row_header       (AtkTable         *table,
+Only in atk/atk: atktable.h~
+diff -urpb orig/atk-1.32.0/atk/atktext.c atk/atk/atktext.c
+--- orig/atk-1.32.0/atk/atktext.c      2010-09-27 09:07:09.000000000 +0200
++++ atk/atk/atktext.c  2014-02-17 12:30:56.871192495 +0100
+@@ -1054,7 +1054,7 @@ atk_text_attribute_register (const gchar
+  *
+  * Returns: a string containing the name; this string should not be freed
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_text_attribute_get_name (AtkTextAttribute attr)
+ {
+   GTypeClass *type_class;
+@@ -1150,7 +1150,7 @@ atk_text_attribute_for_name (const gchar
+  * Returns: a string containing the value; this string should not be freed;
+  * NULL is returned if there are no values maintained for the attr value.
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_text_attribute_get_value (AtkTextAttribute attr,
+                               gint             index)
+ {
+Only in atk/atk: atktext.c~
+diff -urpb orig/atk-1.32.0/atk/atktext.h atk/atk/atktext.h
+--- orig/atk-1.32.0/atk/atktext.h      2010-09-27 09:07:09.000000000 +0200
++++ atk/atk/atktext.h  2014-02-17 12:30:56.475192626 +0100
+@@ -355,9 +355,9 @@ AtkTextRange**  atk_text_get_bounded_ran
+                                                            AtkTextClipType  y_clip_type);
+ void          atk_text_free_ranges                        (AtkTextRange     **ranges);
+ void        atk_attribute_set_free                      (AtkAttributeSet  *attrib_set);
+-G_CONST_RETURN gchar*  atk_text_attribute_get_name        (AtkTextAttribute attr);
++const gchar*  atk_text_attribute_get_name        (AtkTextAttribute attr);
+ AtkTextAttribute       atk_text_attribute_for_name        (const gchar      *name);
+-G_CONST_RETURN gchar*  atk_text_attribute_get_value       (AtkTextAttribute attr,
++const gchar*  atk_text_attribute_get_value       (AtkTextAttribute attr,
+                                                            gint             index_);
+
+ G_END_DECLS
+Only in atk/atk: atktext.h~
+diff -urpb orig/atk-1.32.0/atk/atkutil.c atk/atk/atkutil.c
+--- orig/atk-1.32.0/atk/atkutil.c      2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkutil.c  2014-02-17 12:30:33.651193705 +0100
+@@ -340,7 +340,7 @@ atk_get_focus_object (void)
+  *
+  * Returns: name string for the GUI toolkit implementing ATK for this application
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_get_toolkit_name (void)
+ {
+   const gchar *retval;
+@@ -365,7 +365,7 @@ atk_get_toolkit_name (void)
+  *
+  * Returns: version string for the GUI toolkit implementing ATK for this application
+  **/
+-G_CONST_RETURN gchar*
++const gchar*
+ atk_get_toolkit_version (void)
+ {
+   const gchar *retval;
+@@ -391,7 +391,7 @@ atk_get_toolkit_version (void)
+  * Returns: version string for ATK
+  **/
+
+-G_CONST_RETURN gchar *
++const gchar *
+ atk_get_version (void)
+ {
+   return VERSION;
+Only in atk/atk: atkutil.c~
+diff -urpb orig/atk-1.32.0/atk/atkutil.h atk/atk/atkutil.h
+--- orig/atk-1.32.0/atk/atkutil.h      2010-09-06 08:45:45.000000000 +0200
++++ atk/atk/atkutil.h  2014-02-17 12:30:40.635193333 +0100
+@@ -147,8 +147,8 @@ struct _AtkUtilClass
+                                                 gpointer data);
+    void         (* remove_key_event_listener)    (guint               listener_id);
+    AtkObject*   (* get_root)                     (void);
+-   G_CONST_RETURN gchar* (* get_toolkit_name)    (void);
+-   G_CONST_RETURN gchar* (* get_toolkit_version) (void);
++   const gchar* (* get_toolkit_name)    (void);
++   const gchar* (* get_toolkit_version) (void);
+ };
+ GType atk_util_get_type (void);
+
+@@ -229,17 +229,17 @@ AtkObject* atk_get_focus_object (void);
+ /*
+  * Returns name string for the GUI toolkit.
+  */
+-G_CONST_RETURN gchar *atk_get_toolkit_name (void);
++const gchar *atk_get_toolkit_name (void);
+
+ /*
+  * Returns version string for the GUI toolkit.
+  */
+-G_CONST_RETURN gchar *atk_get_toolkit_version (void);
++const gchar *atk_get_toolkit_version (void);
+
+ /*
+  * Gets the current version of ATK
+  */
+-G_CONST_RETURN gchar *atk_get_version (void);
++const gchar *atk_get_version (void);
+
+ /* --- GType boilerplate --- */
+ /* convenience macros for atk type implementations, which for a type GtkGadgetAccessible will:
+Only in atk/atk: atkutil.h~
+diff -urpb orig/atk-1.32.0/tests/testrelation.c atk/tests/testrelation.c
+--- orig/atk-1.32.0/tests/testrelation.c       2010-09-06 08:45:45.000000000 +0200
++++ atk/tests/testrelation.c   2014-02-17 12:53:42.095119569 +0100
+@@ -28,7 +28,7 @@ static gboolean
+ test_relation (void)
+ {
+   AtkRelationType type1, type2;
+-  G_CONST_RETURN gchar *name;
++  const gchar *name;
+   AtkObject *obj;
+   gboolean ret_value;
+   AtkRelationSet *set;
+@@ -169,7 +169,7 @@ static gboolean
+ test_role (void)
+ {
+   AtkRole role1, role2;
+-  G_CONST_RETURN gchar *name;
++  const gchar *name;
+
+   name = atk_role_get_name (ATK_ROLE_PAGE_TAB);
+   g_return_val_if_fail (name, FALSE);
+@@ -230,7 +230,7 @@ static gboolean
+ test_text_attr (void)
+ {
+   AtkTextAttribute attr1, attr2;
+-  G_CONST_RETURN gchar *name;
++  const gchar *name;
+
+   name = atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP);
+   g_return_val_if_fail (name, FALSE);
+Only in atk/tests/: testrelation.c~
+diff -urpb orig/atk-1.32.0/tests/teststateset.c atk/tests/teststateset.c
+--- orig/atk-1.32.0/tests/teststateset.c       2010-09-06 08:45:45.000000000 +0200
++++ atk/tests/teststateset.c   2014-02-17 12:53:55.675118832 +0100
+@@ -208,7 +208,7 @@ static gboolean
+ test_state (void)
+ {
+   AtkStateType type1, type2;
+-  G_CONST_RETURN gchar *name;
++  const gchar *name;
+
+   name = atk_state_type_get_name (ATK_STATE_VISIBLE);
+   g_return_val_if_fail (name, FALSE);
+
+
+--- orig/atk-1.32.0/atk/Makefile.in    2010-09-27 09:53:57.000000000 +0200
++++ atk/atk/Makefile.in        2014-02-17 12:52:40.443122866 +0100
+@@ -40,7 +40,7 @@ host_triplet = @host@
+ @HAVE_INTROSPECTION_TRUE@am__append_2 = $(gir_DATA) $(typelibs_DATA)
+
+ # ---------- Win32 stuff ----------
+-@OS_WIN32_TRUE@am__append_3 = -export-symbols $(srcdir)/atk.def -no-undefined -Wl,atk-win32-res.o
++@OS_WIN32_TRUE@am__append_3 = -export-symbols atk.def -no-undefined -Wl,atk-win32-res.o
+ @OS_WIN32_FALSE@libatk_1_0_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ @OS_WIN32_FALSE@      $(am__DEPENDENCIES_1)
+ subdir = atk
+@@ -861,7 +861,7 @@ s-enum-types-c: @REBUILD@ $(atk_headers)
+ @HAVE_INTROSPECTION_TRUE@Atk-1.0.gir: libatk-1.0.la Makefile
+
+ @OS_WIN32_TRUE@install-def-file:
+-@OS_WIN32_TRUE@       $(INSTALL) $(srcdir)/atk.def $(DESTDIR)$(libdir)/atk-1.0.def
++@OS_WIN32_TRUE@       $(INSTALL) atk.def $(DESTDIR)$(libdir)/atk-1.0.def
+ @OS_WIN32_TRUE@uninstall-def-file:
+ @OS_WIN32_TRUE@       -rm $(DESTDIR)$(libdir)/atk-1.0.def
+ @OS_WIN32_FALSE@install-def-file:
diff --git a/build-aux/speedo/patches/pango-1.29.4.patch b/build-aux/speedo/patches/pango-1.29.4.patch
new file mode 100755 (executable)
index 0000000..edeee85
--- /dev/null
@@ -0,0 +1,27 @@
+#! /bin/sh
+patch -p0 -l -f $* < $0
+exit $?
+
+Without that patch the module is build with wrong symbols and thus
+can't be loaded by pango.  I don't know why they have this defines
+just in this module.  It entirely defeats the feature of loading
+modules dynamically - maybe this was just a quick hack for including
+the code directly - however, I was not able to make that work either.
+
+
+--- modules/basic/basic-win32.c~       2011-09-28 16:34:33.000000000 +0200
++++ modules/basic/basic-win32.c        2014-02-20 20:01:10.107723565 +0100
+@@ -33,9 +33,10 @@
+
+ extern HFONT _pango_win32_font_get_hfont (PangoFont *font);
+
+-#ifndef PANGO_MODULE_PREFIX
+-#define PANGO_MODULE_PREFIX _pango_basic_win32
+-#endif
++/* #ifndef PANGO_MODULE_PREFIX */
++/* #define PANGO_MODULE_PREFIX _pango_basic_win32 */
++/* #endif */
++#undef PANGO_MODULE_PREFIX
+
+ #include "pango-engine.h"
+ #include "pango-utils.h"
diff --git a/build-aux/speedo/w32/README.txt b/build-aux/speedo/w32/README.txt
new file mode 100644 (file)
index 0000000..847ecd7
--- /dev/null
@@ -0,0 +1,54 @@
+;; README.txt                               -*- coding: latin-1; -*-
+;; This is the README installed with megacryption.  Lines with a
+;; semicolon in the first column are considered a comment and not
+;; included in the actually installed version.  Certain keywords are
+;; replaced by the Makefile; those words are enclosed by exclamation
+;; marks.
+
+                          GNUPG for Windows
+                         ===================
+
+This is GnuPG for Windows, version !VERSION!.
+
+Content:
+
+     1. Important notes
+     2. Changes
+     3. Legal notices
+
+
+
+
+1. Important Notes
+==================
+
+HTML versions of the manuals have been installed on the desktop.
+Check out https://gnupg.org for latest news.
+
+
+2. Record of Changes (NEWS file)
+================================
+
+Below you find the raw NEWS file:
+
+!NEWSFILE!
+
+
+3. Legal notices pertaining to the individual packets
+=====================================================
+
+GnuPG for Windows consist of several independent developed packages,
+available under different license conditions.  Most of these packages
+are however available under the GNU General Public License (GNU GPL).
+Common to all is that they are free to use without restrictions, may
+be modified and that modifications may be distributed.  If the source
+file (i.e. gnupg-src-k.m.n.zip) is distributed along with the binaries
+and the use of the GNU GPL has been pointed out, distribution is in
+all cases possible.
+
+What follows is a list of copyright statements.
+
+!PKG-COPYRIGHT!
+
+
+***end of file ***
diff --git a/build-aux/speedo/w32/exdll.h b/build-aux/speedo/w32/exdll.h
new file mode 100644 (file)
index 0000000..e5ba3bb
--- /dev/null
@@ -0,0 +1,151 @@
+/* exdll.h for use with gpg4win
+ * Copyright (C) 1999-2005 Nullsoft, Inc.
+ *
+ * This license applies to everything in the NSIS package, except
+ * where otherwise noted.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any
+ * damages arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any
+ * purpose, including commercial applications, and to alter it and
+ * redistribute it freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must
+ *    not claim that you wrote the original software. If you use this
+ *    software in a product, an acknowledgment in the product
+ *    documentation would be appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must
+ *    not be misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ *    distribution.
+ ************************************************************
+ * 2005-11-14 wk  Applied license text to orginal exdll.h file from
+ *                NSIS 2.0.4 and did some formatting changes.
+ */
+
+#ifndef _EXDLL_H_
+#define _EXDLL_H_
+
+/* only include this file from one place in your DLL.  (it is all
+   static, if you use it in two places it will fail) */
+
+#define EXDLL_INIT()           {  \
+        g_stringsize=string_size; \
+        g_stacktop=stacktop;      \
+        g_variables=variables; }
+
+/* For page showing plug-ins */
+#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
+#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
+#define NOTIFY_BYE_BYE 'x'
+
+typedef struct _stack_t {
+  struct _stack_t *next;
+  char text[1];          /* This should be the length of string_size. */
+} stack_t;
+
+
+static unsigned int g_stringsize;
+static stack_t **g_stacktop;
+static char *g_variables;
+
+static int __stdcall popstring(char *str, size_t maxlen); /* 0 on success, 1 on empty stack */
+static void __stdcall pushstring(const char *str);
+
+enum
+  {
+    INST_0,         // $0
+    INST_1,         // $1
+    INST_2,         // $2
+    INST_3,         // $3
+    INST_4,         // $4
+    INST_5,         // $5
+    INST_6,         // $6
+    INST_7,         // $7
+    INST_8,         // $8
+    INST_9,         // $9
+    INST_R0,        // $R0
+    INST_R1,        // $R1
+    INST_R2,        // $R2
+    INST_R3,        // $R3
+    INST_R4,        // $R4
+    INST_R5,        // $R5
+    INST_R6,        // $R6
+    INST_R7,        // $R7
+    INST_R8,        // $R8
+    INST_R9,        // $R9
+    INST_CMDLINE,   // $CMDLINE
+    INST_INSTDIR,   // $INSTDIR
+    INST_OUTDIR,    // $OUTDIR
+    INST_EXEDIR,    // $EXEDIR
+    INST_LANG,      // $LANGUAGE
+    __INST_LAST
+};
+
+typedef struct {
+  int autoclose;
+  int all_user_var;
+  int exec_error;
+  int abort;
+  int exec_reboot;
+  int reboot_called;
+  int XXX_cur_insttype; /* deprecated */
+  int XXX_insttype_changed; /* deprecated */
+  int silent;
+  int instdir_error;
+  int rtl;
+  int errlvl;
+} exec_flags_t;
+
+typedef struct {
+  exec_flags_t *exec_flags;
+  int (__stdcall *ExecuteCodeSegment)(int, HWND);
+} extra_parameters_t;
+
+
+/* Utility functions (not required but often useful). */
+static int __stdcall
+popstring(char *str, size_t maxlen)
+{
+  stack_t *th;
+  if (!g_stacktop || !*g_stacktop)
+    return 1;
+  th=(*g_stacktop);
+  lstrcpyn (str, th->text, maxlen);
+  *g_stacktop = th->next;
+  GlobalFree((HGLOBAL)th);
+  return 0;
+}
+
+static void __stdcall
+pushstring(const char *str)
+{
+  stack_t *th;
+  if (!g_stacktop) return;
+  th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
+  lstrcpyn(th->text,str,g_stringsize);
+  th->next=*g_stacktop;
+  *g_stacktop=th;
+}
+
+static char * __stdcall
+getuservariable(const int varnum)
+{
+  if (varnum < 0 || varnum >= __INST_LAST) return NULL;
+  return g_variables+varnum*g_stringsize;
+}
+
+static void __stdcall
+setuservariable(const int varnum, const char *var)
+{
+  if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
+    lstrcpy(g_variables + varnum*g_stringsize, var);
+}
+
+
+
+#endif/*_EXDLL_H_*/
diff --git a/build-aux/speedo/w32/g4wihelp.c b/build-aux/speedo/w32/g4wihelp.c
new file mode 100644 (file)
index 0000000..9d0379e
--- /dev/null
@@ -0,0 +1,1136 @@
+/* g4wihelp.c - NSIS Helper DLL used with gpg4win. -*- coding: latin-1; -*-
+ * Copyright (C) 2005 g10 Code GmbH
+ * Copyright (C) 2001 Justin Frankel
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any
+ * damages arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any
+ * purpose, including commercial applications, and to alter it and
+ * redistribute it freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must
+ *    not claim that you wrote the original software. If you use this
+ *    software in a product, an acknowledgment in the product
+ *    documentation would be appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must
+ *    not be misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ *    distribution.
+ ************************************************************
+ * The code for the splash screen has been taken from the Splash
+ * plugin of the NSIS 2.04 distribution.  That code comes without
+ * explicit copyright notices in tyhe source files or author names, it
+ * seems that it has been written by Justin Frankel; not sure about
+ * the year, though. [wk 2005-11-28]
+ *
+ * Fixed some compiler warnings. [wk 2014-02-24].
+ */
+
+#include <stdio.h>
+#include <windows.h>
+#include "exdll.h"
+
+static HINSTANCE g_hInstance; /* Our Instance. */
+static HWND g_hwndParent;     /* Handle of parent window or NULL. */
+static HBITMAP g_hbm;         /* Handle of the splash image. */
+static int sleepint;          /* Milliseconds to show the spals image. */
+
+
+/* Standard entry point for DLLs. */
+int WINAPI
+DllMain (HANDLE hinst, DWORD reason, LPVOID reserved)
+{
+   if (reason == DLL_PROCESS_ATTACH)
+     g_hInstance = hinst;
+   return TRUE;
+}
+
+
+
+/* Dummy function for testing. */
+void __declspec(dllexport)
+dummy (HWND hwndParent, int string_size, char *variables,
+       stack_t **stacktop, extra_parameters_t *extra)
+{
+  g_hwndParent = hwndParent;
+
+  EXDLL_INIT();
+
+  // note if you want parameters from the stack, pop them off in order.
+  // i.e. if you are called via exdll::myFunction file.dat poop.dat
+  // calling popstring() the first time would give you file.dat,
+  // and the second time would give you poop.dat.
+  // you should empty the stack of your parameters, and ONLY your
+  // parameters.
+
+  // do your stuff here
+  {
+    char buf[1024];
+    snprintf (buf, sizeof buf - 1, "$R0=%s\r\n$R1=%s\r\n",
+              getuservariable(INST_R0),
+              getuservariable(INST_R1));
+    MessageBox (g_hwndParent,buf,0,MB_OK);
+
+    snprintf (buf, sizeof buf - 1,
+             "autoclose    =%d\r\n"
+             "all_user_var =%d\r\n"
+             "exec_error   =%d\r\n"
+             "abort        =%d\r\n"
+             "exec_reboot  =%d\r\n"
+             "reboot_called=%d\r\n"
+             "silent       =%d\r\n"
+             "instdir_error=%d\r\n"
+             "rtl          =%d\r\n"
+             "errlvl       =%d\r\n",
+             extra->exec_flags->autoclose,
+             extra->exec_flags->all_user_var,
+             extra->exec_flags->exec_error,
+             extra->exec_flags->abort,
+             extra->exec_flags->exec_reboot,
+             extra->exec_flags->reboot_called,
+             extra->exec_flags->silent,
+             extra->exec_flags->instdir_error,
+             extra->exec_flags->rtl,
+             extra->exec_flags->errlvl);
+    MessageBox(g_hwndParent,buf,0,MB_OK);
+  }
+}
+
+
+void __declspec(dllexport)
+runonce (HWND hwndParent, int string_size, char *variables,
+         stack_t **stacktop, extra_parameters_t *extra)
+{
+  const char *result;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  CreateMutexA (NULL, 0, getuservariable(INST_R0));
+  result = GetLastError ()? "1":"0";
+  setuservariable (INST_R0, result);
+}
+
+
+void __declspec(dllexport)
+playsound (HWND hwndParent, int string_size, char *variables,
+           stack_t **stacktop, extra_parameters_t *extra)
+{
+  char fname[MAX_PATH];
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  if (popstring(fname, sizeof fname))
+    return;
+  PlaySound (fname, NULL, SND_ASYNC|SND_FILENAME|SND_NODEFAULT);
+}
+
+
+void __declspec(dllexport)
+stopsound (HWND hwndParent, int string_size, char *variables,
+           stack_t **stacktop, extra_parameters_t *extra)
+{
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+  PlaySound (NULL, NULL, 0);
+}
+
+
+/* Windows procedure to control the splashimage.  This one pauses the
+   execution until the sleep time is over or the user closes this
+   windows. */
+static LRESULT CALLBACK
+splash_wndproc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+  LRESULT result = 0;
+
+  switch (uMsg)
+    {
+    case WM_CREATE:
+      {
+        BITMAP bm;
+        RECT vp;
+
+        GetObject(g_hbm, sizeof(bm), (LPSTR)&bm);
+        SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0);
+        SetWindowLong(hwnd,GWL_STYLE,0);
+        SetWindowPos(hwnd,NULL,
+                     vp.left+(vp.right-vp.left-bm.bmWidth)/2,
+                     vp.top+(vp.bottom-vp.top-bm.bmHeight)/2,
+                     bm.bmWidth,bm.bmHeight,
+                     SWP_NOZORDER);
+        ShowWindow(hwnd,SW_SHOW);
+        SetTimer(hwnd,1,sleepint,NULL);
+      }
+      break;
+
+    case WM_PAINT:
+      {
+        PAINTSTRUCT ps;
+        RECT r;
+        HDC curdc=BeginPaint(hwnd,&ps);
+        HDC hdc=CreateCompatibleDC(curdc);
+        HBITMAP oldbm;
+        GetClientRect(hwnd,&r);
+        oldbm=(HBITMAP)SelectObject(hdc,g_hbm);
+        BitBlt(curdc,r.left,r.top,r.right-r.left,r.bottom-r.top,
+               hdc,0,0,SRCCOPY);
+        SelectObject(hdc,oldbm);
+        DeleteDC(hdc);
+        EndPaint(hwnd,&ps);
+      }
+      break;
+
+    case WM_CLOSE:
+      break;
+
+    case WM_TIMER:
+    case WM_LBUTTONDOWN:
+      DestroyWindow(hwnd);
+      /*(fall through)*/
+    default:
+      result =  DefWindowProc (hwnd, uMsg, wParam, lParam);
+    }
+
+  return result;
+}
+
+
+/* Display a splash screen.  Call as
+
+     g4wihelp::showsplash SLEEP FNAME
+
+   With SLEEP being the time in milliseconds to show the splashscreen
+   and FNAME the complete filename of the image.  As of now only BMP
+   is supported.
+*/
+void __declspec(dllexport)
+showsplash (HWND hwndParent, int string_size, char *variables,
+           stack_t **stacktop, extra_parameters_t *extra)
+{
+  static WNDCLASS wc;
+  char sleepstr[30];
+  char fname[MAX_PATH];
+  int err = 0;
+  char *p;
+  char classname[] = "_sp";
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+  if (popstring(sleepstr, sizeof sleepstr))
+    err = 1;
+  if (popstring(fname, sizeof fname))
+    err = 1;
+  if (err)
+    return;
+
+  if (!*fname)
+    return; /* Nothing to do. */
+
+  for (sleepint=0, p=sleepstr; *p >= '0' && *p <= '9'; p++)
+    {
+      sleepint *= 10;
+      sleepint += *p - '0';
+    }
+  if (sleepint <= 0)
+    return; /* Nothing to do. */
+
+  wc.lpfnWndProc = splash_wndproc;
+  wc.hInstance = g_hInstance;
+  wc.hCursor = LoadCursor(NULL,IDC_ARROW);
+  wc.lpszClassName = classname;
+  if (!RegisterClass(&wc))
+    return; /* Error. */
+
+  g_hbm = LoadImage (NULL, fname, IMAGE_BITMAP,
+                     0, 0 , LR_CREATEDIBSECTION|LR_LOADFROMFILE);
+  if (g_hbm)
+    {
+      MSG msg;
+      HWND hwnd;
+
+      hwnd = CreateWindowEx (WS_EX_TOOLWINDOW, classname, classname,
+                             0, 0, 0, 0, 0, (HWND)hwndParent, NULL,
+                             g_hInstance, NULL);
+
+      while (IsWindow(hwnd) && GetMessage ( &msg, hwnd, 0, 0))
+        {
+          DispatchMessage (&msg);
+        }
+
+      DeleteObject (g_hbm);
+      g_hbm = NULL;
+    }
+  UnregisterClass (classname, g_hInstance);
+}
+
+\f
+/* Service Management.  */
+
+/* Use this to report unexpected errors.  FIXME: This is really not
+   very descriptive.  */
+void
+service_error (const char *str)
+{
+  char buf[1024];
+  snprintf (buf, sizeof (buf) - 1, "error: %s: ec=%d\r\n", str,
+           GetLastError ());
+  MessageBox(g_hwndParent, buf, 0, MB_OK);
+
+  setuservariable (INST_R0, "1");
+}
+
+
+void __declspec(dllexport)
+service_create (HWND hwndParent, int string_size, char *variables,
+                stack_t **stacktop, extra_parameters_t *extra)
+{
+  SC_HANDLE sc;
+  SC_HANDLE service;
+  const char *result = NULL;
+  char service_name[256];
+  char display_name[256];
+  char program[256];
+  int err = 0;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: service_name, display_name, program.  */
+  if (popstring (service_name, sizeof (service_name)))
+    err = 1;
+  if (!err && popstring (display_name, sizeof (display_name)))
+    err = 1;
+  if (!err && popstring (program, sizeof (program)))
+    err = 1;
+  if (err)
+    {
+      setuservariable (INST_R0, "1");
+      return;
+    }
+
+  sc = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
+  if (sc == NULL)
+    {
+      service_error ("OpenSCManager");
+      return;
+    }
+
+  service = CreateService (sc, service_name, display_name,
+                          SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
+                          /* Use SERVICE_DEMAND_START for testing.
+                             FIXME: Currently not configurable by caller.  */
+                          SERVICE_AUTO_START,
+                          SERVICE_ERROR_NORMAL, program,
+                          NULL, NULL, NULL,
+                          /* FIXME: Currently not configurable by caller.  */
+                          /* FIXME: LocalService or NetworkService
+                             don't work for dirmngr right now.  NOTE!
+                             If you change it here, you also should
+                             adjust make-msi.pl for the msi
+                             installer.  In the future, this should
+                             be an argument to the function and then
+                             the make-msi.pl script can extract it
+                             from the invocation.  */
+                          NULL /* "NT AUTHORITY\\LocalService" */,
+                          NULL);
+  if (service == NULL)
+    {
+      service_error ("CreateService");
+      CloseServiceHandle (sc);
+      return;
+    }
+  CloseServiceHandle (service);
+
+  result = GetLastError () ? "1":"0";
+  setuservariable (INST_R0, result);
+  return;
+}
+
+
+/* Requires g_hwndParent to be set!  */
+SC_HANDLE
+service_lookup (char *service_name)
+{
+  SC_HANDLE sc;
+  SC_HANDLE service;
+
+  sc = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
+  if (sc == NULL)
+    {
+      service_error ("OpenSCManager");
+      return NULL;
+    }
+  service = OpenService (sc, service_name, SC_MANAGER_ALL_ACCESS);
+  if (service == NULL)
+    {
+      /* Fail silently here.  */
+      CloseServiceHandle (sc);
+      return NULL;
+    }
+  CloseServiceHandle (sc);
+  return service;
+}
+
+
+/* Returns status.  */
+void __declspec(dllexport)
+service_query (HWND hwndParent, int string_size, char *variables,
+              stack_t **stacktop, extra_parameters_t *extra)
+{
+  SC_HANDLE service;
+  const char *result = NULL;
+  char service_name[256];
+  int err = 0;
+  SERVICE_STATUS status;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: service_name argc [argv].  */
+  if (popstring (service_name, sizeof (service_name)))
+    err = 1;
+  if (err)
+    {
+      setuservariable (INST_R0, "ERROR");
+      return;
+    }
+
+  service = service_lookup (service_name);
+  if (service == NULL)
+  if (err == 0)
+    {
+      setuservariable (INST_R0, "MISSING");
+      return;
+    }
+
+  err = QueryServiceStatus (service, &status);
+  if (err == 0)
+    {
+      setuservariable (INST_R0, "ERROR");
+      CloseServiceHandle (service);
+      return;
+    }
+  CloseServiceHandle (service);
+
+  switch (status.dwCurrentState)
+    {
+    case SERVICE_START_PENDING:
+      result = "START_PENDING";
+      break;
+    case SERVICE_RUNNING:
+      result = "RUNNING";
+      break;
+    case SERVICE_PAUSE_PENDING:
+      result = "PAUSE_PENDING";
+      break;
+    case SERVICE_PAUSED:
+      result = "PAUSED";
+      break;
+    case SERVICE_CONTINUE_PENDING:
+      result = "CONTINUE_PENDING";
+      break;
+    case SERVICE_STOP_PENDING:
+      result = "STOP_PENDING";
+      break;
+    case SERVICE_STOPPED:
+      result = "STOPPED";
+      break;
+    default:
+      result = "UNKNOWN";
+    }
+  setuservariable (INST_R0, result);
+  return;
+}
+
+
+void __declspec(dllexport)
+service_start (HWND hwndParent, int string_size, char *variables,
+              stack_t **stacktop, extra_parameters_t *extra)
+{
+  SC_HANDLE service;
+  const char *result = NULL;
+  char service_name[256];
+  char argc_str[256];
+#define NR_ARGS 10
+#define ARG_MAX 256
+  char argv_str[NR_ARGS][ARG_MAX];
+  const char *argv[NR_ARGS + 1];
+  int argc;
+  int i;
+  int err = 0;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: service_name argc [argv].  */
+  if (popstring (service_name, sizeof (service_name)))
+    err = 1;
+  if (!err && popstring (argc_str, sizeof (argc_str)))
+    err = 1;
+  if (!err)
+    {
+      argc = atoi (argc_str);
+      for (i = 0; i < argc; i++)
+       {
+         if (popstring (argv_str[i], ARG_MAX))
+           {
+             err = 1;
+             break;
+           }
+         argv[i] = argv_str[i];
+       }
+      argv[i] = NULL;
+    }
+  if (err)
+    {
+      setuservariable (INST_R0, "1");
+      return;
+    }
+
+  service = service_lookup (service_name);
+  if (service == NULL)
+    return;
+
+  err = StartService (service, argc, argc == 0 ? NULL : argv);
+  if (err == 0)
+    {
+      service_error ("StartService");
+      CloseServiceHandle (service);
+      return;
+    }
+  CloseServiceHandle (service);
+
+  setuservariable (INST_R0, "0");
+  return;
+}
+
+
+void __declspec(dllexport)
+service_stop (HWND hwndParent, int string_size, char *variables,
+             stack_t **stacktop, extra_parameters_t *extra)
+{
+  SC_HANDLE service;
+  const char *result = NULL;
+  char service_name[256];
+  int err = 0;
+  SERVICE_STATUS status;
+  DWORD timeout = 10000;       /* 10 seconds.  */
+  DWORD start_time;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: service_name argc [argv].  */
+  if (popstring (service_name, sizeof (service_name)))
+    err = 1;
+  if (err)
+    {
+      setuservariable (INST_R0, "1");
+      return;
+    }
+
+  service = service_lookup (service_name);
+  if (service == NULL)
+    return;
+
+  err = QueryServiceStatus (service, &status);
+  if (err == 0)
+    {
+      service_error ("QueryService");
+      CloseServiceHandle (service);
+      return;
+    }
+
+  if (status.dwCurrentState != SERVICE_STOPPED
+      && status.dwCurrentState != SERVICE_STOP_PENDING)
+    {
+      err = ControlService (service, SERVICE_CONTROL_STOP, &status);
+      if (err == 0)
+       {
+         service_error ("ControlService");
+         CloseServiceHandle (service);
+         return;
+       }
+    }
+
+  start_time = GetTickCount ();
+  while (status.dwCurrentState != SERVICE_STOPPED)
+    {
+      Sleep (1000);    /* One second.  */
+      if (!QueryServiceStatus (service, &status))
+       {
+         service_error ("QueryService");
+         CloseServiceHandle (service);
+         return;
+       }
+      if (status.dwCurrentState == SERVICE_STOPPED)
+       break;
+
+      if (GetTickCount () - start_time > timeout)
+       {
+         char buf[1024];
+         snprintf (buf, sizeof (buf) - 1,
+                   "time out waiting for service %s to stop\r\n",
+                   service_name);
+         MessageBox (g_hwndParent, buf, 0, MB_OK);
+         setuservariable (INST_R0, "1");
+         return;
+       }
+    }
+  CloseServiceHandle (service);
+  setuservariable (INST_R0, "0");
+  return;
+}
+
+
+void __declspec(dllexport)
+service_delete (HWND hwndParent, int string_size, char *variables,
+               stack_t **stacktop, extra_parameters_t *extra)
+{
+  SC_HANDLE service;
+  const char *result = NULL;
+  char service_name[256];
+  int err = 0;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: service_name argc [argv].  */
+  if (popstring (service_name, sizeof (service_name)))
+    err = 1;
+  if (err)
+    {
+      setuservariable (INST_R0, "1");
+      return;
+    }
+
+  service = service_lookup (service_name);
+  if (service == NULL)
+    return;
+
+  err = DeleteService (service);
+  if (err == 0)
+    {
+      service_error ("DeleteService");
+      CloseServiceHandle (service);
+      return;
+    }
+  CloseServiceHandle (service);
+
+  setuservariable (INST_R0, "0");
+  return;
+}
+
+\f
+#include <stdio.h>
+
+/* Extract config file parameters.  FIXME: Not particularly robust.
+   We expect some reasonable formatting.  The parser below is very
+   limited.  It expects a command line option /c=FILE or /C=FILE,
+   where FILE must be enclosed in double-quotes if it contains spaces.
+   That file should contain a single section [gpg4win] and KEY=VALUE
+   pairs for each additional configuration file to install.  Comments
+   are supported only on lines by themselves.  VALUE can be quoted in
+   double-quotes, but does not need to be, unless it has whitespace at
+   the beginning or end.  KEY can, for example, be "gpg.conf" (without
+   the quotes).  */
+void
+config_init (char **keys, char **values, int max)
+{
+  /* First, parse the command line.  */
+  char *cmdline;
+  char *begin = NULL;
+  char *end = NULL;
+  char mark;
+  char *fname;
+  char *ptr;
+  FILE *conf;
+
+  *keys = NULL;
+  *values = NULL;
+
+  cmdline = getuservariable (INST_CMDLINE);
+
+  mark = (*cmdline == '"') ? (cmdline++, '"') : ' ';
+  while (*cmdline && *cmdline != mark)
+    cmdline++;
+  if (mark == '"' && *cmdline)
+    cmdline++;
+  while (*cmdline && *cmdline == ' ')
+    cmdline++;
+
+  while (*cmdline)
+    {
+      /* We are at the beginning of a new argument.  */
+      if (cmdline[0] == '/' && (cmdline[1] == 'C' || cmdline[1] == 'c')
+         && cmdline[2] == '=')
+       {
+         cmdline += 3;
+         begin = cmdline;
+       }
+
+      while (*cmdline && *cmdline != ' ')
+       {
+         /* Skip over quoted parts.  */
+         if (*cmdline == '"')
+           {
+             cmdline++;
+             while (*cmdline && *cmdline != '"')
+               cmdline++;
+             if (*cmdline)
+               cmdline++;
+           }
+         else
+           cmdline++;
+       }
+      if (begin && !end)
+       {
+         end = cmdline - 1;
+         break;
+       }
+      while (*cmdline && *cmdline == ' ')
+       cmdline++;
+    }
+
+  if (!begin || begin > end)
+    return;
+
+  /* Strip quotes.  */
+  if (*begin == '"' && *end == '"')
+    {
+      begin++;
+      end--;
+    }
+  if (begin > end)
+    return;
+
+  fname = malloc (end - begin + 2);
+  if (!fname)
+    return;
+
+  ptr = fname;
+  while (begin <= end)
+    *(ptr++) = *(begin++);
+  *ptr = '\0';
+
+  conf = fopen (fname, "r");
+  free (fname);
+  if (!conf)
+    return;
+
+  while (max - 1 > 0)
+    {
+      char line[256];
+      char *ptr2;
+
+      if (fgets (line, sizeof (line), conf) == NULL)
+       break;
+      ptr = &line[strlen (line)];
+      while (ptr > line && (ptr[-1] == '\n' || ptr[-1] == '\r'
+                           || ptr[-1] == ' ' || ptr[-1] == '\t'))
+       ptr--;
+      *ptr = '\0';
+
+      ptr = line;
+      while (*ptr && (*ptr == ' ' || *ptr == '\t'))
+       ptr++;
+      /* Ignore comment lines.  */
+      /* FIXME: Ignore section markers.  */
+      if (*ptr == '\0' || *ptr == ';' || *ptr == '[')
+       continue;
+      begin = ptr;
+      while (*ptr && *ptr != '=' && *ptr != ' ' && *ptr != '\t')
+       ptr++;
+      end = ptr - 1;
+      while (*ptr && (*ptr == ' ' || *ptr == '\t'))
+       ptr++;
+      if (*ptr != '=')
+       continue;
+      ptr++;
+
+      if (begin > end)
+       continue;
+
+      /* We found a key.  */
+      *keys = malloc (end - begin + 2);
+      if (!keys)
+       return;
+      ptr2 = *keys;
+      while (begin <= end)
+       *(ptr2++) = *(begin++);
+      *ptr2 = '\0';
+
+      *values = NULL;
+
+      while (*ptr && (*ptr == ' ' || *ptr == '\t'))
+       ptr++;
+      begin = ptr;
+      /* In this case, end points to the byte after the value, which
+        is OK because that is '\0'.  */
+      end = &line[strlen (line)];
+      if (begin > end)
+       begin = end;
+
+      /* Strip quotes.  */
+      if (*begin == '"' && end[-1] == '"')
+       {
+         begin++;
+         end--;
+         *end = '\0';
+       }
+      if (begin > end)
+       return;
+
+      *values = malloc (end - begin + 1);
+      ptr2 = *values;
+      while (begin <= end)
+       *(ptr2++) = *(begin++);
+
+      keys++;
+      values++;
+      max--;
+    }
+
+  fclose (conf);
+  *keys = NULL;
+  *values = NULL;
+}
+
+
+char *
+config_lookup (char *key)
+{
+#define MAX_KEYS 128
+  static int initialised = 0;
+  static char *keys[MAX_KEYS];
+  static char *values[MAX_KEYS];
+  int i;
+
+  if (initialised == 0)
+    {
+      initialised = 1;
+      config_init (keys, values, MAX_KEYS);
+
+#if 0
+      MessageBox(g_hwndParent, "Configuration File:", 0, MB_OK);
+      i = 0;
+      while (keys[i])
+       {
+         char buf[256];
+         sprintf (buf, "%s=%s\r\n", keys[i], values[i]);
+         MessageBox (g_hwndParent, buf, 0, MB_OK);
+         i++;
+       }
+#endif
+    }
+
+  i = 0;
+  while (keys[i])
+    {
+      if (!strcmp (keys[i], key))
+       return values[i];
+      i++;
+    }
+
+  return NULL;
+}
+
+
+void __declspec(dllexport)
+config_fetch (HWND hwndParent, int string_size, char *variables,
+             stack_t **stacktop, extra_parameters_t *extra)
+{
+  char key[256];
+  int err = 0;
+  char *value;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: key.  */
+  if (popstring (key, sizeof (key)))
+    err = 1;
+  if (err)
+    {
+      setuservariable (INST_R0, "");
+      return;
+    }
+
+  value = config_lookup (key);
+
+  setuservariable (INST_R0, value == NULL ? "" : value);
+  return;
+}
+
+
+void __declspec(dllexport)
+config_fetch_bool (HWND hwndParent, int string_size, char *variables,
+                  stack_t **stacktop, extra_parameters_t *extra)
+{
+  char key[256];
+  int err = 0;
+  char *value;
+  int result;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  /* The expected stack layout: key.  */
+  if (popstring (key, sizeof (key)))
+    err = 1;
+  if (err)
+    {
+      setuservariable (INST_R0, "");
+      return;
+    }
+
+  value = config_lookup (key);
+  if (value == NULL || *value == '\0')
+    {
+      setuservariable (INST_R0, "");
+      return;
+    }
+
+  result = 0;
+  if (!strcasecmp (value, "true")
+      || !strcasecmp (value, "yes")
+      || atoi (value) != 0)
+    result = 1;
+
+  setuservariable (INST_R0, result == 0 ? "0" : "1");
+  return;
+}
+
+\f
+/* Return a string from the Win32 Registry or NULL in case of error.
+   Caller must release the return value.  A NULL for root is an alias
+   for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn.  */
+char *
+read_w32_registry_string (HKEY root, const char *dir, const char *name)
+{
+  HKEY root_key;
+  HKEY key_handle;
+  DWORD n1, nbytes, type;
+  char *result = NULL;
+
+  root_key = root;
+  if (! root_key)
+    root_key = HKEY_CURRENT_USER;
+
+  if( RegOpenKeyEx( root_key, dir, 0, KEY_READ, &key_handle ) )
+    {
+      if (root)
+       return NULL; /* no need for a RegClose, so return direct */
+      /* It seems to be common practise to fall back to HKLM. */
+      if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
+       return NULL; /* still no need for a RegClose, so return direct */
+    }
+
+  nbytes = 1;
+  if( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) {
+    if (root)
+      goto leave;
+    /* Try to fallback to HKLM also vor a missing value.  */
+    RegCloseKey (key_handle);
+    if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
+      return NULL; /* Nope.  */
+    if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes))
+      goto leave;
+  }
+
+  result = malloc( (n1=nbytes+1) );
+
+  if( !result )
+    goto leave;
+  if( RegQueryValueEx( key_handle, name, 0, &type, result, &n1 ) ) {
+    free(result); result = NULL;
+    goto leave;
+  }
+  result[nbytes] = 0; /* make sure it is really a string  */
+
+ leave:
+  RegCloseKey( key_handle );
+  return result;
+}
+
+
+#define ENV_HK HKEY_LOCAL_MACHINE
+#define ENV_REG "SYSTEM\\CurrentControlSet\\Control\\" \
+    "Session Manager\\Environment"
+  /* The following setting can be used for a per-user setting.  */
+#if 0
+#define ENV_HK HKEY_CURRENT_USER
+#define ENV_REG "Environment"
+#endif
+/* Due to a bug in Windows7 (kb 2685893) we better but a lower limit
+   than 8191 on the maximum length of the PATH variable.  Note, that
+   depending on the used toolchain we used to have a 259 byte limit in
+   the past.  */
+#define PATH_LENGTH_LIMIT 2047
+
+void __declspec(dllexport)
+path_add (HWND hwndParent, int string_size, char *variables,
+         stack_t **stacktop, extra_parameters_t *extra)
+{
+  char dir[PATH_LENGTH_LIMIT];
+  char *path;
+  char *path_new;
+  int path_new_size;
+  char *comp;
+  const char delims[] = ";";
+  HKEY key_handle = 0;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  setuservariable (INST_R0, "0");
+
+/*   MessageBox (g_hwndParent, "XXX 1", 0, MB_OK); */
+
+  /* The expected stack layout: path component.  */
+  if (popstring (dir, sizeof (dir)))
+    return;
+
+/*   MessageBox (g_hwndParent, "XXX 2", 0, MB_OK); */
+
+  path = read_w32_registry_string (ENV_HK, ENV_REG, "Path");
+  if (! path)
+    {
+      MessageBox (g_hwndParent, "No PATH variable found", 0, MB_OK);
+      return;
+    }
+
+/*   MessageBox (g_hwndParent, "XXX 3", 0, MB_OK); */
+
+  /* Old path plus semicolon plus dir plus terminating nul.  */
+  path_new_size = strlen (path) + 1 + strlen (dir) + 1;
+  if (path_new_size > PATH_LENGTH_LIMIT)
+    {
+      MessageBox (g_hwndParent, "PATH env variable too big", 0, MB_OK);
+      free (path);
+      return;
+    }
+
+/*   MessageBox (g_hwndParent, "XXX 4", 0, MB_OK); */
+
+  path_new = malloc (path_new_size);
+  if (!path_new)
+    {
+      free (path);
+      return;
+    }
+
+/*   MessageBox (g_hwndParent, "XXX 5", 0, MB_OK); */
+
+  strcpy (path_new, path);
+  strcat (path_new, ";");
+  strcat (path_new, dir);
+
+/*   MessageBox (g_hwndParent, "XXX 6", 0, MB_OK); */
+/*   MessageBox (g_hwndParent, dir, 0, MB_OK); */
+/*   MessageBox (g_hwndParent, "XXX 7", 0, MB_OK); */
+
+  /* Check if the directory already exists in the path.  */
+  comp = strtok (path, delims);
+  do
+    {
+/*       MessageBox (g_hwndParent, comp, 0, MB_OK); */
+
+      if (!strcmp (comp, dir))
+       {
+         free (path);
+         free (path_new);
+         return;
+       }
+      comp = strtok (NULL, delims);
+    }
+  while (comp);
+  free (path);
+
+/*   MessageBox (g_hwndParent, "XXX 8", 0, MB_OK); */
+
+  /* Set a key for our CLSID.  */
+  RegCreateKey (ENV_HK, ENV_REG, &key_handle);
+  RegSetValueEx (key_handle, "Path", 0, REG_EXPAND_SZ,
+                path_new, path_new_size);
+  RegCloseKey (key_handle);
+  SetEnvironmentVariable("PATH", path_new);
+  free (path_new);
+
+/*   MessageBox (g_hwndParent, "XXX 9", 0, MB_OK); */
+
+  setuservariable (INST_R0, "1");
+}
+
+
+void __declspec(dllexport)
+path_remove (HWND hwndParent, int string_size, char *variables,
+            stack_t **stacktop, extra_parameters_t *extra)
+{
+  char dir[PATH_LENGTH_LIMIT];
+  char *path;
+  char *path_new;
+  int path_new_size;
+  char *comp;
+  const char delims[] = ";";
+  HKEY key_handle = 0;
+  int changed = 0;
+  int count = 0;
+
+  g_hwndParent = hwndParent;
+  EXDLL_INIT();
+
+  setuservariable (INST_R0, "0");
+
+  /* The expected stack layout: path component.  */
+  if (popstring (dir, sizeof (dir)))
+    return;
+
+  path = read_w32_registry_string (ENV_HK, ENV_REG, "Path");
+  /* Old path plus semicolon plus dir plus terminating nul.  */
+  path_new_size = strlen (path) + 1;
+  path_new = malloc (path_new_size);
+  if (!path_new)
+    {
+      free (path);
+      return;
+    }
+  path_new[0] = '\0';
+
+  /* Compose the new path.  */
+  comp = strtok (path, delims);
+  do
+    {
+      if (strcmp (comp, dir))
+       {
+         if (count != 0)
+           strcat (path_new, ";");
+         strcat (path_new, comp);
+         count++;
+       }
+      else
+       changed = 1;
+
+      comp = strtok (NULL, delims);
+    }
+  while (comp);
+  free (path);
+
+  if (! changed)
+    return;
+
+  /* Set a key for our CLSID.  */
+  RegCreateKey (ENV_HK, ENV_REG, &key_handle);
+  RegSetValueEx (key_handle, "Path", 0, REG_EXPAND_SZ,
+                path_new, path_new_size);
+  RegCloseKey (key_handle);
+  free (path_new);
+
+  setuservariable (INST_R0, "1");
+}
diff --git a/build-aux/speedo/w32/gdk-pixbuf-loaders.cache b/build-aux/speedo/w32/gdk-pixbuf-loaders.cache
new file mode 100755 (executable)
index 0000000..af51346
--- /dev/null
@@ -0,0 +1,135 @@
+# GdkPixbuf Image Loader Modules file
+# Automatically generated file, do not edit
+# Created by gdk-pixbuf-query-loaders.exe from gdk-pixbuf-2.26.5
+#
+# LoaderDir = ../lib/gdk-pixbuf-2.0/2.10.0/loaders
+#
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ani.dll"
+"ani" 4 "gdk-pixbuf" "The ANI image format" "LGPL"
+"application/x-navi-animation" ""
+"ani" ""
+"RIFF    ACON" "    xxxx    " 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-bmp.dll"
+"bmp" 5 "gdk-pixbuf" "The BMP image format" "LGPL"
+"image/bmp" "image/x-bmp" "image/x-MS-bmp" ""
+"bmp" ""
+"BM" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-emf.dll"
+"emf" 4 "gdk-pixbuf" "The EMF image format" "LGPL"
+"application/emf" "application/x-emf" "image/x-emf" "image/x-mgx-emf" ""
+"emf" ""
+"\001" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-gif.dll"
+"gif" 5 "gdk-pixbuf" "The GIF image format" "LGPL"
+"image/gif" ""
+"gif" ""
+"GIF8" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-ico.dll"
+"ico" 4 "gdk-pixbuf" "The ICO image format" "LGPL"
+"image/x-icon" "image/x-ico" ""
+"ico" "cur" ""
+"  \001   " "zz znz" 100
+"  \002   " "zz znz" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-jpeg.dll"
+"jpeg" 5 "gdk-pixbuf" "The JPEG image format" "LGPL"
+"image/jpeg" ""
+"jpeg" "jpe" "jpg" ""
+"\377\330" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-tiff.dll"
+"tiff" 5 "gdk-pixbuf" "The TIFF image format" "LGPL"
+"image/tiff" ""
+"tiff" "tif" ""
+"MM *" "  z " 100
+"II* " "   z" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-wmf.dll"
+"wmf" 4 "gdk-pixbuf" "The WMF image format" "LGPL"
+"image/x-wmf" ""
+"wmf" "apm" ""
+"\327\315\306\232" "" 100
+"\001" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-icns.dll"
+"icns" 4 "gdk-pixbuf" "The ICNS image format" "GPL"
+"image/x-icns" ""
+"icns" ""
+"icns" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-pcx.dll"
+"pcx" 4 "gdk-pixbuf" "The PCX image format" "LGPL"
+"image/x-pcx" ""
+"pcx" ""
+"\n \001" "" 100
+"\n\002\001" "" 100
+"\n\003\001" "" 100
+"\n\004\001" "" 100
+"\n\005\001" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.dll"
+"png" 5 "gdk-pixbuf" "The PNG image format" "LGPL"
+"image/png" ""
+"png" ""
+"\211PNG\r\n\032\n" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-pnm.dll"
+"pnm" 4 "gdk-pixbuf" "The PNM/PBM/PGM/PPM image format family" "LGPL"
+"image/x-portable-anymap" "image/x-portable-bitmap" "image/x-portable-graymap" "image/x-portable-pixmap" ""
+"pnm" "pbm" "pgm" "ppm" ""
+"P1" "" 100
+"P2" "" 100
+"P3" "" 100
+"P4" "" 100
+"P5" "" 100
+"P6" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-qtif.dll"
+"qtif" 4 "gdk-pixbuf" "The QTIF image format" "LGPL"
+"image/x-quicktime" "image/qtif" ""
+"qtif" "qif" ""
+"abcdidsc" "xxxx    " 100
+"abcdidat" "xxxx    " 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ras.dll"
+"ras" 4 "gdk-pixbuf" "The Sun raster image format" "LGPL"
+"image/x-cmu-raster" "image/x-sun-raster" ""
+"ras" ""
+"Y\246j\225" "" 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tga.dll"
+"tga" 4 "gdk-pixbuf" "The Targa image format" "LGPL"
+"image/x-tga" ""
+"tga" "targa" ""
+" \001\001" "x  " 100
+" \001\t" "x  " 100
+"  \002" "xz " 99
+"  \003" "xz " 100
+"  \n" "xz " 100
+"  \v" "xz " 100
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-wbmp.dll"
+"wbmp" 4 "gdk-pixbuf" "The WBMP image format" "LGPL"
+"image/vnd.wap.wbmp" ""
+"wbmp" ""
+"  " "zz" 1
+" `" "z " 1
+" @" "z " 1
+"  " "z " 1
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-xbm.dll"
+"xbm" 4 "gdk-pixbuf" "The XBM image format" "LGPL"
+"image/x-xbitmap" ""
+"xbm" ""
+"#define " "" 100
+"/*" "" 50
+
+"../lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-xpm.dll"
+"xpm" 4 "gdk-pixbuf" "The XPM image format" "LGPL"
+"image/x-xpixmap" ""
+"xpm" ""
+"/* XPM */" "" 100
diff --git a/build-aux/speedo/w32/inst-options.ini b/build-aux/speedo/w32/inst-options.ini
new file mode 100644 (file)
index 0000000..8697e89
--- /dev/null
@@ -0,0 +1,46 @@
+[Settings]
+NumFields=5
+
+; The number of the fields here is known in w32inst.nsi.
+; The tags must be "[Field N]" with N=1..NumFields
+
+[Field 1]
+Type=Label
+Left=0
+Right=-1
+Top=0
+Bottom=20
+
+[Field 2]
+Type=Checkbox
+Left=0
+Right=-1
+Top=30
+Bottom=40
+;Text=Start Menu
+State=1
+
+[Field 3]
+Type=Checkbox
+Left=0
+Right=-1
+Top=50
+Bottom=60
+;Text=Desktop
+State=0
+
+[Field 4]
+Type=Checkbox
+Left=0
+Right=-1
+Top=70
+Bottom=80
+;Text=Quick Launch Bar
+State=0
+
+[Field 5]
+Type=Label
+Left=0
+Right=-1
+Top=90
+Bottom=130
diff --git a/build-aux/speedo/w32/inst.nsi b/build-aux/speedo/w32/inst.nsi
new file mode 100644 (file)
index 0000000..cf627f6
--- /dev/null
@@ -0,0 +1,1233 @@
+# inst.nsi - Installer for GnuPG on Windows.      -*- coding: latin-1; -*-
+# Copyright (C) 2005, 2014 g10 Code GmbH
+#
+# This file is part of GnuPG.
+#
+# GnuPG 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; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GnuPG is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+# Macros to provide for invocation:
+#  INST_DIR
+#  INST6_DIR
+#  BUILD_DIR
+#  TOP_SRCDIR
+#  W32_SRCDIR
+#  BUILD_ISODATE
+#  VERSION
+#  PROD_VERSION
+
+!cd "${INST_DIR}"
+!addincludedir "${W32_SRCDIR}"
+!addplugindir "${BUILD_DIR}"
+
+# The package name and version.  PRETTY_PACKAGE is a user visible name
+# only while PACKAGE is useful for filenames etc.  PROD_VERSION is the
+# product version and needs to be in the format "MAJ.MIN.MIC.BUILDNR".
+!define PACKAGE "gnupg"
+!define PACKAGE_SHORT "gnupg"
+!define PRETTY_PACKAGE "GNU Privacy Guard"
+!define PRETTY_PACKAGE_SHORT "GnuPG"
+!define COMPANY "The GnuPG Project"
+!define COPYRIGHT "Copyright (C) 2014 The GnuPG Project"
+!define DESCRIPTION "GnuPG: The GNU Privacy Guard for Windows"
+
+!define INSTALL_DIR "GnuPG"
+
+!define WELCOME_TITLE_ENGLISH \
+ "Welcome to the installation of GnuPG"
+
+!define WELCOME_TITLE_GERMAN \
+ "Willkommen bei der Installation von GnuPG"
+
+!define ABOUT_ENGLISH \
+ "GnuPG is the mostly used software for mail and data encryption. \
+  It can be used to encrypt data and to create digital signatures. \
+  It includes an advanced key management facility and is compliant \
+  with the proposed OpenPGP Internet standard as described in RFC-4880. \
+  \r\n\r\n$_CLICK \
+  \r\n\r\n\r\n\r\n\r\nThis is GnuPG version ${VERSION}\r\n\
+  file version ${PROD_VERSION}\r\n\
+  release date ${BUILD_ISODATE}"
+!define ABOUT_GERMAN \
+ "GnuPG is die häufigst verwendete Software zur Mail- und Datenverschlüsselung.\
+   \r\n\r\n$_CLICK \
+   \r\n\r\n\r\n\r\n\r\nDies ist GnuPG Version ${VERSION}\r\n\
+   Dateiversion ${PROD_VERSION}\r\n\
+   Releasedatum ${BUILD_ISODATE}"
+
+
+# The copyright license of the package.  Define only one of these.
+!define LICENSE_GPL
+
+# Select the best compression algorithm available.  The dictionary
+# size is the default (8 MB).
+!ifndef SOURCES
+SetCompressor lzma
+# SetCompressorDictSize 8
+!endif
+
+# Include the generic parts.
+!define HAVE_STARTMENU
+
+# We use the modern UI.
+!include "MUI.nsh"
+
+# Some helper some
+!include "LogicLib.nsh"
+!include "x64.nsh"
+
+# Set the package name.  Note that this name should not be suffixed
+# with the version because this would get displayed in the start menu.
+# Given that a slash in the name troubles Windows startmenu creation
+# we set the Startmenu explicit below.
+Name "${PRETTY_PACKAGE}"
+
+# Set the output filename.
+OutFile "${PACKAGE}-${VERSION}.exe"
+
+#Fixme: Do we need a logo
+#Icon "${TOP_SRCDIR}/doc/logo/gnupg-logo-icon.ico"
+#UninstallIcon "${TOP_SRCDIR}/doc/logo/gnupg-logo-icon.ico"
+
+# Set the installation directory.
+!ifndef INSTALL_DIR
+!define INSTALL_DIR "GnuPG"
+!endif
+InstallDir "$PROGRAMFILES\GNU\${INSTALL_DIR}"
+
+InstallDirRegKey HKLM "Software\GNU\${PACKAGE_SHORT}" "Install Directory"
+
+
+# Add version information to the file properties.
+VIProductVersion "${PROD_VERSION}"
+VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
+VIAddVersionKey "Comments" \
+   "GnuPG is Free Software; you can redistribute it  \
+    and/or modify it under the terms of the GNU General Public License.  \
+    You should have received a copy of the GNU General Public License  \
+    along with this software; if not, write to the Free Software  \
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
+    MA 02110-1301, USA"
+VIAddVersionKey "CompanyName" "${COMPANY}"
+VIAddVersionKey "LegalTrademarks" ""
+VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
+VIAddVersionKey "FileDescription" "${DESCRIPTION}"
+VIAddVersionKey "FileVersion" "${PROD_VERSION}"
+
+# Interface Settings
+
+# !define MUI_ABORTWARNING
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE
+
+#!define MUI_HEADERIMAGE
+#!define MUI_HEADERIMAGE_BITMAP \
+#               "${TOP_SRCDIR}/doc/logo/gnupg-logo-150x57.bmp"
+#!define MUI_WELCOMEFINISHPAGE_BITMAP \
+#               "${TOP_SRCDIR}/doc/logo/gnupg-logo-164x314.bmp"
+
+# Remember the installer language
+!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
+!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\GnuPG"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
+
+#
+# The list of wizard pages.
+#
+!define MUI_WELCOMEPAGE_TITLE "$(T_WelcomeTitle)"
+!define MUI_WELCOMEPAGE_TEXT  "$(T_About)"
+!insertmacro MUI_PAGE_WELCOME
+
+!define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
+!define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
+!define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
+!insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
+
+!define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
+!insertmacro MUI_PAGE_COMPONENTS
+
+!define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
+!insertmacro MUI_PAGE_DIRECTORY
+
+!ifdef HAVE_STARTMENU
+
+Page custom CustomPageOptions
+
+Var STARTMENU_FOLDER
+
+!define MUI_PAGE_CUSTOMFUNCTION_PRE CheckIfStartMenuWanted
+!define MUI_STARTMENUPAGE_NODISABLE
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\GnuPG"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+# We need to set the Startmenu name explicitly because a slash in the
+# name is not possible.
+!define MUI_STARTMENUPAGE_DEFAULTFOLDER "GnuPG"
+
+!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
+
+!endif
+
+!define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
+!insertmacro MUI_PAGE_INSTFILES
+
+#!define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
+!define MUI_FINISHPAGE_SHOWREADME "README.txt"
+!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
+#!define MUI_FINISHPAGE_RUN
+#!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
+#!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
+#!define MUI_FINISHPAGE_RUN_NOTCHECKED
+!define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
+!define MUI_FINISHPAGE_LINK_LOCATION "$(T_MoreInfoURL)"
+!insertmacro MUI_PAGE_FINISH
+
+
+# Uninstaller pages.
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+
+#Page license
+#Page components
+#Page directory
+#Page instfiles
+#UninstPage uninstConfirm
+#UninstPage instfiles
+
+
+# Language support.  This has to be done after defining the pages, but
+# before defining the translation strings.  Confusing.
+
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "German"
+
+!insertmacro MUI_RESERVEFILE_LANGDLL
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+ReserveFile "${BUILD_DIR}\g4wihelp.dll"
+#ReserveFile "${TOP_SRCDIR}\doc\logo\gnupg-logo-400px.bmp"
+#ReserveFile "${W32_SRCDIR}\gnupg-splash.wav"
+ReserveFile "${TOP_SRCDIR}\COPYING"
+ReserveFile "${BUILD_DIR}\inst-options.ini"
+#ReserveFile "${TOP_SRCDIR}\doc\logo\gnupg-logo-164x314.bmp"
+
+# Language support
+
+LangString T_LangCode ${LANG_ENGLISH} "en"
+LangString T_LangCode ${LANG_GERMAN}  "de"
+
+
+# The WelcomeTitle is displayed on the first page.
+LangString T_WelcomeTitle ${LANG_ENGLISH} "${WELCOME_TITLE_ENGLISH}"
+LangString T_WelcomeTitle ${LANG_GERMAN} "${WELCOME_TITLE_GERMAN}"
+
+# The About string as displayed on the first page.
+LangString T_About ${LANG_ENGLISH} "${ABOUT_ENGLISH}"
+LangString T_About ${LANG_GERMAN} "${ABOUT_GERMAN}"
+
+# Startup page
+LangString T_GPLHeader ${LANG_ENGLISH} \
+  "This software is licensed under the terms of the GNU General Public \
+   License (GNU GPL)."
+LangString T_GPLHeader ${LANG_GERMAN}} \
+  "Diese Software ist unter der GNU General Public License \
+   (GNU GPL) lizensiert."
+
+LangString T_GPLShort ${LANG_ENGLISH} \
+  "In short: You are allowed to run this software for any purpose. \
+   You may distribute it as long as you give the recipients the same \
+   rights you have received."
+LangString T_GPLShort ${LANG_GERMAN} \
+  "In aller Kürze: Sie haben das Recht, die Software zu jedem Zweck \
+   einzusetzen.  Sie können die Software weitergeben, sofern Sie dem \
+   Empfänger dieselben Rechte einräumen, die auch Sie erhalten haben."
+
+LangString T_RunKeyManager ${LANG_ENGLISH} \
+   "Run the key manager"
+LangString T_RunKeyManager ${LANG_GERMAN} \
+   "Die Schlüsselverwaltung aufrufen"
+
+LangString T_MoreInfo ${LANG_ENGLISH} \
+   "Click here for GnuPG's website"
+LangString T_MoreInfo ${LANG_GERMAN} \
+   "Hier klicken um zur GnuPG Homepage zu gelangen"
+LangString T_MoreInfoURL ${LANG_ENGLISH} "https://gnupg.org"
+LangString T_MoreInfoURL ${LANG_GERMAN}  "https://gnupg.org"
+
+LangString T_ShowReadme ${LANG_ENGLISH} \
+   "Show the README file"
+LangString T_ShowReadme ${LANG_GERMAN} \
+   "Die README Datei anzeigen"
+
+LangString T_NoKeyManager ${LANG_ENGLISH} \
+   "No key manager has been installed, thus we can't run one now."
+LangString T_NoKeyManager ${LANG_GERMAN} \
+   "Es wurde keine Schlüsselverwaltung installiert. \
+    Deswegen kann sie jetzt auch nicht ausgeführt werden."
+
+# Functions
+
+# Custom functions and macros for this installer.
+LangString T_AlreadyRunning ${LANG_ENGLISH} \
+   "An instance of this installer is already running."
+LangString T_AlreadyRunning ${LANG_GERMAN} \
+   "Ein Exemplar dieses Installers läuft bereits."
+
+Function G4wRunOnce
+  Push $R0
+  StrCpy $R0 "gnupg"
+  g4wihelp::runonce
+  StrCmp $R0 0 +3
+     MessageBox MB_OK $(T_AlreadyRunning)
+     Abort
+  Pop $R0
+FunctionEnd
+
+#
+# Control function for the Custom page to select special
+# install options.
+#
+Function CustomPageOptions
+  !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_InstallOptLinks)"
+
+  # Note, that the default selection is done in the ini file
+  !insertmacro MUI_INSTALLOPTIONS_WRITE "${BUILD_DIR}/inst-options.ini" \
+       "Field 1" "Text"  "$(T_InstOptLabelA)"
+  !insertmacro MUI_INSTALLOPTIONS_WRITE "${BUILD_DIR}/inst-options.ini" \
+       "Field 2" "Text"  "$(T_InstOptFieldA)"
+  !insertmacro MUI_INSTALLOPTIONS_WRITE "${BUILD_DIR}/inst-options.ini" \
+       "Field 3" "Text"  "$(T_InstOptFieldB)"
+  !insertmacro MUI_INSTALLOPTIONS_WRITE "${BUILD_DIR}/inst-options.ini" \
+       "Field 4" "Text"  "$(T_InstOptFieldC)"
+  !insertmacro MUI_INSTALLOPTIONS_WRITE "${BUILD_DIR}/inst-options.ini" \
+       "Field 5" "Text"  "$(T_InstOptLabelB)"
+
+  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "${BUILD_DIR}/inst-options.ini"
+FunctionEnd
+
+
+# Check whether GnuPG has already been installed.  This is called as
+# a leave function from the directory page.  A call to abort will get
+# back to the directory selection.
+Function CheckExistingVersion
+  ClearErrors
+  FileOpen $0 "$INSTDIR\VERSION" r
+  IfErrors nexttest
+  FileRead $0 $R0
+  FileRead $0 $R1
+  FileClose $0
+
+  Push $R1
+  Call TrimNewLines
+  Pop $R1
+
+  MessageBox MB_YESNO "$(T_FoundExistingVersion)" IDYES leave
+  Abort
+
+ nexttest:
+  ClearErrors
+  ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GnuPG" "DisplayVersion"
+  IfErrors leave 0
+     MessageBox MB_YESNO "$(T_FoundExistingVersionB)" IDYES leave
+     Abort
+
+ leave:
+FunctionEnd
+
+
+
+# PrintNonAdminWarning
+
+# Check whether the current user is in the Administrator group or an
+# OS version without the need for an Administrator is in use.  Print a
+# diagnostic if this is not the case and abort installation.
+Function PrintNonAdminWarning
+  ClearErrors
+  UserInfo::GetName
+  IfErrors leave
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+  StrCmp $1 "Admin" leave +1
+  MessageBox MB_OK "$(T_AdminNeeded)"
+  Quit
+
+ leave:
+FunctionEnd
+
+
+# Check whether the start menu is actually wanted.
+
+Function CheckIfStartMenuWanted
+  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "${BUILD_DIR}/inst-options.ini" \
+       "Field 2" "State"
+  IntCmp $R0 1 +2
+    Abort
+FunctionEnd
+
+
+# Check whether this is a reinstall and popup a message box to explain
+# that it is better to close other apps before continuing
+Function PrintCloseOtherApps
+    IfFileExists $INSTDIR\bin\gpg.exe print_warning
+    IfFileExists $INSTDIR\bin\gpa.exe print_warning
+    Return
+   print_warning:
+    MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
+
+FunctionEnd
+
+# Called right before the final page to show more warnings.
+#Function ShowFinalWarnings
+#   leave:
+#FunctionEnd
+
+#-----------------------------------------------
+# Strings pertaining to the install options page
+#-----------------------------------------------
+
+# Installation options title
+LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
+LangString T_InstallOptions ${LANG_GERMAN}  "Installationsoptionen"
+
+# Installation options subtitle 1
+LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
+LangString T_InstallOptLinks ${LANG_GERMAN}  "Startlinks"
+
+LangString T_InstOptLabelA  ${LANG_ENGLISH} \
+     "Please select where GnuPG shall install links:"
+LangString T_InstOptLabelA  ${LANG_GERMAN} \
+     "Bitte wählen Sie, welche Verknüpfungen angelegt werden sollen:"
+
+LangString T_InstOptLabelB  ${LANG_ENGLISH} \
+     "(Only programs will be linked into the quick launch bar.)"
+LangString T_InstOptLabelB  ${LANG_GERMAN} \
+     "(In die Schnellstartleiste werden nur Verknüpfungen für \
+      Programme angelegt.) "
+
+LangString T_InstOptFieldA  ${LANG_ENGLISH} \
+     "Start Menu"
+LangString T_InstOptFieldA  ${LANG_GERMAN} \
+     "Startmenü"
+
+LangString T_InstOptFieldB  ${LANG_ENGLISH} \
+     "Desktop"
+LangString T_InstOptFieldB  ${LANG_GERMAN} \
+     "Arbeitsfläche"
+
+LangString T_InstOptFieldC  ${LANG_ENGLISH} \
+     "Quick Launch Bar"
+LangString T_InstOptFieldC  ${LANG_GERMAN} \
+     "Schnellstartleiste"
+
+#------------------------------------------------
+# String pertaining to the existing version check
+#------------------------------------------------
+LangString T_FoundExistingVersion ${LANG_ENGLISH} \
+     "Version $R1 has already been installed.  $\r$\n\
+      Do you want to overwrite it with version ${VERSION}?"
+LangString T_FoundExistingVersion ${LANG_GERMAN} \
+     "Version $R1 ist hier bereits installiert. $\r$\n\
+      Möchten Sie diese mit Version ${VERSION} überschreiben? $\r$\n\
+       $\r$\n\
+      (Sie können in jedem Fall mit JA antworten, falls es sich um \
+       eine neuere oder dieselbe Version handelt.)"
+LangString T_FoundExistingVersionB ${LANG_ENGLISH} \
+     "A version of GnuPG has already been installed on the system. \
+      There will be no problem installing and thus overwriting this \
+      Version. $\r$\n\
+       $\r$\n\
+      Do you want to continue installing GnuPG?"
+LangString T_FoundExistingVersionB ${LANG_GERMAN} \
+     "Eine Version von GnuPG ist hier bereits installiert. \
+      Es ist problemlos möglich, die Installation fortzuführen.  $\r$\n\
+        $\r$\n\
+      Möchten die die Installation von GnuPG fortführen?"
+
+
+
+# From Function PrintNonAdminWarning
+LangString T_AdminNeeded ${LANG_ENGLISH} \
+   "Warning: Administrator permissions required for a successful installation"
+LangString T_AdminNeeded ${LANG_GERMAN} \
+   "Achtung: Für eine erfolgreiche Installation werden \
+    Administratorrechte benötigt."
+
+# From Function PrintCloseOtherApps
+LangString T_CloseOtherApps ${LANG_ENGLISH} \
+   "Please make sure that other applications are not running. \
+    GnuPG will try to install anyway but a reboot may be required."
+LangString T_CloseOtherApps ${LANG_GERMAN} \
+   "Bitte stellen Sie sicher, daß alle anderen Anwendugen geschlossen \
+    sind.  GnuPG wird auf jeden Fall versuchen, eine Installation \
+    durchzuführen; es ist dann aber u.U. notwendig, das System neu zu starten."
+
+
+# TrimNewlines  - taken from the NSIS reference
+# input, top of stack  (e.g. whatever$\r$\n)
+# output, top of stack (replaces, with e.g. whatever)
+# modifies no other variables.
+Function TrimNewlines
+   Exch $R0
+   Push $R1
+   Push $R2
+   StrCpy $R1 0
+
+ loop:
+   IntOp $R1 $R1 - 1
+   StrCpy $R2 $R0 1 $R1
+   StrCmp $R2 "$\r" loop
+   StrCmp $R2 "$\n" loop
+   IntOp $R1 $R1 + 1
+   IntCmp $R1 0 no_trim_needed
+   StrCpy $R0 $R0 $R1
+
+ no_trim_needed:
+   Pop $R2
+   Pop $R1
+   Exch $R0
+FunctionEnd
+
+#
+# Define the installer sections.
+#
+
+Section "-gnupginst"
+  SetOutPath "$INSTDIR"
+
+  File "${BUILD_DIR}/README.txt"
+
+  # Write a version file.
+  FileOpen $0 "$INSTDIR\VERSION" w
+  FileWrite $0 "${PACKAGE}$\r$\n"
+  FileWrite $0 "${VERSION}$\r$\n"
+  FileClose $0
+
+  WriteRegStr HKLM "Software\GNU\GnuPG" "Install Directory" $INSTDIR
+
+  # If we are reinstalling, try to kill a possible running gpa using
+  # an already installed gpa.
+  ifFileExists "$INSTDIR\bin\gpa.exe"  0 no_uiserver
+    ExecWait '"$INSTDIR\bin\gpa" --stop-server'
+
+  no_uiserver:
+
+  # If we are reinstalling, try to kill a possible running agent using
+  # an already installed gpgconf.
+  ifFileExists "$INSTDIR\bin\gpgconf.exe"  0 no_gpgconf
+    ExecWait '"$INSTDIR\bin\gpgconf" --kill gpg-agent'
+
+  no_gpgconf:
+SectionEnd
+
+LangString DESC_Menu_gnupg_readme ${LANG_ENGLISH} \
+   "General information on GnuPG"
+LangString DESC_Menu_gnupg_readme ${LANG_GERMAN} \
+   "Allgemeine Informationen zu GnuPG"
+
+
+Section "GnuPG" SEC_gnupg
+  SectionIn RO
+
+  SetOutPath "$INSTDIR\bin"
+  File /oname=gpg.exe "bin/gpg2.exe"
+  File "bin/gpgsm.exe"
+  File "bin/gpgconf.exe"
+  File "bin/gpg-connect-agent.exe"
+
+  ClearErrors
+  SetOverwrite try
+  File "bin/gpg-agent.exe"
+  SetOverwrite lastused
+  ifErrors 0 +3
+      File /oname=gpg-agent.exe.tmp "bin/gpg-agent.exe"
+      Rename /REBOOTOK gpg-agent.exe.tmp gpg-agent.exe
+
+  SetOutPath "$INSTDIR\share\gnupg"
+  File "share/gnupg/gpg-conf.skel"
+SectionEnd
+
+
+LangString DESC_SEC_gnupg ${LANG_ENGLISH} \
+   "The GnuPG Core is the actual encrypt core and a set of command \
+    line utilities."
+LangString DESC_SEC_gnupg ${LANG_GERMAN} \
+   "Der GnuPG Core ist, wie der Name schon sagt, der Kernbestandteil \
+    dieser Software.  Der GnuPG Core stellt die eigentliche \
+    Verschlüsselung sowie die Verwaltung der Schlüssel bereit."
+
+LangString DESC_Menu_gnupg_manual ${LANG_ENGLISH} \
+   "Show the manual for the GnuPG Core"
+LangString DESC_Menu_gnupg_manual ${LANG_GERMAN} \
+   "Das Handbuch zum GnuPG Kern anzeigen"
+
+Section "-libgpg-error" SEC_libgpg_error
+  SetOutPath "$INSTDIR\bin"
+  File bin/libgpg-error-0.dll
+SectionEnd
+
+Section "-libiconv" SEC_libiconv
+  SetOutPath "$INSTDIR\bin"
+  File bin/libiconv-2.dll
+SectionEnd
+
+Section "-zlib" SEC_zlib
+  SetOutPath "$INSTDIR\bin"
+  File bin/zlib1.dll
+SectionEnd
+
+Section "-npth" SEC_npth
+  SetOutPath "$INSTDIR\bin"
+  File bin/libnpth-0.dll
+SectionEnd
+
+Section "-gcrypt" SEC_gcrypt
+  SetOutPath "$INSTDIR\bin"
+  File bin/libgcrypt-20.dll
+SectionEnd
+
+Section "-assuan" SEC_assuan
+  SetOutPath "$INSTDIR\bin"
+  File bin/libassuan-0.dll
+SectionEnd
+
+Section "-ksba" SEC_ksba
+  SetOutPath "$INSTDIR\bin"
+  File bin/libksba-8.dll
+SectionEnd
+
+Section "-gpgme" SEC_gpgme
+  SetOutPath "$INSTDIR\bin"
+  File bin/libgpgme-11.dll
+  File bin/libgpgme-glib-11.dll
+  File libexec/gpgme-w32spawn.exe
+SectionEnd
+
+Section "-gettext" SEC_gettext
+  SetOutPath "$INSTDIR\bin"
+  File bin/libintl-8.dll
+SectionEnd
+
+Section "-glib" SEC_glib
+  SetOutPath "$INSTDIR\bin"
+  File bin/libgio-2.0-0.dll
+  File bin/libglib-2.0-0.dll
+  File bin/libgmodule-2.0-0.dll
+  File bin/libgobject-2.0-0.dll
+  File bin/libgthread-2.0-0.dll
+  File bin/gspawn-win32-helper.exe
+  File bin/gspawn-win32-helper-console.exe
+
+  File bin/libffi-6.dll
+SectionEnd
+
+Section "-libpng" SEC_libpng
+  SetOutPath "$INSTDIR\bin"
+  File bin/libpng14-14.dll
+SectionEnd
+
+#Section "-jpeg" SEC_jpeg
+#  SetOutPath "$INSTDIR"
+#  File bin/jpeg62.dll
+#SectionEnd
+
+Section "-cairo" SEC_cairo
+  SetOutPath "$INSTDIR\bin"
+  File bin/libcairo-gobject-2.dll
+  File bin/libpangocairo-1.0-0.dll
+  File bin/libcairo-2.dll
+  File bin/libcairo-script-interpreter-2.dll
+SectionEnd
+
+Section "-pixman" SEC_pixman
+  SetOutPath "$INSTDIR\bin"
+  File bin/libpixman-1-0.dll
+SectionEnd
+
+Section "-pango" SEC_pango
+  SetOutPath "$INSTDIR\bin"
+  File bin/pango-querymodules.exe
+  File bin/libpango-1.0-0.dll
+  File bin/libpangowin32-1.0-0.dll
+
+  SetOutPath "$INSTDIR\lib\pango\1.6.0\modules"
+  File lib/pango/1.6.0/modules/pango-basic-win32.dll
+  File lib/pango/1.6.0/modules/pango-arabic-lang.dll
+  File lib/pango/1.6.0/modules/pango-indic-lang.dll
+
+  SetOutPath "$INSTDIR\etc\pango"
+  File ${W32_SRCDIR}/pango.modules
+SectionEnd
+
+Section "-atk" SEC_atk
+  SetOutPath "$INSTDIR\bin"
+  File bin/libatk-1.0-0.dll
+SectionEnd
+
+Section "-gtk+" SEC_gtk_
+  SetOutPath "$INSTDIR\bin"
+  File bin/libgdk_pixbuf-2.0-0.dll
+  File bin/libgdk-win32-2.0-0.dll
+  File bin/libgtk-win32-2.0-0.dll
+
+  SetOutPath "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0"
+  File /oname=loaders.cache ${W32_SRCDIR}/gdk-pixbuf-loaders.cache
+  SetOutPath "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders"
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ani.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-bmp.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-emf.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-gif.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-ico.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-jpeg.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-tiff.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-gdip-wmf.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-icns.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-pcx.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-pnm.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-qtif.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ras.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-tga.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-wbmp.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-xbm.dll
+  File lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-xpm.dll
+
+  SetOutPath "$INSTDIR\lib\gtk-2.0\2.10.0\engines"
+  File lib/gtk-2.0/2.10.0/engines/libwimp.dll
+  File lib/gtk-2.0/2.10.0/engines/libpixmap.dll
+
+  SetOutPath "$INSTDIR\lib\gtk-2.0\2.10.0\immodules"
+  File lib/gtk-2.0/2.10.0/immodules/im-thai.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-cyrillic-translit.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-multipress.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-ti-er.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-am-et.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-cedilla.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-inuktitut.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-viqr.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-ti-et.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-ipa.dll
+  File lib/gtk-2.0/2.10.0/immodules/im-ime.dll
+
+  SetOutPath "$INSTDIR\share\themes\Default\gtk-2.0-key"
+  File share/themes/Default/gtk-2.0-key/gtkrc
+
+  SetOutPath "$INSTDIR\share\themes\MS-Windows\gtk-2.0"
+  File share/themes/MS-Windows/gtk-2.0/gtkrc
+
+  SetOutPath "$INSTDIR\etc\gtk-2.0"
+  File etc/gtk-2.0/im-multipress.conf
+SectionEnd
+
+Section "-pinentry" SEC_pinentry
+  SetOutPath "$INSTDIR\bin"
+  File /oname=pinentry.exe "bin/pinentry-gtk-2.exe"
+SectionEnd
+
+Section "gpa" SEC_gpa
+  SectionIn RO
+  SetOutPath "$INSTDIR\bin"
+  File bin/gpa.exe
+  File bin/launch-gpa.exe
+SectionEnd
+
+LangString DESC_SEC_gpa ${LANG_ENGLISH} \
+   "The GnuPG Assistant is the graphical interface of GnuPG"
+LangString DESC_SEC_gpa ${LANG_GERMAN} \
+   "Der GnuPG Assistent ist die graphische Oberfläche von GnuPG."
+
+LangString DESC_Menu_gpa ${LANG_ENGLISH} \
+   "Run the GnuGP Assistant."
+LangString DESC_Menu_gpa ${LANG_GERMAN} \
+   "Den GnuPG Assistenten starten."
+
+Section "gpgex" SEC_gpgex
+  SetOutPath "$INSTDIR\bin"
+
+  ClearErrors
+  SetOverwrite try
+  File bin/gpgex.dll
+  SetOverwrite lastused
+  ifErrors 0 do_reg
+      File /oname=gpgex.dll.tmp bin/gpgex.dll
+      Rename /REBOOTOK gpgex.dll.tmp gpgex.dll
+
+ do_reg:
+  ClearErrors
+  RegDLL "$INSTDIR\bin\gpgex.dll"
+  ifErrors 0 +2
+     MessageBox MB_OK "$(T_GPGEX_RegFailed)"
+
+${If} ${RunningX64}
+  # Install the 64 bit version of the plugin.
+  # Note that we install this in addition to the 32 bit version so that
+  # the 32 bit version can be used by file dialogs of 32 bit programs.
+  ClearErrors
+  SetOverwrite try
+  File /oname=gpgex6.dll "${INST6_DIR}/bin/gpgex.dll"
+  SetOverwrite lastused
+  ifErrors 0 do_reg64
+      File /oname=gpgex6.dll.tmp "${INST6_DIR}/bin/gpgex.dll"
+      Rename /REBOOTOK gpgex6.dll.tmp gpgex6.dll
+
+ do_reg64:
+  # Register the DLL. We need to register both versions.  However
+  # RegDLL can't be used for 64 bit and InstallLib seems to be a
+  # registry hack.
+  ClearErrors
+  ExecWait '"$SYSDIR\regsvr32" /s "$INSTDIR\bin\gpgex6.dll"'
+  ifErrors 0 +2
+     MessageBox MB_OK "$(T_GPGEX_RegFailed) (64 bit)"
+
+  # Note: There is no need to install the help an mo files because
+  # they are identical to those installed by the 32 bit version.
+${EndIf}
+SectionEnd
+
+LangString T_GPGEX_RegFailed ${LANG_ENGLISH} \
+   "Warning: Registration of the Explorer plugin failed."
+
+LangString DESC_SEC_gpgex ${LANG_ENGLISH} \
+   "GnuPG Explorer Extension"
+
+
+Section "-gnupglast" SEC_gnupglast
+  SetOutPath "$INSTDIR"
+SectionEnd
+
+
+#
+# Define the uninstaller sections.
+#
+# (reverse order of the installer sections!)
+#
+
+Section "-un.gnupglast"
+  ifFileExists "$INSTDIR\bin\gpa.exe"  0 no_uiserver
+    ExecWait '"$INSTDIR\bin\gpa" --stop-server'
+  no_uiserver:
+  ifFileExists "$INSTDIR\bin\gpgconf.exe"  0 no_gpgconf
+    ExecWait '"$INSTDIR\bin\gpgconf" --kill gpg-agent'
+  no_gpgconf:
+SectionEnd
+
+Section "-un.gpgex"
+  UnRegDLL "$INSTDIR\bin\gpgex.dll"
+
+  Delete /REBOOTOK "$INSTDIR\bin\gpgex.dll"
+
+${If} ${RunningX64}
+  ExecWait '"$SYSDIR\regsvr32" /u /s "$INSTDIR\bin\gpgex6.dll"'
+  Delete /REBOOTOK "$INSTDIR\bin\gpgex6.dll"
+${EndIf}
+SectionEnd
+
+
+Section "-un.gpa"
+  Delete "$INSTDIR\bin\gpa.exe"
+  Delete "$INSTDIR\bin\launch-gpa.exe"
+
+  RMDir "$INSTDIR\share\gpa"
+SectionEnd
+
+Section "-un.pinentry"
+  Delete "$INSTDIR\bin\pinentry.exe"
+SectionEnd
+
+
+Section "-un.gtk+"
+  Delete "$INSTDIR\bin\libgdk_pixbuf-2.0-0.dll"
+  Delete "$INSTDIR\bin\libgdk-win32-2.0-0.dll"
+  Delete "$INSTDIR\bin\libgtk-win32-2.0-0.dll"
+
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache"
+
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ani.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-bmp.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-emf.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-gif.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-ico.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-jpeg.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-tiff.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gdip-wmf.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-icns.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-pcx.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-png.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-pnm.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-qtif.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ras.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tga.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-wbmp.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xbm.dll"
+  Delete "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xpm.dll"
+  RMDir  "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0\loaders"
+  RMDir  "$INSTDIR\lib\gdk-pixbuf-2.0\2.10.0"
+  RMDir  "$INSTDIR\lib\gdk-pixbuf-2.0"
+
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\engines\libwimp.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\engines\libpixmap.dll"
+  RMDir  "$INSTDIR\lib\gtk-2.0\2.10.0\engines"
+
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-thai.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-cyrillic-translit.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-multipress.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-ti-er.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-am-et.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-cedilla.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-inuktitut.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-viqr.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-ti-et.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-ipa.dll"
+  Delete "$INSTDIR\lib\gtk-2.0\2.10.0\immodules\im-ime.dll"
+  RMDir  "$INSTDIR\lib\gtk-2.0\2.10.0\immodules"
+
+  RMDir  "$INSTDIR\lib\gtk-2.0\2.10.0"
+  RMDir  "$INSTDIR\lib\gtk-2.0"
+
+  Delete "$INSTDIR\share\themes\Default\gtk-2.0-key\gtkrc"
+  RMDir  "$INSTDIR\share\themes\Default\gtk-2.0-key"
+  RMDir  "$INSTDIR\share\themes\Default"
+
+  Delete "$INSTDIR\share\themes\MS-Windows\gtk-2.0\gtkrc"
+  RMDir  "$INSTDIR\share\themes\MS-Windows\gtk-2.0"
+  RMDir  "$INSTDIR\share\themes\MS-Windows"
+
+  RMDir  "$INSTDIR\share\themes"
+
+  Delete "$INSTDIR\etc\gtk-2.0\im-multipress.conf"
+  RMDir  "$INSTDIR\etc\gtk-2.0"
+SectionEnd
+
+Section "-un.atk"
+  Delete "$INSTDIR\bin\libatk-1.0-0.dll"
+SectionEnd
+
+Section "-un.pango"
+  Delete "$INSTDIR\bin\pango-querymodules.exe"
+  Delete "$INSTDIR\bin\libpango-1.0-0.dll"
+  Delete "$INSTDIR\bin\libpangowin32-1.0-0.dll"
+
+  Delete "$INSTDIR\lib\pango\1.6.0\modules\pango-basic-win32.dll"
+  Delete "$INSTDIR\lib\pango\1.6.0\modules\pango-arabic-lang.dll"
+  Delete "$INSTDIR\lib\pango\1.6.0\modules\pango-indic-lang.dll"
+  RMDir  "$INSTDIR\lib\pango\1.6.0\modules"
+  RMDir  "$INSTDIR\lib\pango\1.6.0"
+  RMDir  "$INSTDIR\lib\pango"
+
+  Delete "$INSTDIR\etc\pango\pango.modules"
+  RMDir  "$INSTDIR\etc\pango"
+SectionEnd
+
+Section "-un.pixman"
+  Delete "$INSTDIR\bin\libpixman-1-0.dll"
+SectionEnd
+
+Section "-un.cairo"
+  Delete "$INSTDIR\bin\libcairo-gobject-2.dll"
+  Delete "$INSTDIR\bin\libpangocairo-1.0-0.dll"
+  Delete "$INSTDIR\bin\libcairo-2.dll"
+  Delete "$INSTDIR\bin\libcairo-script-interpreter-2.dll"
+SectionEnd
+
+Section "-un.libpng"
+  Delete "$INSTDIR\bin\libpng14-14.dll"
+SectionEnd
+
+Section "-un.glib"
+  Delete "$INSTDIR\bin\libgio-2.0-0.dll"
+  Delete "$INSTDIR\bin\libglib-2.0-0.dll"
+  Delete "$INSTDIR\bin\libgmodule-2.0-0.dll"
+  Delete "$INSTDIR\bin\libgobject-2.0-0.dll"
+  Delete "$INSTDIR\bin\libgthread-2.0-0.dll"
+  Delete "$INSTDIR\bin\gspawn-win32-helper.exe"
+  Delete "$INSTDIR\bin\gspawn-win32-helper-console.exe"
+  Delete "$INSTDIR\bin\libffi-6.dll"
+SectionEnd
+
+Section "-un.gettext"
+  Delete "$INSTDIR\bin\libintl-8.dll"
+SectionEnd
+
+Section "-un.gpgme"
+  Delete "$INSTDIR\bin\libgpgme-11.dll"
+  Delete "$INSTDIR\bin\libgpgme-glib-11.dll"
+  Delete "$INSTDIR\bin\gpgme-w32spawn.exe"
+SectionEnd
+
+Section "-un.ksba"
+  Delete "$INSTDIR\bin\libksba-8.dll"
+SectionEnd
+
+Section "-un.assuan"
+  Delete "$INSTDIR\bin\libassuan-0.dll"
+SectionEnd
+
+Section "-un.gcrypt"
+  Delete "$INSTDIR\bin\libgcrypt-20.dll"
+SectionEnd
+
+Section "-un.npth"
+  Delete "$INSTDIR\bin\libnpth-0.dll"
+SectionEnd
+
+Section "-un.zlib"
+  Delete "$INSTDIR\bin\zlib1.dll"
+SectionEnd
+
+Section "-un.libiconv"
+  Delete "$INSTDIR\bin\libiconv-2.dll"
+SectionEnd
+
+Section "-un.libgpg-error"
+  Delete "$INSTDIR\bin\libgpg-error-0.dll"
+SectionEnd
+
+Section "-un.gnupg"
+  Delete "$INSTDIR\bin\gpg.exe"
+  Delete "$INSTDIR\bin\gpgsm.exe"
+  Delete "$INSTDIR\bin\gpg-agent.exe"
+  Delete "$INSTDIR\bin\gpgconf.exe"
+  Delete "$INSTDIR\bin\gpg-connect-agent.exe"
+
+  Delete "$INSTDIR\share\gnupg\gpg-conf.skel"
+  RMDir  "$INSTDIR\share\gnupg"
+SectionEnd
+
+Section "-un.gnupginst"
+  # Delete standard stuff.
+  Delete "$INSTDIR\README.txt"
+
+  Delete "$INSTDIR\VERSION"
+
+  # Try to remove the top level directories.
+  RMDir "$INSTDIR\bin"
+  RMDir "$INSTDIR\lib"
+  RMDir "$INSTDIR\share"
+  RMDir "$INSTDIR\etc"
+  RMDir "$INSTDIR"
+
+  # Clean the registry.
+  DeleteRegValue HKLM "Software\GNU\GnuPG" "Install Directory"
+SectionEnd
+
+
+Function .onInit
+  ;;!define MUI_LANGDLL_ALWAYSSHOW
+  !insertmacro MUI_LANGDLL_DISPLAY
+
+  Call G4wRunOnce
+
+  SetOutPath $TEMP
+#!ifdef SOURCES
+#  File /oname=gpgspltmp.bmp "${TOP_SRCDIR}/doc/logo/gnupg-logo-400px.bmp"
+#  # We play the tune only for the soruce installer
+#  File /oname=gpgspltmp.wav "${TOP_SRCDIR}/src/gnupg-splash.wav"
+#  g4wihelp::playsound $TEMP\gpgspltmp.wav
+#  g4wihelp::showsplash 2500 $TEMP\gpgspltmp.bmp
+
+#  Delete $TEMP\gpgspltmp.bmp
+#  # Note that we delete gpgspltmp.wav in .onInst{Failed,Success}
+#!endif
+
+  # We can't use TOP_SRCDIR dir as the name of the file needs to be
+  # the same while building and running the installer.  Thus we
+  # generate the file from a template.
+  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "${BUILD_DIR}/inst-options.ini"
+
+  #Call CalcDepends
+FunctionEnd
+
+
+#Function .onInstFailed
+#  Delete $TEMP\gpgspltmp.wav
+#FunctionEnd
+
+#Function .onInstSuccess
+#  Delete $TEMP\gpgspltmp.wav
+#FunctionEnd
+
+#Function .onSelChange
+#  Call CalcDepends
+#FunctionEnd
+
+
+# This must be in a central place.  Urgs.
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+!insertmacro MUI_DESCRIPTION_TEXT ${SEC_gnupg} $(DESC_SEC_gnupg)
+!insertmacro MUI_DESCRIPTION_TEXT ${SEC_gpa}   $(DESC_SEC_gpa)
+!insertmacro MUI_DESCRIPTION_TEXT ${SEC_gpgex} $(DESC_SEC_gpgex)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+# This also must be in a central place.  Also Urgs.
+
+Section "-startmenu"
+
+!ifdef HAVE_STARTMENU
+  # Make sure that the context of the automatic variables has been set to
+  # the "all users" shell folder.  This guarantees that the menu gets written
+  # for all users.  We have already checked that we are running as Admin; or
+  # we printed a warning that installation will not succeed.
+  SetShellVarContext all
+
+  # Check if the start menu entries where requested.
+  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "${BUILD_DIR}/inst-options.ini" \
+       "Field 2" "State"
+  IntCmp $R0 0 no_start_menu
+
+!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+    CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
+
+    SectionGetFlags ${SEC_gpa} $R0
+    IntOp $R0 $R0 & ${SF_SELECTED}
+    IntCmp $R0 ${SF_SELECTED} 0 no_gpa_menu
+    CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GPA.lnk" \
+       "$INSTDIR\bin\launch-gpa.exe" \
+        "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_gpa)
+  no_gpa_menu:
+
+
+    CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG Manual.lnk" \
+                   "$INSTDIR\share\gnupg\gnupg.html" \
+                   "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_gnupg_manual)
+
+    CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG README.lnk" \
+                   "$INSTDIR\README.txt" \
+                   "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_gnupg_readme)
+
+!insertmacro MUI_STARTMENU_WRITE_END
+
+
+
+no_start_menu:
+
+
+  # Check if the desktop entries where requested.
+  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "${BUILD_DIR}/inst-options.ini" \
+       "Field 3" "State"
+  IntCmp $R0 0 no_desktop
+
+    SectionGetFlags ${SEC_gpa} $R0
+    IntOp $R0 $R0 & ${SF_SELECTED}
+    IntCmp $R0 ${SF_SELECTED} 0 no_gpa_desktop
+    CreateShortCut "$DESKTOP\GPA.lnk" \
+       "$INSTDIR\bin\launch-gpa.exe" \
+        "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_gpa)
+  no_gpa_desktop:
+
+
+    CreateShortCut "$DESKTOP\GPA Manual.lnk" \
+                   "$INSTDIR\share\gpa\gpa.html" \
+                   "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_gpa_manual)
+
+no_desktop:
+
+
+  # Check if the quick launch bar entries where requested.
+  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "${BUILD_DIR}/inst-options.ini" \
+       "Field 4" "State"
+  IntCmp $R0 0 no_quick_launch
+  StrCmp $QUICKLAUNCH $TEMP no_quick_launch
+
+    SectionGetFlags ${SEC_gpa} $R0
+    IntOp $R0 $R0 & ${SF_SELECTED}
+    IntCmp $R0 ${SF_SELECTED} 0 no_gpa_quicklaunch
+    CreateShortCut "$QUICKLAUNCH\GPA.lnk" \
+       "$INSTDIR\bin\launch-gpa.exe" \
+        "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_gpa)
+no_gpa_quicklaunch:
+
+
+no_quick_launch:
+
+
+!endif
+SectionEnd
+
+
+
+#
+# Now for the generic parts to end the installation.
+#
+Var MYTMP
+
+# Last section is a hidden one.
+Section
+  WriteUninstaller "$INSTDIR\gnupg-uninstall.exe"
+
+  # Windows Add/Remove Programs support
+  StrCpy $MYTMP "Software\Microsoft\Windows\CurrentVersion\Uninstall\GnuPG"
+  WriteRegExpandStr HKLM $MYTMP "UninstallString" '"$INSTDIR\gnupg-uninstall.exe"'
+  WriteRegExpandStr HKLM $MYTMP "InstallLocation" "$INSTDIR"
+  WriteRegStr       HKLM $MYTMP "DisplayName"     "${PRETTY_PACKAGE}"
+  WriteRegStr       HKLM $MYTMP "DisplayIcon"     "$INSTDIR\bin\gpa.exe,0"
+  WriteRegStr       HKLM $MYTMP "DisplayVersion"  "${VERSION}"
+  WriteRegStr       HKLM $MYTMP "Publisher"       "The GnuPG Project"
+  WriteRegStr       HKLM $MYTMP "URLInfoAbout"    "https://gnupg.org"
+  WriteRegDWORD     HKLM $MYTMP "NoModify"        "1"
+  WriteRegDWORD     HKLM $MYTMP "NoRepair"        "1"
+SectionEnd
+
+
+Section Uninstall
+
+!ifdef HAVE_STARTMENU
+  # Make sure that the context of the automatic variables has been set to
+  # the "all users" shell folder.  This guarantees that the menu gets written
+  # for all users.  We have already checked that we are running as Admin; or
+  # we printed a warning that installation will not succeed.
+  SetShellVarContext all
+
+  #---------------------------------------------------
+  # Delete the menu entries and any empty parent menus
+  #---------------------------------------------------
+  !insertmacro MUI_STARTMENU_GETFOLDER Application $MYTMP
+  Delete "$SMPROGRAMS\$MYTMP\GPA.lnk"
+  Delete "$SMPROGRAMS\$MYTMP\GnuPG Manual.lnk"
+  Delete "$SMPROGRAMS\$MYTMP\GnuPG README.lnk"
+  Delete "$SMPROGRAMS\$MYTMP\*.lnk"
+  StrCpy $MYTMP "$SMPROGRAMS\$MYTMP"
+  startMenuDeleteLoop:
+    ClearErrors
+    RMDir $MYTMP
+    GetFullPathName $MYTMP "$MYTMP\.."
+    IfErrors startMenuDeleteLoopDone
+    StrCmp $MYTMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
+  startMenuDeleteLoopDone:
+
+  DeleteRegValue HKLM "Software\GNU\GnuPG" "Start Menu Folder"
+
+  # Delete Desktop links.
+  Delete "$DESKTOP\GPA.lnk"
+  Delete "$DESKTOP\GnuPG Manual.lnk"
+  Delete "$DESKTOP\GnuPG README.lnk"
+
+  # Delete Quick Launch Bar links.
+  StrCmp $QUICKLAUNCH $TEMP no_quick_launch_uninstall
+  Delete "$QUICKLAUNCH\GPA.lnk"
+no_quick_launch_uninstall:
+
+!endif
+
+
+  Delete "$INSTDIR\gnupg-uninstall.exe"
+  RMDir "$INSTDIR"
+
+  # Clean the registry.
+  DeleteRegValue HKLM "Software\GNU\GnuPG" "Install Directory"
+  DeleteRegKey /ifempty HKLM "Software\GNU\GnuPG"
+  # Remove Windows Add/Remove Programs support.
+  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GnuPG"
+SectionEnd
diff --git a/build-aux/speedo/w32/pango.modules b/build-aux/speedo/w32/pango.modules
new file mode 100755 (executable)
index 0000000..75b2527
--- /dev/null
@@ -0,0 +1,3 @@
+# Pango Modules file
+#
+"../lib/pango/1.6.0/modules/pango-basic-win32.dll" BasicScriptEngineWin32 PangoEngineShape PangoRenderWin32 common:
diff --git a/build-aux/speedo/w32/pkg-copyright.txt b/build-aux/speedo/w32/pkg-copyright.txt
new file mode 100644 (file)
index 0000000..69bb08b
--- /dev/null
@@ -0,0 +1,165 @@
+Here is a list with collected copyright notices. For details see the
+description of each individual package.  [Compiled by wk FIXME]
+
+GnuPG is
+
+  Copyright (C) 1997-1998, 2013-2014 Werner Koch
+  Copyright (C) 1998-2013 Free Software Foundation, Inc.
+  Copyright (C) 2003-2013 g10 Code GmbH
+  Copyright (C) 2002 Klarälvdalens Datakonsult AB
+  Copyright (C) 1995-1997, 2000-2007 Ulrich Drepper <drepper@gnu.ai.mit.edu>
+  Copyright (C) 1994 X Consortium
+  Copyright (C) 1998 by The Internet Society.
+  Copyright (C) 1998-2004 The OpenLDAP Foundation
+  Copyright (C) 1998-2004 Kurt D. Zeilenga.
+  Copyright (C) 1998-2004 Net Boolean Incorporated.
+  Copyright (C) 2001-2004 IBM Corporation.
+  Copyright (C) 1999-2003 Howard Y.H. Chu.
+  Copyright (C) 1999-2003 Symas Corporation.
+  Copyright (C) 1998-2003 Hallvard B. Furuseth.
+  Copyright (C) 1992-1996 Regents of the University of Michigan.
+
+  GnuPG 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; either version 3 of the License, or
+  (at your option) any later version.
+
+  GnuPG is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+  License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+  02110-1301, USA
+
+
+GPA is
+
+  Copyright (C) 2000-2002 G-N-U GmbH (http://www.g-n-u.de)
+  Copyright (C) 2002-2003 Miguel Coca.
+  Copyright (C) 2005, 2006, 2008, 2012, 2014 g10 Code GmbH.
+  Copyright (C) 1998-2000 Free Software Foundation, Inc.
+  Copyright (C) 2000-2001 Werner Koch
+  Copyright (C) 2000-2002 Timo Schulz
+
+  GPA 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; either version 3 of the License, or
+  (at your option) any later version.
+
+  GPA is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+  License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+
+GPGME is
+
+  Copyright (C) 2000 Werner Koch (dd9jn)
+  Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 g10 Code GmbH
+
+  GPGME is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2.1 of
+  the License, or (at your option) any later version.
+
+  GPGME is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+LIBGPG-ERROR is
+
+  Copyright (C) 2003, 2004 g10 Code GmbH
+
+  libgpg-error is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public License
+  as published by the Free Software Foundation; either version 2.1 of
+  the License, or (at your option) any later version.
+
+  libgpg-error is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+
+GLIB is
+
+  Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the
+  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+  Boston, MA 02111-1307, USA.
+
+  Modified by the GLib Team and others 1997-2000.  See the AUTHORS
+  file for a list of people on the GLib Team.  See the ChangeLog
+  files for a list of changes.  These files are distributed with
+  GLib at ftp://ftp.gtk.org/pub/gtk/.
+
+
+Pthreads-win32 is
+
+  Copyright(C) 1998 John E. Bossom
+  Copyright(C) 1999,2002 Pthreads-win32 contributors
+
+  Most of this is work available under the GNU Lesser General Public
+  License as published by the Free Software Foundation version 2.1 of
+  the License.  The detailed terms are given in the file COPYING in
+  the source distribution; that very file may not be modified and thus
+  it is not possible to include it here.
+
+
+NSIS is
+
+  Copyright (C) 1999-2005 Nullsoft, Inc.
+
+  This license applies to everything in the NSIS package, except where
+  otherwise noted.
+
+  This software is provided 'as-is', without any express or implied
+  warranty. In no event will the authors be held liable for any
+  damages arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any
+  purpose, including commercial applications, and to alter it and
+  redistribute it freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must
+     not claim that you wrote the original software. If you use this
+     software in a product, an acknowledgment in the product
+     documentation would be appreciated but is not required.
+
+  2. Altered source versions must be plainly marked as such, and must
+     not be misrepresented as being the original software.
+
+  3. This notice may not be removed or altered from any source
+     distribution.
+
+  The user interface used with the installer is
+
+  Copyright (C) 2002-2005 Joost Verburg
+
+  [It is distributed along with NSIS and the same conditions as stated
+   above apply]
diff --git a/build-aux/speedo/zlib.pc b/build-aux/speedo/zlib.pc
new file mode 100644 (file)
index 0000000..b758050
--- /dev/null
@@ -0,0 +1,10 @@
+prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: zlib
+Description:  zlib compression library
+Version: 1.2.5
+Libs: -L${libdir} -lz
+Cflags: -I${includedir}