Improve the speedo make script.
authorWerner Koch <wk@gnupg.org>
Thu, 9 Jan 2014 18:14:09 +0000 (19:14 +0100)
committerWerner Koch <wk@gnupg.org>
Thu, 9 Jan 2014 19:10:36 +0000 (20:10 +0100)
* scripts/gpg-w32-dev/README: Remove
* scripts/gpg-w32-dev/GNUmakefile, scripts/gpg-w32-dev/speedo.mk:
Merge into ..
* scripts/speedo.mk: this.
--

Speedo may now be used to build from GIT or tarballs and has a couple
of other improvements as well.  For best results the autogen.sh files
of all source package should be updated to the one used in gnupg.

Signed-off-by: Werner Koch <wk@gnupg.org>
Makefile.am
scripts/gpg-w32-dev/GNUmakefile [deleted file]
scripts/gpg-w32-dev/README [deleted file]
scripts/gpg-w32-dev/speedo.mk [deleted file]
scripts/speedo.mk [new file with mode: 0644]

index c9a7b50..08b5d32 100644 (file)
@@ -26,7 +26,8 @@ GITLOG_TO_CHANGELOG=gitlog-to-changelog
 EXTRA_DIST = scripts/config.rpath scripts/potomo autogen.sh README.GIT \
             ChangeLog-2011 po/ChangeLog-2011 scripts/ChangeLog-2011 \
             scripts/gitlog-to-changelog \
-            scripts/git-log-fix scripts/git-log-footer
+            scripts/git-log-fix scripts/git-log-footer \
+            scripts/speedo.mk
 DISTCLEANFILES = g10defs.h
 
 if BUILD_GPGSM
diff --git a/scripts/gpg-w32-dev/GNUmakefile b/scripts/gpg-w32-dev/GNUmakefile
deleted file mode 100644 (file)
index 10ba92f..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-# Makefile - Makefile for speedo
-# Copyright (C) 2008 g10 Code GmbH
-# 
-# This file is part of speedo.
-# 
-# speedo 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.
-# 
-# speedo 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/>.
-
-# speedo builds gnupg-related packages from SVN and installs them in a
-# user directory, thereby providing a non-obstrusive test environment.
-# The build system is similar to that of gpg4win.  The following commands
-# are supported:
-#
-# make all  or  make
-#
-# Builds all packages and installs them under playground/install.
-# At the end, speedo prints commands that can be executed in the local shell
-# to make use of the installed packages.
-#
-# make clean  or  make clean-PACKAGE
-#
-# Removes all packages or the package PACKAGE from the installation
-# and build tree.  A subsequent make will rebuild these (and only
-# these) packages.
-#
-# make report  or make report-PACKAGE
-#
-# Lists packages and versions.
-#
-# make dist
-# 
-# Create a development ZIP archive.
-
-
-# --------
-
-# The packages that should be built.  The order is also the build order.
-speedo_spkgs = libgpg-error libgcrypt libassuan libksba gpgme
-
-# For each package, the following variables can be defined:
-#
-# speedo_pkg_PACKAGE_svn: The SVN repository that should be built.
-# Branches or specific revisions can also be specified.
-#
-# speedo_pkg_PACKAGE_tar: URL to the tar file that should be built.
-# 
-# Exactly one of the above variables is required.  Note that this
-# version of speedo does not cache repositories or tar files, and does
-# not test the integrity of the downloaded software.  If you care
-# about this, you can also specify filenames to locally verified files.
-# Filenames are differentiated from URLs by starting with a slash '/'.
-#
-# speedo_pkg_PACKAGE_configure: Extra arguments to configure.
-#
-# speedo_pkg_PACKAGE_make_args: Extra arguments to make.
-#
-# speedo_pkg_PACKAGE_make_args_inst: Extra arguments to make install.
-#
-# Note that you can override the defaults in this file in a local file
-# "config.mk"
-
-# Set this to "svn" or "release".
-WHAT=release
-
-ifeq ($(WHAT),svn)
-  svnrep = svn://cvs.gnupg.org/
-  speedo_pkg_libgpg_error_svn = $(svnrep)/libgpg-error/trunk
-  speedo_pkg_libassuan_svn = $(svnrep)/libassuan/trunk
-  speedo_pkg_libgcrypt_svn = $(svnrep)/libgcrypt/trunk
-  speedo_pkg_libksba_svn = $(svnrep)/libksba/trunk
-  speedo_pkg_gpgme_svn = $(svnrep)/gpgme/trunk
-else
-  pkgrep = ftp://ftp.gnupg.org/gcrypt
-  speedo_pkg_libgpg_error_tar = $(pkgrep)/libgpg-error/libgpg-error-1.8.tar.bz2
-  speedo_pkg_libassuan_tar = $(pkgrep)/libassuan/libassuan-2.0.0.tar.bz2
-  speedo_pkg_libgcrypt_tar = $(pkgrep)/libgcrypt/libgcrypt-1.4.6.tar.bz2
-  speedo_pkg_libksba_tar = $(pkgrep)/libksba/libksba-1.0.7.tar.bz2
-  speedo_pkg_gpgme_tar = $(pkgrep)/gpgme/gpgme-1.3.0.tar.bz2
-endif
-
-speedo_pkg_gnupg_configure = --with-pinentry-pgm=$(idir)/bin/pinentry \
-  --with-dirmngr-pgm=$(idir)/bin/dirmngr
-
-speedo_pkg_dirmngr_configure = --localstatedir=/var --sysconfdir=/etc \
-  --with-libgcrypt-prefix=$(idir) --with-gpg-error-prefix=$(idir) \
-  --with-libassuan-prefix=$(idir) --with-libksba-prefix=$(idir)
-
-speedo_pkg_gpgme_configure = --with-gpg=$(idir)/bin/gpg2       \
-       --with-gpgsm=$(idir)/bin/gpgsm                          \
-       --with-gpgconf=$(idir)/bin/gpgconf
-
-speedo_pkg_pinentry_configure = --disable-pinentry-qt4
-
-speedo_pkg_libgcrypt_configure = --disable-static
-
-speedo_pkg_libksba_configure = --disable-static
-
-
-# ---------
-
-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
-
-
-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/ ; \
-       i586-mingw32msvc-strip $${pkgname}/bin/*.dll ; \
-       zip -r9 $${pkgname}.zip $${pkgname} >/dev/null ; \
-       rm -rf $$pkgname; \
-       echo "$$pkgname.zip ready for distribution" >&2
-
-
-speedo_build_list = $(speedo_spkgs)
-
--include config.mk
-include speedo.mk
diff --git a/scripts/gpg-w32-dev/README b/scripts/gpg-w32-dev/README
deleted file mode 100644 (file)
index ac2ffeb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-These makefiles are used to build a simple development package of
-GnuPG related libraries for Windoze.  The ZIP archive includes only
-the binaries, import libraries and header files.  On a file server you
-should keep the original source tarballs close to the archive file and
-explain where to find the sources.  GNU make is required.
-
diff --git a/scripts/gpg-w32-dev/speedo.mk b/scripts/gpg-w32-dev/speedo.mk
deleted file mode 100644 (file)
index 4e0e63a..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-# speedo.mk - Speedo rebuilds speedily.
-# Copyright (C) 2008 g10 Code GmbH
-# 
-# This file is part of speedo.
-# 
-# speedo 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.
-# 
-# speedo 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/>.
-
-MKDIR=mkdir
-STOW=stow
-
-# These paths must be absolute, as we switch directories pretty often.
-root := $(shell pwd)/playground
-bdir := $(root)/build
-idir := $(root)/install
-ipdir := $(root)/install/pkgs
-
-# The playground area is our scratch area, where we unpack, build and
-# install the packages.
-stamps/stamp-directories:
-       $(MKDIR) stamps
-       $(MKDIR) playground
-       $(MKDIR) $(bdir)
-       $(MKDIR) $(idir)
-       #$(MKDIR) $(ipdir)
-       touch stamps/stamp-directories
-
-# Frob the name $1 by converting all '-' and '+' characters to '_'.
-define FROB_macro
-$(subst +,_,$(subst -,_,$(1)))
-endef
-
-# Get the variable $(1) (which may contain '-' and '+' characters).
-define GETVAR
-$($(call FROB_macro,$(1)))
-endef
-
-# Set a couple of common variables.
-define SETVARS
-       pkg="$(1)";                                                     \
-       svn="$(call GETVAR,speedo_pkg_$(1)_svn)";                       \
-       tar="$(call GETVAR,speedo_pkg_$(1)_tar)";                       \
-       pkgsdir="$(bdir)/$(1)";                                         \
-       pkgbdir="$(bdir)/$(1)-build";                                   \
-       pkgidir="$(ipdir)/$(1)";                                        \
-       pkgcfg="$(call GETVAR,speedo_pkg_$(1)_configure)";              \
-       pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)";           \
-       pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
-       export PATH="$(idir)/bin:$${PATH}";                             \
-       export LD_LIBRARY_PATH="$(idir)/lib:$${LD_LIBRARY_PATH}"
-endef
-
-
-# Template for source packages.
-
-define SPKG_template
-
-stamps/stamp-$(1)-00-unpack: stamps/stamp-directories 
-       (cd $(bdir);                                    \
-        $(call SETVARS,$(1));                          \
-        if [ -n "$$$${svn}" ]; then                    \
-           svn checkout "$$$${svn}" "$$$${pkg}";       \
-          cd "$$$${pkg}";                              \
-          ./autogen.sh;                                \
-         elif [ -n "$$$${tar}" ]; then                 \
-           case "$$$${tar}" in                         \
-             (*.gz) opt=z ;;                           \
-             (*.bz2) opt=j ;;                          \
-             (*) opt= ;;                               \
-           esac;                                       \
-           case "$$$${tar}" in                         \
-            (/*) cmd=cat ;;                            \
-            (*) cmd="wget -q -O -" ;;                  \
-          esac;                                        \
-          $$$${cmd} "$$$${tar}" | tar x$$$${opt}f - ;  \
-          base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
-                 | sed -e 's,\.tar.*$$$$,,'`;          \
-          mv $$$${base} $(1);                          \
-         fi)
-       touch stamps/stamp-$(1)-00-unpack
-
-stamps/stamp-$(1)-01-configure: stamps/stamp-$(1)-00-unpack
-       ($(call SETVARS,$(1));                          \
-        mkdir "$$$${pkgbdir}";                         \
-        cd "$$$${pkgbdir}";                            \
-        eval "../$$$${pkg}/configure"                  \
-               --enable-maintainer-mode                \
-               --prefix="$(idir)"              \
-               --host=i586-mingw32msvc         \
-               $$$${pkgcfg})
-       touch stamps/stamp-$(1)-01-configure
-
-stamps/stamp-$(1)-02-make: stamps/stamp-$(1)-01-configure
-       ($(call SETVARS,$(1));                          \
-         cd "$$$${pkgbdir}";                           \
-         $(MAKE) $$$${pkgmkargs})
-       touch stamps/stamp-$(1)-02-make
-
-# Note that post_install must come last because it may be empty and
-# "; ;" is a syntax error.
-stamps/stamp-$(1)-03-install: stamps/stamp-$(1)-02-make
-       ($(call SETVARS,$(1));                          \
-         cd "$$$${pkgbdir}";                           \
-         $(MAKE) $$$${pkgmkargs_inst} install-strip ; \
-         $(call gpg4win_pkg_$(call FROB_macro,$(1))_post_install))
-       touch stamps/stamp-$(1)-03-install
-
-stamps/stamp-final-$(1): stamps/stamp-$(1)-03-install
-       touch stamps/stamp-final-$(1)
-
-.PHONY : clean-$(1)
-clean-$(1):
-       ($(call SETVARS,$(1));                          \
-        (cd $(ipdir) &&                                \
-         ($(STOW) -D "$$$${pkg}";                      \
-          rm -fR "$$$${pkg}"));                        \
-        rm -fR "$$$${pkgsdir}" "$$$${pkgbdir}")
-       rm -f stamps/stamp-final-$(1) stamps/stamp-$(1)-*
-
-.PHONY : report-$(1)
-report-$(1):
-       @($(call SETVARS,$(1));                         \
-        echo -n $(1):\  ;                              \
-        if [ -n "$$$${svn}" ]; then                    \
-           if [ -e .svn ]; then                                \
-            cd $(bdir)/$(1) &&                         \
-             svn info | grep Repository ;              \
-          else                                         \
-             echo missing;                             \
-          fi                                           \
-         elif [ -n "$$$${tar}" ]; then                 \
-          base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
-                 | sed -e 's,\.tar.*$$$$,,'`;          \
-          echo $$$${base} ;                            \
-         fi)
-
-endef
-
-
-# Insert the template for each source package.
-$(foreach spkg, $(speedo_spkgs), $(eval $(call SPKG_template,$(spkg))))
-
-stamps/stamp-final: stamps/stamp-directories
-stamps/stamp-final: $(addprefix stamps/stamp-final-,$(speedo_build_list))
-       touch stamps/stamp-final
-
-all-speedo: stamps/stamp-final
-
-report-speedo: $(addprefix report-,$(speedo_build_list))
-
-# Just to check if we catched all stamps.
-clean-stamps:
-       $(RM) -fR $(stamps)
-
-clean-speedo:
-       $(RM) -fR playground stamps
-
-.PHONY : all-speedo report-speedo clean-stamps clean-speedo
diff --git a/scripts/speedo.mk b/scripts/speedo.mk
new file mode 100644 (file)
index 0000000..4148002
--- /dev/null
@@ -0,0 +1,364 @@
+# speedo.mk - Speedo rebuilds speedily.
+# Copyright (C) 2008, 2014 g10 Code GmbH
+#
+# speedo 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.
+#
+# speedo 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/>.
+
+# speedo builds gnupg-related packages from GIT and installs them in a
+# user directory, thereby providing a non-obstrusive test environment.
+# 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
+# or
+#   make -f speedo.mk
+#
+# Builds all packages and installs them under play/inst.  At the end,
+# speedo prints commands that can be executed in the local shell to
+# make use of the installed packages.
+#
+#   make -f speedo.mk clean
+# or
+#   make -f speedo.mk clean-PACKAGE
+#
+# Removes all packages or the package PACKAGE from the installation
+# and build tree.  A subsequent make will rebuild these (and only
+# these) packages.
+#
+#   make -f speedo.mk report
+# or
+#   make -f speedo.mk report-PACKAGE
+#
+# Lists packages and versions.
+#
+
+
+
+# --------
+
+# The packages that should be built.  The order is also the build order.
+speedo_spkgs = libgpg-error npth libgcrypt libassuan libksba gnupg gpgme gpa
+
+# version numbers of the released packages
+# Fixme: Take the version numbers from gnupg-doc/web/swdb.mac
+libgpg_error_ver = 1.12
+npth_ver = 0.91
+libgcrypt_ver = 1.6.0
+libassuan_ver = 2.1.1
+libksba_ver = 1.3.0
+gnupg_ver = 2.0.22
+gpgme_ver = 1.5.0
+gpa_ver = 0.9.5
+
+# The GIT repository.  Using a local repo is much faster.
+#gitrep = git://git.gnupg.org
+gitrep = ${HOME}/s
+
+
+# For each package, the following variables can be defined:
+#
+# speedo_pkg_PACKAGE_git: The GIT repository that should be built.
+# speedo_pkg_PACKAGE_gitref: The GIT revision to checkout
+#
+# speedo_pkg_PACKAGE_tar: URL to the tar file that should be built.
+#
+# Exactly one of the above variables is required.  Note that this
+# version of speedo does not cache repositories or tar files, and does
+# not test the integrity of the downloaded software.  If you care
+# about this, you can also specify filenames to locally verified files.
+# Filenames are differentiated from URLs by starting with a slash '/'.
+#
+# speedo_pkg_PACKAGE_configure: Extra arguments to configure.
+#
+# speedo_pkg_PACKAGE_make_args: Extra arguments to make.
+#
+# speedo_pkg_PACKAGE_make_args_inst: Extra arguments to make install.
+#
+# Note that you can override the defaults in this file in a local file
+# "config.mk"
+
+# Set this to "git" or "release".
+WHAT=release
+
+# Set target to "native" or "w32"
+TARGETOS=native
+
+#  Number of parallel make jobs
+MAKE_J=3
+
+ifeq ($(WHAT),git)
+  speedo_pkg_libgpg_error_git = $(gitrep)/libgpg-error
+  speedo_pkg_libgpg_error_gitref = master
+  speedo_pkg_npth_git = $(gitrep)/npth
+  speedo_pkg_npth_gitref = master
+  speedo_pkg_libassuan_git = $(gitrep)/libassuan
+  speedo_pkg_libassuan_gitref = master
+  speedo_pkg_libgcrypt_git = $(gitrep)/libgcrypt
+  speedo_pkg_libgcrypt_gitref = master
+  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_gpa_git = $(gitrep)/gpa
+  speedo_pkg_gpa_gitref = master
+else
+  pkgrep = ftp://ftp.gnupg.org/gcrypt
+  speedo_pkg_libgpg_error_tar = \
+       $(pkgrep)/libgpg-error/libgpg-error-$(libgpg_error_ver).tar.bz2
+  speedo_pkg_npth_tar = \
+       $(pkgrep)/npth/npth-$(npth_ver).tar.bz2
+  speedo_pkg_libassuan_tar = \
+       $(pkgrep)/libassuan/libassuan-$(libassuan_ver).tar.bz2
+  speedo_pkg_libgcrypt_tar = \
+       $(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_gpa_tar = \
+       $(pkgrep)/gpa/gpa-$(gpa_ver).tar.bz2
+endif
+
+speedo_pkg_pinentry_configure = --disable-pinentry-qt4
+
+speedo_pkg_libgcrypt_configure = --disable-static
+
+speedo_pkg_libksba_configure = --disable-static
+
+
+# ---------
+
+all: all-speedo
+       @echo export PATH=\"$(idir)/bin\":\$$PATH
+       @echo export LD_LIBRARY_PATH=\"$(idir)/lib\":\$$LD_LIBRARY_PATH
+       @echo hash -r
+
+report: report-speedo
+
+clean: clean-speedo
+
+
+# Fixme: The dist target does not work anymore.
+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
+
+
+-include config.mk
+
+#
+#  The generic speedo code
+#
+
+MKDIR=mkdir
+
+
+# These paths must be absolute, as we switch directories pretty often.
+root := $(shell pwd)/play
+stampdir := $(root)/stamps
+sdir := $(root)/src
+bdir := $(root)/build
+idir := $(root)/inst
+
+speedo_build_list = $(speedo_spkgs)
+
+ifeq ($(TARGETOS),w32)
+  speedo_autogen_buildopt="--build-w32"
+else
+  speedo_autogen_buildopt=
+endif
+
+ifeq ($(MAKE_J),)
+  speedo_makeopt=
+else
+  speedo_makeopt=-j$(MAKE_J)
+endif
+
+
+# The playground area is our scratch area, where we unpack, build and
+# install the packages.
+$(stampdir)/stamp-directories:
+       $(MKDIR) $(root)
+       $(MKDIR) $(stampdir)
+       $(MKDIR) $(sdir)
+       $(MKDIR) $(bdir)
+       $(MKDIR) $(idir)
+       touch $(stampdir)/stamp-directories
+
+# Frob the name $1 by converting all '-' and '+' characters to '_'.
+define FROB_macro
+$(subst +,_,$(subst -,_,$(1)))
+endef
+
+# Get the variable $(1) (which may contain '-' and '+' characters).
+define GETVAR
+$($(call FROB_macro,$(1)))
+endef
+
+# Set a couple of common variables.
+define SETVARS
+       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)";                                         \
+       pkgbdir="$(bdir)/$(1)";                                         \
+       pkgcfg="$(call GETVAR,speedo_pkg_$(1)_configure)";              \
+       pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)";           \
+       pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
+       export PATH="$(idir)/bin:$${PATH}";                             \
+       export LD_LIBRARY_PATH="$(idir)/lib:$${LD_LIBRARY_PATH}"
+endef
+
+
+# Template for source packages.
+
+define SPKG_template
+
+$(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
+       @echo "speedo: /*"
+       @echo "speedo:  *   $(1)"
+       @echo "speedo:  */"
+       @(cd $(sdir);                                   \
+        $(call SETVARS,$(1));                          \
+        if [ -n "$$$${git}" ]; then                    \
+          echo "speedo: unpacking $(1) from $$$${git}:$$$${gitref}"; \
+           git clone -q -b "$$$${gitref}" "$$$${git}" "$$$${pkg}"; \
+          cd "$$$${pkg}" &&                            \
+          AUTOGEN_SH_SILENT=1 ./autogen.sh;            \
+         elif [ -n "$$$${tar}" ]; then                 \
+          echo "speedo: unpacking $(1) from $$$${tar}"; \
+           case "$$$${tar}" in                         \
+             *.gz) opt=z ;;                            \
+             *.bz2) opt=j ;;                           \
+             *) opt= ;;                                        \
+           esac;                                       \
+           case "$$$${tar}" in                         \
+            /*) cmd=cat ;;                             \
+            *) cmd="wget -q -O -" ;;                   \
+          esac;                                        \
+          $$$${cmd} "$$$${tar}" | tar x$$$${opt}f - ;  \
+          base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
+                 | sed -e 's,\.tar.*$$$$,,'`;          \
+          mv $$$${base} $(1);                          \
+        else                                           \
+          echo "speedo: unpacking $(1) from UNKNOWN";  \
+        fi)
+       @touch $(stampdir)/stamp-$(1)-00-unpack
+
+$(stampdir)/stamp-$(1)-01-configure: $(stampdir)/stamp-$(1)-00-unpack
+       @echo "speedo: configuring $(1)"
+       @($(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) --silent   \
+                $$$${pkgcfg};                         \
+        else                                           \
+            eval "$$$${pkgsdir}/configure"             \
+                --silent                               \
+                --enable-maintainer-mode               \
+                 --prefix="$(idir)"                    \
+                $$$${pkgcfg};                          \
+        fi)
+       @touch $(stampdir)/stamp-$(1)-01-configure
+
+$(stampdir)/stamp-$(1)-02-make: $(stampdir)/stamp-$(1)-01-configure
+       @echo "speedo: making $(1)"
+       @($(call SETVARS,$(1));                         \
+         cd "$$$${pkgbdir}";                           \
+         $(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
+       @touch $(stampdir)/stamp-$(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)"
+       @($(call SETVARS,$(1));                         \
+         cd "$$$${pkgbdir}";                           \
+         $(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
+
+$(stampdir)/stamp-final-$(1): $(stampdir)/stamp-$(1)-03-install
+       @touch $(stampdir)/stamp-final-$(1)
+
+.PHONY : clean-$(1)
+clean-$(1):
+       @echo "speedo: uninstalling $(1)"
+       @($(call SETVARS,$(1));                         \
+        (cd "$$$${pkgbdir}";                           \
+         $(MAKE) --no-print-directory $$$${pkgmkargs_inst} uninstall V=0); \
+        rm -fR "$$$${pkgsdir}" "$$$${pkgbdir}")
+       @rm -f $(stampdir)/stamp-final-$(1) $(stampdir)/stamp-$(1)-*
+
+.PHONY : report-$(1)
+report-$(1):
+       @($(call SETVARS,$(1));                         \
+        echo -n $(1):\  ;                              \
+        if [ -n "$$$${git}" ]; then                    \
+           if [ -e "$$$${pkgsdir}/.git" ]; then                \
+            cd "$$$${pkgsdir}" &&                      \
+             git describe ;                            \
+          else                                         \
+             echo missing;                             \
+          fi                                           \
+         elif [ -n "$$$${tar}" ]; then                 \
+          base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
+                 | sed -e 's,\.tar.*$$$$,,'`;          \
+          echo $$$${base} ;                            \
+         fi)
+
+endef
+
+
+# Insert the template for each source package.
+$(foreach spkg, $(speedo_spkgs), $(eval $(call SPKG_template,$(spkg))))
+
+$(stampdir)/stamp-final: $(stampdir)/stamp-directories
+$(stampdir)/stamp-final: $(addprefix $(stampdir)/stamp-final-,$(speedo_build_list))
+       touch $(stampdir)/stamp-final
+
+all-speedo: $(stampdir)/stamp-final
+
+report-speedo: $(addprefix report-,$(speedo_build_list))
+
+# Just to check if we catched all stamps.
+clean-stamps:
+       $(RM) -fR $(stampdir)
+
+clean-speedo:
+       $(RM) -fR play
+
+.PHONY : all-speedo report-speedo clean-stamps clean-speedo