changeset 5591:8c4c67e75cab

Grand rpath, configure_flags, configure_variables, cross_compiling hack.
author Jan Nieuwenhuizen <janneke@gnu.org>
date Tue, 22 Sep 2009 20:33:14 +0200
parents c5ff07d9622b
children d7d576acba6c
files TODO bin/gupdate gub/build.py gub/cross.py gub/cygwin.py gub/darwin.py gub/dependency.py gub/freebsd.py gub/gnome.py gub/mirrors.py gub/misc.py gub/sources.py gub/specs/alien.py gub/specs/atk.py gub/specs/autoconf.py gub/specs/automake.py gub/specs/base-passwd.py gub/specs/bash.py gub/specs/bison.py gub/specs/busybox.py gub/specs/bzip2.py gub/specs/coreutils.py gub/specs/cross/gcc-core.py gub/specs/cross/gcc.py gub/specs/curl.py gub/specs/cygwin/cross/binutils.py gub/specs/dash.py gub/specs/db.py gub/specs/debian/cross/gcc.py gub/specs/dhcp.py gub/specs/diff.py gub/specs/fakechroot.py gub/specs/fakeroot-ng.py gub/specs/fakeroot.py gub/specs/file.py gub/specs/flex-old.py gub/specs/flex.py gub/specs/fontconfig.py gub/specs/fontforge.py gub/specs/freebsd/cross/gcc.py gub/specs/gawk.py gub/specs/gettext.py gub/specs/ghostscript.py gub/specs/git.py gub/specs/glib.py gub/specs/glibc.py gub/specs/gmp.py gub/specs/grep.py gub/specs/gtk+.py gub/specs/guile.py gub/specs/icoutils.py gub/specs/imagemagick.py gub/specs/inkscape.py gub/specs/jade.py gub/specs/libgcrypt.py gub/specs/libgphoto2.py gub/specs/libiconv.py gub/specs/liblpsolve.py gub/specs/libsamplerate.py gub/specs/libsndfile.py gub/specs/libt1.py gub/specs/libtool.py gub/specs/libxcb.py gub/specs/libxml2.py gub/specs/lilypond.py gub/specs/lilypondcairo.py gub/specs/linux-arm-softfloat/cross/gcc-core.py gub/specs/linux-arm-softfloat/cross/gcc.py gub/specs/m4.py gub/specs/make.py gub/specs/ncurses.py gub/specs/netpbm.py gub/specs/openoffice.py gub/specs/pango.py gub/specs/pangocairo.py gub/specs/patch.py gub/specs/perl.py gub/specs/pic.py gub/specs/pjproject.py gub/specs/python.py gub/specs/sed.py gub/specs/tar.py gub/specs/tcltk.py gub/specs/texinfo.py gub/specs/texlive.py gub/specs/xerces-c.py gub/specs/zlib.py gub/target.py gub/tools.py gub/w32.py
diffstat 90 files changed, 386 insertions(+), 566 deletions(-) [+]
line wrap: on
line diff
--- a/TODO	Tue Sep 22 11:09:24 2009 +0200
+++ b/TODO	Tue Sep 22 20:33:14 2009 +0200
@@ -25,10 +25,16 @@
 * Promote specific solutions into general ones [PROMOTEME]
    this cleans up existing packages, and increases chances of
    adding new packages without any changes.
-** config_variables, makeflags_for_build, cross_compiling
-** rpath_for_build () instead of %(rpath)s -Wl,-rpath -Wl,%(system_prefix)s
-** enabling LDFLAGS=..%(rpath)s... configure automagically for tools and target
-** enable wrap_executables () for eg compiling on FreeBSD/MacOS ?
+
+* Auto-detection
+** If we'd use Source/Repository for the first two build stages
+      download
+      untar
+   and only *then* instantiate the build class, we could use the
+   actual source tree to automatically/generically
+      determine the package version
+      determine the build class
+      determine the dependencies
 
 * Fix Fedora glibc problem, remove workaround in gub/specs/glibc.py,
   or add a build_platform == Fedora test.  [selinux?]
@@ -80,8 +86,9 @@
   - *every* work-dir in target/*/src/ is a GIT checkout
   - in the work-dir, GIT can be used to create and maintain patches
   
-* Why don't we use tarfile.TarFile?  It seems that subprocess/read_pipe
-  in gub/gup.py on tar -tzf is real inefficient (set buffering?)
+* Why don't we use tarfile.TarFile?
+   It seems that subprocess/read_pipe in gub/gup.py on tar -tzf is
+   real inefficient (set buffering?)  FIXED.
 
 * It seems that the removal of LD_LIBRARY_PATH as per
 
@@ -125,20 +132,12 @@
 
 * use of member functions vs class variables/static functions:
    - get_build_dependencies () -> class.build_dependencies = []
-   - def force_sequential_build () -> class.sequential_build = True
+   DONE def force_sequential_build () -> class.parallel_build_broken
    - def force_autoupdate () -> class.force_autoupdate = True
 ** also, why are these functions ?
    - def compile_command () -> class.compile_command
    - def install_command () -> class.install_command
      etc
-   - de ellende met klutserige taal als pieton is natuurlijk dat
-     je niet kunt
-       class.makeflags = if Foo.bar: 3 else: 4;
-       --> hah, kan in python2.5, maar we willen 2.4 supporten?
-     [nouja, je kunt met idiote list comprehension alles, maar clien is anders]
-       [x for x in [3, 4] if Foo.bar and x == 3 or not Foo.bar and x == 4][0]
-     dus we moeten wel uitkijken wat we doen...
-   - need_source_tree ?
 
 * junk use of /usr in code, use *_prefix) or %(prefix_dir)s
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/gupdate	Tue Sep 22 20:33:14 2009 +0200
@@ -0,0 +1,72 @@
+#! /usr/bin/env python
+
+"""
+    Copyright (c) 2005--2009
+    Jan Nieuwenhuizen <janneke@gnu.org>
+
+    This program 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 2, or (at your option)
+    any later version.
+
+    This program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+"""
+
+def argv0_relocation ():
+    import os, sys
+    bindir = os.path.dirname (sys.argv[0])
+    prefix = os.path.dirname (bindir)
+    if not prefix:
+        prefix = bindir + '/..'
+    sys.path.insert (0, prefix)
+
+argv0_relocation ()
+
+import optparse
+import re
+import sys
+#
+from gub import misc
+from gub.syntax import printf
+
+def parse_command_line ():
+    p = optparse.OptionParser ()
+    p.description = 'Grand Unified Builder - update spec urls.'
+    p.usage = 'gupdate [OPTION]... SPEC...'
+    p.add_option ('--replace', default=False, help='replace old urls.')
+    (options, files) = p.parse_args ()
+    if not files:
+        p.print_help ()
+    return (options, files)
+
+def do_spec (file_name, options):
+    s = open (file_name).read ()
+    m = re.search ('''source = ['"](http://[^'"]+[.]tar.(?:gz|bz2))['"]''', s)
+    if not m:
+        printf ('%(file_name)s: cannot find ball' % locals ())
+        return
+    url = m.group (1)
+    name, version_tuple, format = misc.split_ball (url)
+    url_dir = url[:url.rfind ('/')+1]
+    latest = misc.latest_url (url_dir, name)
+    if url != latest:
+        if options.replace:
+            printf ('%(file_name)s: updating to: %(latest)s' % locals ())
+            misc.file_sub ([(url, latest)], file_name)
+        else:
+            printf ('%(file_name)s: new ball: %(latest)s' % locals ())
+
+def main ():
+    (options, files) = parse_command_line ()
+    for f in files:
+        do_spec (f, options)
+
+if __name__ == '__main__':
+    main ()
--- a/gub/build.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/build.py	Tue Sep 22 20:33:14 2009 +0200
@@ -22,7 +22,10 @@
     source = ''
     branch = ''
     patches = []
+    build_dependencies = []
     install_after_build = True
+    parallel_build_broken = False
+    srcdir_build_broken = False
     
     def __init__ (self, settings, source):
         context.RunnableContext.__init__ (self, settings)
@@ -35,6 +38,19 @@
             self.source.connect_logger (runner.logger)
         return context.RunnableContext.connect_command_runner (self, runner)
 
+    @staticmethod
+    def gnome_platform (name, version='2.25.5'):
+        major, minor, micro = '.'.split (version)
+        url = 'http://ftp.gnome.org/pub/GNOME/platform/%(major)s.%(minor)s/%(version)s/sources/' % locals ()
+        raw_version_file = 'gnome-%(version)s' % locals
+        if not os.path.isfile (raw_version_file):
+            misc.download_url (url, 'downloads', raw_version_file)
+        s = open (raw_version_file).read ()
+        m = re.search ('(%(name)s-[.0-9]+tar.gz)' % locals (), s)
+        if not m:
+            raise 'barf'
+        return url + m.group (1)
+
     @context.subst_method
     def checksum_file (self):
         return '%(packages)s/%(name)s%(vc_branch_suffix)s.checksum'
@@ -86,9 +102,10 @@
                 msg = self.expand ('''This compile has previously been interrupted.
 To ensure a repeatable build, this will not be packaged.
 
-Do
+Run with
 
-    rm %(stamp_file)s
+    --fresh # or issue
+              rm %(stamp_file)s
 
 to force a full package rebuild, or
 
@@ -111,7 +128,7 @@
                 self.set_done (stage)
 
     def get_build_dependencies (self):
-        return []
+        return self.build_dependencies
 
     def with_platform (self, name):
         if 'BOOTSTRAP' in os.environ.keys ():
@@ -170,12 +187,19 @@
 
     @context.subst_method
     def LD_PRELOAD (self):
-        return '%(tools_prefix)s/lib/librestrict.so'
+        return ''
+
+    @context.subst_method
+    def libs (self):
+        return ''
+
+    @context.subst_method
+    def so_extension (self):
+        return '.so'
 
     @context.subst_method
     def rpath (self):
-#        return r'-Wl,-rpath -Wl,\$$ORIGIN/../lib -Wl,-rpath -Wl,\$$ORIGIN/../../lib'
-        return r'-Wl,-rpath -Wl,\$$ORIGIN/../lib'
+        return r'-Wl,-rpath -Wl,\$$ORIGIN/../lib -Wl,-rpath -Wl,%(system_prefix)s/lib'
 
     def get_substitution_dict (self, env={}):
         dict = {
@@ -211,10 +235,6 @@
         # FIMXE: '' always depends on runtime?
         return {'': [], 'devel': [], 'doc': [], 'runtime': [], 'x11': []}
 
-    def force_sequential_build (self):
-        """Set to true if package can't handle make -jX """
-        return False
-
     @context.subst_method
     def source_checksum (self):
         return self.source.checksum ()
@@ -284,6 +304,10 @@
         return '%(installdir)s/%(name)s-%(version)s-root'
 
     @context.subst_method
+    def configure_prefix (self):
+        return '%(prefix_dir)s'
+
+    @context.subst_method
     def install_prefix (self):
         return '%(install_root)s%(prefix_dir)s'
 
@@ -304,27 +328,29 @@
 
     @context.subst_method
     def configure_command (self):
-        return ' sh %(configure_binary)s --prefix=%(install_prefix)s'
+        return ' sh %(configure_binary)s %(configure_flags)s %(configure_variables)s'
+
+    @context.subst_method
+    def configure_flags (self):
+        return ' --prefix=%(configure_prefix)s'
+
+    @context.subst_method
+    def configure_variables (self):
+        return ''
 
     @context.subst_method
     def compile_command (self):
-        return 'make %(makeflags)s '
+        return 'make %(job_spec)s %(makeflags)s '
 
-    # what the heck is this?  Why would we not want to use
-    # -j x with multiple cpu's (compiling is often io bound)
-    # and why not when cross compiling (think icecc?).
     @context.subst_method
     def native_compile_command (self):
-        c = 'make'
+        return 'make %(job_spec)s %(makeflags)s '
 
-        job_spec = ' '
-        if (not self.force_sequential_build ()
-            and self.settings.cpu_count_str != '1'):
-
-            job_spec += ' -j%s ' % self.settings.cpu_count_str
-
-        c += job_spec
-        return c
+    @context.subst_method
+    def job_spec (self):
+        if not self.parallel_build_broken:
+            return '-j' + str (2 * int (self.settings.cpu_count_str))
+        return ''
 
     @context.subst_method
     def src_package_ball (self):
@@ -383,6 +409,8 @@
             self.dump (str, self.cache_file (), permissions=octal.o755)
 
     def configure (self):
+        if self.srcdir_build_broken:
+            self.shadow ()
         self.config_cache ()
         self.system ('''
 mkdir -p %(builddir)s || true
@@ -424,10 +452,8 @@
         sub = self.expand ('%(system_prefix)s/share/libtool/config/config.sub')
         for file in guess, sub:
             self.system ('cp -pv %(file)s %(autodir)s',  locals ())
-
     def update_libtool (self):
         self.map_locate (lambda logger, file: libtool_update (logger, self.expand ('%(system_prefix)s/bin/libtool'), file), '%(builddir)s', 'libtool')
-
     def pre_install (self):
         pass
     def install (self):
--- a/gub/cross.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/cross.py	Tue Sep 22 20:33:14 2009 +0200
@@ -27,13 +27,6 @@
         dict.update (env)
         d = build.AutoBuild.get_substitution_dict (self, dict).copy ()
         return d
-    def LD_PRELOAD (self):
-        # Makes no sense for cross.  Be it /usr/bin/gcc or tools::gcc,
-        # it needs to read /usr/include/stdlib.h etc.  How to, or why
-        # restrict reading other files from /?
-        # See LIBRESTRICT_IGNORE below, it would need to include every
-        # binary in system_prefix :-)
-        return ''
     def configure_command (self):
         return (
             # BOOTSTRAP -- do we need this?
@@ -76,6 +69,7 @@
 #    'tools::binutils',
 #    'tools::gcc',
     'tools::make',
+    'tools::libtool',
     'tools::file',
     ]
 
--- a/gub/cygwin.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/cygwin.py	Tue Sep 22 20:33:14 2009 +0200
@@ -318,7 +318,6 @@
         if not os.path.exists (file):
             misc.download_url (url, self.settings.downloads,
                                local=['file://%s' % self.settings.downloads],
-
                                )
             # arg
             # self.file_sub ([('\':"', "':'")], file)
--- a/gub/darwin.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/darwin.py	Tue Sep 22 20:33:14 2009 +0200
@@ -138,11 +138,24 @@
                                                   (['zlib', 'zlib-devel'],))
     @context.subst_method
     def rpath (foo):
-        # ld has no -rpath on darwin [at least not darwin-ppc]
-        # FIXME: some equivalent here?
         return ''
     package.rpath = misc.MethodOverrider (package.nop, rpath)
 
+    @context.subst_method
+    def so_extension (foo):
+        return '.dylib'
+    package.so_extension = misc.MethodOverrider (package.nop, so_extension)
+
+    def autoupdate (foo):
+        # somehow retriggers autoconf?!?
+        # for i in ['configure.ac', 'configure']:
+        for i in ['configure']:
+            package.file_sub ([('-fpascal-strings ', ''),
+                               ('-I(/Developer/Headers/FlatCarbon)',
+                                r'-I%(system_root)s\1'),
+                               ], '%(srcdir)s/' + i)
+    package.autoupdate = misc.MethodOverrider (package.autoupdate, autoupdate)
+
     build.change_dict (package, {
 
             ## We get a lot of /usr/lib/ -> @executable_path/../lib/
--- a/gub/dependency.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/dependency.py	Tue Sep 22 20:33:14 2009 +0200
@@ -132,6 +132,8 @@
             x, parameters = misc.dissect_url (self._url)
             if parameters.get ('patch'):
                 self._cls.patches = parameters['patch']
+            if parameters.get ('dependency'):
+                self._cls.build_dependencies = parameters['dependency']
         return self._url
     def name (self):
         return self._name
--- a/gub/freebsd.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/freebsd.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,4 +1,6 @@
+from gub import context
 from gub import cross
+from gub import misc
 
 def get_cross_build_dependencies (settings):
     return ['cross/gcc', 'freebsd-runtime']
@@ -6,6 +8,11 @@
 def change_target_package (package):
     cross.change_target_package (package)
 
+    @context.subst_method
+    def rpath (foo):
+        return ''
+    package.rpath = misc.MethodOverrider (package.nop, rpath)
+
 # FIXME: download from sane place; or rather download only kernel
 # headers and build full toolchain from source?
 def get_sdk ():
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gub/gnome.py	Tue Sep 22 20:33:14 2009 +0200
@@ -0,0 +1,10 @@
+from gub import misc
+
+#VERSION='2.25.5'
+VERSION='2.26.3'
+
+def platform_url (name, version=VERSION):
+    major, minor, micro = version.split ('.')
+    url = 'http://ftp.gnome.org/pub/GNOME/platform/%(major)s.%(minor)s/%(version)s/sources/' % locals ()
+    raw_version_file = 'downloads/gnome-%(version)s.index' % locals ()
+    return misc.latest_url (url, name, raw_version_file)
--- a/gub/mirrors.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/mirrors.py	Tue Sep 22 20:33:14 2009 +0200
@@ -9,7 +9,7 @@
 
 gnome_222 ='http://ftp.gnome.org/pub/GNOME/platform/2.22/2.22.0/sources/%(name)s-%(version)s.tar.%(format)s'
 
-gnubase = 'ftp://ftp.gnu.org/pub/gnu'
+gnubase = 'http://ftp.gnu.org/pub/gnu'
     # FIXME: find complete GNU mirror
     # base = 'ftp://dl.xs4all.nl/pub/mirror/gnu'
     # base = 'ftp://sunsite.dk/pub/gnu'
@@ -21,7 +21,7 @@
 alpha = alphabase + '/%(name)s/%(name)s-%(version)s.tar.%(format)s'
 
 nongnu_savannah = 'http://download.savannah.nongnu.org/releases/%(name)s/%(name)s-%(version)s.tar.%(format)s'
-nongnu          = 'ftp://ftp.gnu.org/pub/gnu/non-gnu/%(name)s/%(name)s-%(version)s.tar.%(format)s'
+nongnu          = 'http://ftp.gnu.org/pub/gnu/non-gnu/%(name)s/%(name)s-%(version)s.tar.%(format)s'
 
 freetype = 'http://download.savannah.gnu.org/releases/freetype/%(name)s-%(version)s.tar.%(format)s'
 
--- a/gub/misc.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/misc.py	Tue Sep 22 20:33:14 2009 +0200
@@ -132,7 +132,9 @@
     return default_version
 
 def version_to_string (t):
-    return '%s-%s' % ('.'.join (map (string, t[:-1])), t[-1])
+    if t[-1]:
+        return '%s-%s' % ('.'.join (map (str, t[:-1])), t[-1])
+    return '.'.join (map (str, t[:-1]))
 
 def split_version (s):
     m = re.match ('^(([0-9].*)-([0-9]+))$', s)
@@ -165,6 +167,9 @@
         return (s, (0, 0), '')
     return (m.group (1), string_to_version ('-'.join (split_version (m.group (2)))), m.group (6))
 
+def assemble_ball (t):
+    return t[0] + '-' + version_to_string (t[1]) + '.tar.' + t[2]
+
 def name_from_url (url):
     url, params = dissect_url (url)
     name = os.path.basename (url)
@@ -283,6 +288,7 @@
 
 # FIXME: read settings.rc, local, fallback should be a user-definable list
 def download_url (original_url, dest_dir,
+                  dest_name='',
                   local=[],
                   cache=[os.environ.get ('GUB_DOWNLOAD_CACHE', '')],
                   fallback=['http://lilypond.org/download/gub-sources'],
@@ -307,13 +313,13 @@
 
     result = 'no valid urls'
     for url in candidate_urls:
-        result = _download_url (url, dest_dir, progress)
+        result = _download_url (url, dest_dir, dest_name, progress)
         if type (result) == type (0):
             return
     raise Exception ('Download failed', result)
 
-def _download_url (url, dest_dir, progress=None):
-    progress ('downloading %(url)s -> %(dest_dir)s\n' % locals ())
+def _download_url (url, dest_dir, dest_name='', progress=None):
+    progress ('downloading %(url)s -> %(dest_dir)s/%(dest_name)s\n' % locals ())
     if not os.path.isdir (dest_dir):
         raise Exception ('not a dir', dest_dir)
 
@@ -347,9 +353,11 @@
     if progress:
         progress ('\n')
 
-    file_name = os.path.basename (url)
+    if not dest_name:
+        dest_name = os.path.basename (url)
     if size:
-        os.rename (tmpfile, os.path.join (dest_dir, file_name))
+        print 'renaming:', tmpfile, os.path.join (dest_dir, dest_name)
+        os.rename (tmpfile, os.path.join (dest_dir, dest_name))
         if progress:
             progress ('done (%(size)s)\n' % locals ())
     else:
@@ -695,6 +703,18 @@
     return list (sorted (os.environ.get ('LIBRESTRICT',
                                          'open').replace (':', ' ').split (' ')))
 
+def latest_url (url, name, raw_version_file=None):
+    if not raw_version_file:
+        raw_version_file = 'downloads/%(name)s.index' % locals ()
+    if not os.path.isfile (raw_version_file):
+        download_url (url, 'downloads', os.path.basename (raw_version_file))
+    s = open (raw_version_file).read ()
+    inert_name = name.replace ('+', '[+]')
+    m = re.findall ('(%(inert_name)s-[.0-9]+tar.gz)' % locals (), s)
+    if len (m) == 1:
+        return m[0]
+    return url + assemble_ball (sorted (map (split_ball, m))[-1])
+
 start = 0
 def timing ():
     global start
--- a/gub/sources.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/sources.py	Tue Sep 22 20:33:14 2009 +0200
@@ -13,7 +13,7 @@
 from os.path import join
 from gub import mirrors
 
-gnu = 'ftp://ftp.gnu.org/pub/gnu'
+gnu = 'http://ftp.gnu.org/pub/gnu'
 nongnu = 'http://download.savannah.nongnu.org/releases'
 sf = 'http://surfnet.dl.sourceforge.net/sourceforge'
 gub = 'http://lilypond.org/download/gub-sources'
@@ -23,7 +23,7 @@
 ltool = mirrors.gnu % { 'name': 'libtool', 'version': '1.5.22', 'format': 'gz'}
 
 libtool = join (gnu, 'libtool/libtool-1.5.22.tar.gz')
-# libtool = 'ftp://ftp.gnu.org/pub/gnu/libtool/libtool-1.5.22.tar.gz'
+# libtool = 'http://ftp.gnu.org/pub/gnu/libtool/libtool-1.5.22.tar.gz'
 
 # foo__PLATFORM should also work here
 
--- a/gub/specs/alien.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/alien.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,17 +1,12 @@
+from gub import tools
 
-## untested.
-if 0:
-    Alien (settings).with_template (version="8.60",
-           mirror="http://www.kitenet.net/programs/alien/alien_8.60.tar.gz",
-           format="gz"),
-
-
-class Alien (AutoBuild):
+class Alien (tools.AutoBuild):
+    source = "http://www.kitenet.net/programs/alien/alien_8.60.tar.gz",
+    srcdir_build_broken = True
     def srcdir (self):
         return '%(allsrcdir)s/alien'
     def configure (self):
-        self.shadow ()
-        AutoBuild.configure (self)
+        tools.AutoBuild.configure (self)
         self.system ('cd %(srcdir)s && patch -p0 < %(patchdir)s/alien.patch')
     def configure_command (self):
         return 'perl Makefile.PL'
--- a/gub/specs/atk.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/atk.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,23 +1,14 @@
-from gub import context
+from gub import gnome
 from gub import target
 
 class Atk (target.AutoBuild):
-    source = 'ftp://ftp.gnome.org/pub/GNOME/sources/atk/1.25/atk-1.25.2.tar.gz'
-    def _get_build_dependencies (self):
+    #source = 'ftp://ftp.gnome.org/pub/GNOME/sources/atk/1.25/atk-1.25.2.tar.gz'
+    #source = 'ftp://ftp.gnome.org/pub/GNOME/sources/atk/1.25/atk-1.25.2.tar.gz&dependency=tools::libtool&dependency=glib-devel'
+    source = gnome.platform_url ('atk')
+    build_dependencies = ['tools::libtool', 'glib-devel']
+    def XX_get_build_dependencies (self):
         return ['tools::libtool', 'glib-devel']
-    def configure_command (self):
-        # FIXME: use cross_compiling=yes from gtk+.patch ()?
-        # UGH. glib-2.0.m4's configure snippet compiles and runs a
-        # program linked against glib; so it needs LD_LIBRARY_PATH (or
-        # a configure-time-only -Wl,-rpath, -Wl,%(system_prefix)s/lib
-        return (target.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='%(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''')
 
 class Atk__mingw (Atk):
     def patch (self):
         self.file_sub ([('\$\(srcdir\)/atk.def', 'atk.def')], '%(srcdir)s/atk/Makefile.in', must_succeed=True)
-
-class Atk__darwin (Atk):
-    def configure_command (self):
-        # no rpath on darwin
-        return target.AutoBuild.configure_command (self)
--- a/gub/specs/autoconf.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/autoconf.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,15 +4,10 @@
 from gub import tools
 
 class Autoconf__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.63.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.63.tar.gz'
+    parallel_build_broken = True
     def _get_build_dependencies (self):
         return [
             'm4',
             'perl',
             ]
-    def force_sequential_build (self):
-        return True
-    def makeflags (self):
-        return ('PERL5LIB=%(tools_prefix)s/lib/perl5/5.10.0'
-        	+ ':%(tools_prefix)s/lib/perl5/5.10.0/%(build_architecture)s'
-                + misc.append_path (os.environ.get ('PERL5LIB', '')))
--- a/gub/specs/automake.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/automake.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,13 +1,13 @@
 from gub import tools
 
 class Automake__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/automake/automake-1.10.1.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/automake/automake-1.10.1.tar.gz'
     def _get_build_dependencies (self):
         return ['autoconf']
-    def configure_command (self):
-	return ('AUTOM4TE=%(tools_prefix)s/bin/autom4te '
-		+ 'autom4te_perllibdir=%(tools_prefix)s/share/autoconf '
-		+ 'AC_MACRODIR=%(tools_prefix)s/share/autoconf '
-		+ 'M4PATH=%(tools_prefix)s/share/autoconf '
-		+ 'AUTOM4TE_CFG=%(tools_prefix)s/share/autoconf/autom4te.cfg '
-		+ tools.AutoBuild.configure_command (self))
+    def configure_variables (self):
+	return (tools.AutoBuild.configure_variables (self)
+                + ' AUTOM4TE=%(tools_prefix)s/bin/autom4te'
+		+ ' autom4te_perllibdir=%(tools_prefix)s/share/autoconf'
+		+ ' AC_MACRODIR=%(tools_prefix)s/share/autoconf'
+		+ ' M4PATH=%(tools_prefix)s/share/autoconf'
+		+ ' AUTOM4TE_CFG=%(tools_prefix)s/share/autoconf/autom4te.cfg')
--- a/gub/specs/base-passwd.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/base-passwd.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,11 +2,9 @@
 
 class Base_passwd (target.AutoBuild):
     source = 'ftp://ftp.nl.debian.org/debian/pool/main/b/base-passwd/base-passwd_3.5.11.tar.gz'
+    srcdir_build_broken = True
     def get_subpackage_names (self):
         return ['']
-    def configure (self):
-        self.shadow ()
-        target.AutoBuild.configure (self)
     def configure_command (self):
         return (target.AutoBuild.configure_command (self)
                 .replace ('--config-cache', '--cache-file=%(builddir)s/config.cache'))
--- a/gub/specs/bash.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/bash.py	Tue Sep 22 20:33:14 2009 +0200
@@ -20,13 +20,9 @@
 no_patch = True # let's not use patch in a bootstrap package
 class Bash__tools (tools.AutoBuild, Bash):
     patches = ['bash-3.2-librestrict.patch']
+    parallel_build_broken = True
     if no_patch:
         patches = []
-    def force_sequential_build (self):
-        return True
-    @context.subst_method
-    def LDFLAGS (self):
-        return '%(rpath)'
     def patch (self):
         if no_patch:
             self.file_sub ([('^  (check_dev_tty [(][)];)', r'  /* \1 */')],
@@ -36,6 +32,3 @@
     def install (self):
         tools.AutoBuild.install (self)
         self.system ('cd %(install_prefix)s/bin && ln -s bash sh')
-    def wrap_executables (self):
-        # using rpath
-        pass
--- a/gub/specs/bison.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/bison.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,4 +1,4 @@
 from gub import tools
 
 class Bison__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/bison/bison-2.3.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/bison/bison-2.3.tar.gz'
--- a/gub/specs/busybox.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/busybox.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,6 +7,7 @@
 
 class Busybox (target.AutoBuild):
     source = 'http://busybox.net/downloads/busybox-1.5.1.tar.bz2'
+    srcdir_build_broken = True
     def get_subpackage_names (self):
         return ['']
     def configure_command (self):
@@ -15,7 +16,6 @@
     def autoconf_h (self):
         return 'autoconf.h'
     def configure (self):
-        self.shadow ()
         target.AutoBuild.configure (self)
         self.file_sub ([('^# CONFIG_FEATURE_SH_IS_ASH is not set', 'CONFIG_FEATURE_SH_IS_ASH=y'),
                         ('^CONFIG_FEATURE_SH_IS_NONE=y', '# CONFIG_FEATURE_SH_IS_NONE is not set'),
@@ -47,13 +47,13 @@
 
 class Busybox__tools (tools.AutoBuild, Busybox):
     source = 'http://busybox.net/downloads/busybox-1.13.2.tar.gz'
+    srcdir_build_broken = True
     def configure_command (self):
         return 'make -f %(srcdir)s/Makefile defconfig'
     @context.subst_method
     def autoconf_h (self):
         return 'autoconf.h'
     def configure (self):
-        self.shadow ()
 #        tools.AutoBuild.configure (self)
         self.system ('cd %(builddir)s && %(configure_command)s')
         self.file_sub ([
--- a/gub/specs/bzip2.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/bzip2.py	Tue Sep 22 20:33:14 2009 +0200
@@ -12,6 +12,3 @@
     def install (self):
         tools.MakeBuild.install (self)
         self.system ('cp -pv %(builddir)s/libbz2.so* %(install_prefix)s/lib')
-    def wrap_executables (self):
-        # no dynamic executables
-        pass
--- a/gub/specs/coreutils.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/coreutils.py	Tue Sep 22 20:33:14 2009 +0200
@@ -10,7 +10,7 @@
 
 no_patch = True # let's not use patch in a bootstrap package
 class Coreutils__tools (tools.AutoBuild):
-#    source = 'ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-6.12.tar.gz'
+#    source = 'http://ftp.gnu.org/pub/gnu/coreutils/coreutils-6.12.tar.gz'
     source = 'http://ftp.gnu.org/pub/gnu/coreutils/coreutils-7.4.tar.gz'
     if 'BOOTSTRAP' in os.environ.keys ():
         patches = ['coreutils-6.12-shared-autoconf.patch']
@@ -59,6 +59,3 @@
         if 'BOOTSTRAP' in os.environ.keys () or no_patch:
             self.system ('mkdir -p %(install_prefix)s/lib')
             self.system ('cp -pv %(builddir)s/lib/libcoreutils* %(install_prefix)s/lib')
-    def wrap_executables (self):
-        # using rpath
-        pass
--- a/gub/specs/cross/gcc-core.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/cross/gcc-core.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,7 +3,7 @@
 from gub import misc
         
 class Gcc_core (gcc.Gcc__from__source):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2'
     def _get_build_dependencies (self):
         return gcc.Gcc._get_build_dependencies (self)
     def get_subpackage_names (self):
--- a/gub/specs/cross/gcc.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/cross/gcc.py	Tue Sep 22 20:33:14 2009 +0200
@@ -96,7 +96,7 @@
 Gcc__linux = Gcc__from__source
 
 class Gcc__mingw (Gcc):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2'
     def _get_build_dependencies (self):
         return (Gcc._get_build_dependencies (self)
                 + ['mingw-runtime', 'w32api']
@@ -160,7 +160,7 @@
 # Untar stage is gone, use plain gcc + cygwin patch
 #class Gcc__cygwin (Gcc):
 class Gcc__cygwin (Gcc):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.4/gcc-3.4.4.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.4/gcc-3.4.4.tar.bz2'
     patches = ['gcc-3.4.4-cygwin-3.patch']
     def xuntar (self):
         ball = self.source._file_name ()
--- a/gub/specs/curl.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/curl.py	Tue Sep 22 20:33:14 2009 +0200
@@ -6,9 +6,6 @@
     source = 'http://curl.haxx.se/download/curl-7.19.0.tar.gz'
     def _get_build_dependencies (self):
         return ['tools::libtool']
-    def configure_command (self):
-        return (target.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='%(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''')
     def install (self):
         target.AutoBuild.install (self)
         self.system ('mkdir -p %(install_prefix)s%(cross_dir)s/bin')
@@ -22,6 +19,3 @@
 class Curl__tools (tools.AutoBuild, Curl):
     def _get_build_dependencies (self):
         return ['libtool']
-    def configure_command (self):
-        return (tools.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''')
--- a/gub/specs/cygwin/cross/binutils.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/cygwin/cross/binutils.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,7 +4,7 @@
 # FIXME: setting binutil's tooldir and/or gcc's gcc_tooldir may fix
 # -luser32 (ie -L .../w32api/) problem without having to set LDFLAGS.
 class Binutils__cygwin (cross_binutils.Binutils):
-    source = 'ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.17.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/binutils/binutils-2.17.tar.bz2'
     def makeflags (self):
         from gub import misc
         return misc.join_lines ('''
--- a/gub/specs/dash.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/dash.py	Tue Sep 22 20:33:14 2009 +0200
@@ -12,5 +12,3 @@
         return (tools.AutoBuild.configure_command (self)
                 # dash takes --enable-static to mean: --disable-shared
                 .replace ('--enable-static', ''))
-    def wrap_executables (self):
-        pass
--- a/gub/specs/db.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/db.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,6 +4,7 @@
 
 class Db (target.AutoBuild):
     source = 'http://download.oracle.com/berkeley-db/db-4.7.25.tar.gz'
+    srcdir_build_broken = True
     def cache_file (self):
         return '%(builddir)s/build_unix/config.cache'
     def configure_command (self):
@@ -15,7 +16,6 @@
     def makeflags (self):
         return '-C build_unix'
     def configure (self):
-        self.shadow ()
         self.system ('mkdir -p %(builddir)s/build_unix')
         target.AutoBuild.configure (self)
         self.file_sub ([('\(prefix\)docs', '\(prefix\)/share/doc/db'),
@@ -74,12 +74,12 @@
             self.system ('cd %(install_prefix)s/lib && mv libdb-4.7.la libdb-4.7.la-')
 
 class Db__tools (tools.AutoBuild, Db):
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return ['libtool']
     def configure_command (self):
         return 'cd build_unix && ../' + tools.AutoBuild.configure_command (self)
     def configure (self):
-        self.shadow ()
         self.system ('mkdir -p %(builddir)s/build_unix')
         tools.AutoBuild.configure (self)
         self.file_sub ([('\(prefix\)docs', '\(prefix\)/share/doc/db'),
@@ -90,5 +90,3 @@
     def install (self):
         tools.AutoBuild.install (self)
         self.system ('cd %(install_prefix)s/lib && ln -s libdb-*.la libdb.la')
-    def wrap_executables (self):
-        pass
--- a/gub/specs/debian/cross/gcc.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/debian/cross/gcc.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,7 +2,7 @@
 from gub import debian
 
 class Gcc__debian (gcc.Gcc):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-' + debian.gcc_version + '/gcc-' + debian.gcc_version + '.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-' + debian.gcc_version + '/gcc-' + debian.gcc_version + '.tar.bz2'
     def _get_build_dependencies (self):
         return ['cross/binutils', 'libc6', 'libc6-dev', 'linux-kernel-headers']
     ## TODO: should detect whether libc supports TLS 
@@ -10,6 +10,6 @@
         return gcc.Gcc.configure_command (self) + ' --disable-tls '
 
 class Gcc__debian__arm (Gcc__debian):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2'
 
 
--- a/gub/specs/dhcp.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/dhcp.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,13 +3,11 @@
 class Dhcp (target.AutoBuild):
     #source = 'http://ftp.isc.org/isc/dhcp/dhcp-4.1.0a2.tar.gz'
     source = 'http://ftp.isc.org/isc/dhcp/dhcp-3.0.7.tar.gz&strip=2'
+    srcdir_build_broken = True
     def get_subpackage_names (self):
         return ['']
     def configure_command (self):
         return '%(srcdir)s/configure linux-2.2'
-    def configure (self):
-        self.shadow ()
-        target.AutoBuild.configure (self)
     def makeflags (self):
         from gub import misc
         return misc.join_lines ('''
--- a/gub/specs/diff.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/diff.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,6 +2,3 @@
 
 class Diff__tools (tools.AutoBuild):
     source = 'http://ftp.gnu.org/pub/gnu/diffutils/diffutils-2.8.1.tar.gz'
-    def wrap_executables (self):
-        # no dynamic executables [other than /lib:libc]
-        pass
--- a/gub/specs/fakechroot.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/fakechroot.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,13 +7,13 @@
             'libtool',
             'util-linux', # fakeroot script uses /usr/bin/getopt
             ]
-    def configure_command (self):
-        return (tools.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -ldl' '''
+    def libs (self):
+        return '-ldl'
+    def configure_variables (self):
+        return (tools.AutoBuild.configure_variables (self)
                 + ' CC=%(system_prefix)s/bin/%(toolchain_prefix)sgcc'
                 + ' CCLD=%(system_prefix)s/bin/%(toolchain_prefix)sgcc'
-                + ' CXX=%(system_prefix)s/bin/%(toolchain_prefix)sg++'
-                )
+                + ' CXX=%(system_prefix)s/bin/%(toolchain_prefix)sg++')
     def compile (self):
         tools.AutoBuild.compile (self)
         self.file_sub ([('BINDIR=.*', 'BINDIR=%(system_prefix)s/bin'),
--- a/gub/specs/fakeroot-ng.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/fakeroot-ng.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,13 +7,11 @@
         'fakeroot-ng-srcdir.patch',
         'fakeroot-ng-linux-2.4.patch'
         ]
-    def configure_command (self):
-        return (tools.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='-L%(system_prefix)s/lib64 -L%(system_prefix)s/lib %(rpath)s %(rpath)s64 -ldl' '''
-                + ' CFLAGS=-I%(builddir)s'
+    srcdir_build_broken = True
+    def libs (self):
+        return '-ldl'
+    def configure_variables (self):
+        return (tools.AutoBuild.configure_variables (self)
                 + ' CC=%(system_prefix)s/bin/%(toolchain_prefix)sgcc'
-                + ' CXX=%(system_prefix)s/bin/%(toolchain_prefix)sg++'
-                )
-    def configure (self):
-        self.shadow ()
-        tools.AutoBuild.configure (self)
+                + ' CCLD=%(system_prefix)s/bin/%(toolchain_prefix)sgcc'
+                + ' CXX=%(system_prefix)s/bin/%(toolchain_prefix)sg++')
--- a/gub/specs/fakeroot.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/fakeroot.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,13 +7,13 @@
             'libtool',
             'util-linux', # fakeroot script uses /usr/bin/getopt
             ]
-    def configure_command (self):
-        return (tools.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -ldl' '''
+    def libs (self):
+        return '-ldl'
+    def configure_variables (self):
+        return (tools.AutoBuild.configure_variables (self)
                 + ' CC=%(system_prefix)s/bin/%(toolchain_prefix)sgcc'
                 + ' CCLD=%(system_prefix)s/bin/%(toolchain_prefix)sgcc'
-                + ' CXX=%(system_prefix)s/bin/%(toolchain_prefix)sg++'
-                )
+                + ' CXX=%(system_prefix)s/bin/%(toolchain_prefix)sg++')
     def compile (self):
         tools.AutoBuild.compile (self)
         self.file_sub ([('BINDIR=.*', 'BINDIR=%(system_prefix)s/bin'),
--- a/gub/specs/file.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/file.py	Tue Sep 22 20:33:14 2009 +0200
@@ -9,6 +9,3 @@
             'libtool',
             'zlib',
             ]
-    def configure_command (self):
-        return (tools.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gub/specs/flex-old.py	Tue Sep 22 20:33:14 2009 +0200
@@ -0,0 +1,9 @@
+from gub import tools
+
+class Flex_old__tools (tools.AutoBuild):
+    source = 'http://surfnet.dl.sourceforge.net/sourceforge/flex/flex-2.5.4a.tar.gz'
+    patches = ['flex-2.5.4a-FC4.patch']
+    def _get_build_dependencies (self):
+        return ['bison']
+    def install_command (self):
+        return self.broken_install_command (self)
--- a/gub/specs/flex.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/flex.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,11 +2,3 @@
 
 class Flex__tools (tools.AutoBuild):
     source = 'http://surfnet.dl.sourceforge.net/sourceforge/flex/flex-2.5.33.tar.gz'
-
-class Flex_old__tools (tools.AutoBuild):
-    source = 'http://surfnet.dl.sourceforge.net/sourceforge/flex/flex-2.5.4a.tar.gz'
-    patches = ['flex-2.5.4a-FC4.patch']
-    def _get_build_dependencies (self):
-        return ['bison']
-    def install_command (self):
-        return self.broken_install_command (self)
--- a/gub/specs/fontconfig.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/fontconfig.py	Tue Sep 22 20:33:14 2009 +0200
@@ -31,11 +31,6 @@
     def patch (self):
         self.dump ('\nAC_SUBST(LT_AGE)', '%(srcdir)s/configure.in', mode='a', permissions=octal.o755)
         target.AutoBuild.patch (self)
-    def autoupdate (self):
-        target.AutoBuild.autoupdate (self)
-        # FIXME: PROMOTEME to target.py? -- yes, but in/after autoupdate stage
-        self.file_sub ([('cross_compiling=(maybe|no)', 'cross_compiling=yes')],
-                       '%(srcdir)s/configure')
     @context.subst_method
     def freetype_cflags (self):
         # this is shady: we're using the flags from the tools version
--- a/gub/specs/fontforge.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/fontforge.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,10 +4,10 @@
 class Fontforge__tools (tools.AutoBuild):
     source = 'http://lilypond.org/download/gub-sources/fontforge_full-20080927.tar.bz2'
     patches = ['fontforge-20080927-noxml2.patch']
+    parallel_build_broken = True
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return ['freetype', 'libpng', 'libjpeg', 'libxml2']
-    def force_sequential_build (self):
-        return True
     def srcdir (self):
         return tools.AutoBuild.srcdir (self).replace ('_full', '')
     def patch (self):
@@ -41,12 +41,3 @@
                 # let's ignore python (and its dynamic link intracies
                 # for now).
                 + ' --without-python')
-    @context.subst_method
-    def LDFLAGS (self):
-        return '%(rpath)'
-    def configure (self):
-        self.shadow ()
-        tools.AutoBuild.configure (self)
-    def wrap_executables (self):
-        # using rpath
-        pass
--- a/gub/specs/freebsd/cross/gcc.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/freebsd/cross/gcc.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,9 +2,9 @@
 from gub import misc
 
 class Gcc__freebsd (cross_gcc.Gcc):
-    #source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2'
-    #source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2'
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.3.2/gcc-4.3.2.tar.bz2'
+    #source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2'
+    #source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-4.3.2/gcc-4.3.2.tar.bz2'
     def _get_build_dependencies (self):
         return cross_gcc.Gcc._get_build_dependencies (self) + ['tools::mpfr']
     def configure_command (self):
--- a/gub/specs/gawk.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/gawk.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,4 +1,4 @@
 from gub import tools
 
 class Gawk__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gawk/gawk-3.1.6.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/gawk/gawk-3.1.6.tar.gz'
--- a/gub/specs/gettext.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/gettext.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,7 +3,7 @@
 
 class Gettext (target.AutoBuild):
     # 0.16.1 makes gcc barf on ICE.
-    source = 'ftp://ftp.gnu.org/pub/gnu/gettext/gettext-0.15.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/gettext/gettext-0.15.tar.gz'
     def _get_build_dependencies (self):
         return ['libtool']
     def LD_PRELOAD (self):
@@ -23,8 +23,9 @@
 ''')
     def configure_command (self):
         return (target.AutoBuild.configure_command (self)
-                + ' --disable-threads --disable-csharp --disable-java '
-                + ''' LDFLAGS='%(rpath)s' '''
+                + ' --disable-threads'
+                + ' --disable-csharp'
+                + ' --disable-java'
                 )
     def configure (self):
         target.AutoBuild.configure (self)
@@ -91,5 +92,4 @@
                        '%(builddir)s/gettext-tools/Makefile')
     def configure_command (self):
         return (tools.AutoBuild.configure_command (self)
-                + ' --disable-libasprintf'
-                + ''' LDFLAGS='%(rpath)s' ''')
+                + ' --disable-libasprintf')
--- a/gub/specs/ghostscript.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/ghostscript.py	Tue Sep 22 20:33:14 2009 +0200
@@ -24,6 +24,7 @@
     # HEAD - need to load TTF fonts on fedora without crashing.
     revision = 'b35333cf3579e85725bd7d8d39eacc9640515eb8'
     source = 'git://git.infradead.org/ghostscript.git?branch=refs/remotes/git-svn&revision=' + revision
+    parallel_build_broken = True
     def __init__ (self, settings, source):
         target.AutoBuild.__init__ (self, settings, source)
         if (isinstance (source, repository.Repository)
@@ -40,30 +41,21 @@
         except:
             pass
         return '0.0'
-    def force_sequential_build (self):
-        return True
-    
     def _get_build_dependencies (self):
         return ['libjpeg-devel', 'libpng-devel']
-
     def get_subpackage_names (self):
         return ['doc', '']
-    
     def srcdir (self):
         return re.sub ('-source', '',
                        target.AutoBuild.srcdir (self))
-
     def builddir (self):
         return re.sub ('-source', '',
                        target.AutoBuild.builddir (self))
-
     def name (self):
         return 'ghostscript'
-
     # FIXME: C&P.
     def ghostscript_version (self):
         return '.'.join (self.ball_version.split ('.')[0:2])
-
     def autoupdate (self):
         # generate Makefile.in
         self.system ('cd %(srcdir)s && sh ./autogen.sh --help')
@@ -73,7 +65,6 @@
                                    'bjc200', 'cdeskjet', 'faxg3', 'cljet5']))
         self.file_sub ([(disable_re, r'#\1= -DISABLED- \2 ')],
                        '%(srcdir)s/Makefile.in')
-        
     def fixup_arch (self):
         # FIXME: wow, this is broken, cross-compile-wise.  Use a compiled
         # c program to determine the size of basic types *after* an
@@ -369,10 +360,9 @@
         return {'base': 'The GPL Ghostscript PostScript interpreter - transitional package\nThis is an empty package to streamline the upgrade.'}
 
 class Ghostscript__tools (tools.AutoBuild, Ghostscript):
+    parallel_build_broken = True
     def _get_build_dependencies (self):
         return ['libjpeg', 'libpng']
-    def force_sequential_build (self):
-        return True
     def configure_flags (self):
         return (tools.AutoBuild.configure_flags (self)
                 + Ghostscript.configure_flags (self))
@@ -398,6 +388,3 @@
                 + ' docdir=%(prefix_dir)s/share/doc/ghostscript/doc '
                 + ' exdir=%(prefix_dir)s/share/doc/ghostscript/examples '
                 )
-    def wrap_executables (self):
-        # using rpath
-        pass
--- a/gub/specs/git.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/git.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,9 +7,7 @@
         'git-1.5.2-templatedir.patch',
         #'git-1.5-shell-anality.patch'
         ]
-    def configure (self):
-        self.shadow ()
-        target.AutoBuild.configure (self)
+    srcdir_build_broken = True
     def get_subpackage_names (self):
         return ['']
     def _get_build_dependencies (self):
@@ -29,6 +27,7 @@
         
 class Git__mingw (Git):
     patches = []
+    srcdir_build_broken = True
     def __init__ (self, settings, source):
         Git.__init__ (self, settings, source)
         self.target_gcc_flags = ' -mms-bitfields '
@@ -80,9 +79,6 @@
         self.file_sub ([('\t\\$\\(QUIET_SUBDIR0\\)perl[^\n]+\n', ''),
                         ('SCRIPT_PERL = ', 'SCRIPT_PERL_X = ')],
                        '%(srcdir)s/Makefile')
-    def configure (self):
-        self.shadow ()
-        tools.AutoBuild.configure (self)
     def configure_command (self):
         return (tools.AutoBuild.configure_command (self)
                 + ' --without-openssl')
@@ -91,8 +87,3 @@
         if 'freebsd' in self.settings.build_architecture:
             flags += ' CFLAGS="-O2 -Duintmax_t=unsigned -Dstrtoumax=strtoul"'
         return flags
-    def wrap_executables (self):
-        # using rpath
-        # Besides: GIT executables use ancient unix style smart
-        # name-based functionality switching.
-        pass
--- a/gub/specs/glib.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/glib.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,12 +1,12 @@
+from gub import gnome
 from gub import misc
 from gub import tools
 from gub import target
 from gub import w32
 
 class Glib (target.AutoBuild):
-    ## 2.12.4 : see bug  http://bugzilla.gnome.org/show_bug.cgi?id=362918
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.22/2.22.0/sources/glib-2.16.1.tar.bz2'
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.25/2.25.5/sources/glib-2.19.5.tar.gz'
+    #source = 'http://ftp.gnome.org/pub/GNOME/platform/2.25/2.25.5/sources/glib-2.19.5.tar.gz'
+    source = gnome.platform_url ('glib')
     def _get_build_dependencies (self):
         if 'stat' in misc.librestrict ():
             return ['tools::glib', 'gettext-devel', 'libtool']
@@ -38,7 +38,6 @@
                        '%(builddir)s/libtool')
 
 class Glib__darwin__x86 (Glib__darwin):
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.26/2.26.3/sources/glib-2.20.4.tar.gz'
     def compile (self):
         self.file_sub ([('(SUBDIRS = .*) tests', r'\1'),
                         (r'GTESTER = \$.*', ''),
@@ -48,7 +47,6 @@
         Glib__darwin.compile (self)
         
 class Glib__mingw (Glib):
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.26/2.26.3/sources/glib-2.20.4.tar.gz'
     def _get_build_dependencies (self):
         return Glib._get_build_dependencies (self) + ['libiconv-devel']
 
@@ -66,16 +64,10 @@
         # FIXME: should add fixup to update_libtool ()
         return ' G_THREAD_LIBS=-pthread G_THREAD_LIBS_FOR_GTHREAD=-pthread '
 
-class Glib__linux__64 (Glib):
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.26/2.26.3/sources/glib-2.20.4.tar.gz'
-
 class Glib__tools (tools.AutoBuild, Glib):
     def install (self):
         tools.AutoBuild.install (self)
         self.system ('rm -f %(install_root)s%(packaging_suffix_dir)s%(prefix_dir)s/lib/charset.alias')
-    def configure_command (self):
-        return (tools.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''')
     def _get_build_dependencies (self):
         return [
             'gettext',
--- a/gub/specs/glibc.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/glibc.py	Tue Sep 22 20:33:14 2009 +0200
@@ -77,7 +77,7 @@
                 + add_ons)
     def linuxthreads (self):
         return repository.get_repository_proxy (self.settings.downloads,
-                                                self.expand ('ftp://ftp.gnu.org/pub/gnu/glibc/glibc-linuxthreads-%(version)s.tar.bz2&strip_components=0'))
+                                                self.expand ('http://ftp.gnu.org/pub/gnu/glibc/glibc-linuxthreads-%(version)s.tar.bz2&strip_components=0'))
     def download (self):
         target.AutoBuild.download (self)
         if self.version () == '2.3.6':
--- a/gub/specs/gmp.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/gmp.py	Tue Sep 22 20:33:14 2009 +0200
@@ -6,7 +6,7 @@
 from gub import tools
 
 class Gmp (target.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gmp/gmp-4.2.1.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/gmp/gmp-4.2.1.tar.gz'
     def __init__ (self, settings, source):
         target.AutoBuild.__init__ (self, settings, source)
         if not self.settings.platform.startswith ('darwin'):
@@ -43,10 +43,10 @@
                        '%(install_prefix)s/include/gmp.h')
 
 class Gmp__darwin__x86 (Gmp__darwin):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gmp/gmp-4.2.4.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/gmp/gmp-4.2.4.tar.gz'
 
 class Gmp__cygwin (Gmp):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gmp/gmp-4.1.4.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/gmp/gmp-4.1.4.tar.gz'
     patches = ['gmp-4.1.4-1.patch']
 
 class Gmp__mingw (Gmp):
@@ -62,7 +62,7 @@
 ''')
 
 class Gmp__freebsd (Gmp):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gmp/gmp-4.2.4.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/gmp/gmp-4.2.4.tar.gz'
 
 class Gmp__tools (tools.AutoBuild, Gmp):
     def _get_build_dependencies (self):
--- a/gub/specs/grep.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/grep.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,4 +1,4 @@
 from gub import tools
 
 class Grep__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/grep/grep-2.5.4.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/grep/grep-2.5.4.tar.gz'
--- a/gub/specs/gtk+.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/gtk+.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,17 +2,9 @@
 from gub import target
 
 class Gtk_x_ (target.AutoBuild):
-    # crashes inkscape
-    #    source = 'http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.15/gtk+-2.15.2.tar.gz'
-    #source = 'http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.15/gtk+-2.15.0.tar.gz'
-    source = 'http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.15/gtk+-2.15.3.tar.gz'
+    #source = 'http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.15/gtk+-2.15.3.tar.gz'
+    source = gnome.platform ('gtk+')
     patches = ['gtk+-2.15.3-substitute-env.patch']
-    # patches = ['gtk+-2.15.3-configure.in-gio-can-sniff-png.patch']
-    # def config_cache_overrides (self, string):
-    #     return string + '\ngtk_cv_gio_can_sniff_png=yes\n'
-# Requested 'glib-2.0 >= 2.17.6' but version of GLib is 2.16.1
-# FIXME: should bump GNOME deps
-#    source = 'http://ftp.acc.umu.se/pub/GNOME/sources/gtk+/2.14/gtk+-2.14.7.tar.gz'
     def _get_build_dependencies (self):
         return ['libtool',
                 'atk-devel',
@@ -26,13 +18,6 @@
                 #, 'libxinerama-devel',
                 'libxfixes-devel',
                 ]
-    @context.subst_method
-    def LDFLAGS (self):
-        # FIXME: See what happens when using the cross_compiling=yes
-        # UGH. glib-2.0.m4's configure snippet compiles and runs a
-        # program linked against glib; so it needs LD_LIBRARY_PATH (or
-        # a configure-time-only -Wl,-rpath, -Wl,%(system_prefix)s/lib
-        return '-Wl,-rpath -Wl,%(system_prefix)s/lib %(rpath)s'
     def patch (self):
         target.AutoBuild.patch (self)
         self.file_sub ([
@@ -42,19 +27,15 @@
     def configure_command (self):
         return (' export gio_can_sniff=yes; '
                 + target.AutoBuild.configure_command (self)
-                + ''' LDFLAGS='%(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' '''
                 + ' --without-libjasper'
                 + ' --disable-cups')
-    @context.subst_method
-    def gtk_so_extension (self):
-        return '.so' #FIXME!
     def create_config_files (self, prefix='/usr'):
         gtk_module_version = '2.10.0' #FIXME!
         etc = self.expand ('%(install_root)s/%(prefix)s/etc/gtk-2.0', locals ())
         self.dump ('''
 setdir GTK_PREFIX=$INSTALLER_PREFIX
 set GTK_MODULE_VERSION=%(gtk_module_version)s
-set GTK_SO_EXTENSION=%(gtk_so_extension)s
+set GTK_SO_EXTENSION=%(so_extension)s
 ''', '%(install_prefix)s/etc/relocate/gtk+.reloc', env=locals ())
         self.copy ('%(sourcefiledir)s/gdk-pixbuf.loaders', etc)
     def install (self):
@@ -70,53 +51,16 @@
     patches = Gtk_x___freebsd.patches + ['gtk+-2.15.3-configure.in-have-iswalnum.patch']
 
 class Gtk_x_without_X11 (Gtk_x_):
-    #source = 'http://ftp.acc.umu.se/pub/GNOME/sources/gtk+/2.14/gtk+-2.14.7.tar.gz'
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.26/2.26.3/sources/gtk+-2.16.4.tar.gz'
     def _get_build_dependencies (self):
         return [x for x in Gtk_x_._get_build_dependencies (self)
                 if 'libx' not in x]
 
 class Gtk_x___mingw (Gtk_x_without_X11):
-    def LDFLAGS (self):
-        return '-Wl,-rpath -Wl,%(system_prefix)s/lib %(rpath)s'
-    def gtk_so_extension (self):
-        return '.dll' #FIXME!
     def patch (self):
         Gtk_x_.patch (self)
-        ###self.file_sub ([('gailutil.def', '$(srcdir)/gailutil.def')], '%(srcdir)s/modules/other/gail/libgail-util/Makefile.in', must_succeed=True)
-    
-''' 2.15.3 does not build for mingw
-if /bin/bash ../libtool --mode=compile i686-mingw32-gcc -mwindows -mms-bitfields -DHAVE_CONFIG_H -I. -I/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk -I.. -DG_LOG_DOMAIN=\"Gtk\" -DGTK_LIBDIR=\"/usr/lib\" -DGTK_DATADIR=\"/usr/share\" -DGTK_DATA_PREFIX=\"/usr\" -DGTK_SYSCONFDIR=\"/usr/etc\" -DGTK_VERSION=\"2.15.3\" -DGTK_BINARY_VERSION=\"2.10.0\" -DGTK_HOST=\"i686-pc-mingw32\" -DGTK_COMPILATION -DGTK_PRINT_BACKENDS=\"file,lpr\" -DGTK_PRINT_PREVIEW_COMMAND=\""evince --unlink-tempfile --preview --print-settings %s %f"\" -I.. -I../gtk -I/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3 -I../gdk -I/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gdk -I/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gdk-pixbuf -I../gdk-pixbuf -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGTK_FILE_SYSTEM_ENABLE_UNSUPPORTED -DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED -DG_ENABLE_DEBUG -DG_ERRORCHECK_MUTEXES -mms-bitfields -I/home/janneke/vc/gub/target/mingw/root/usr/include/glib-2.0 -I/home/janneke/vc/gub/target/mingw/root/usr/lib/glib-2.0/include -I/home/janneke/vc/gub/target/mingw/root/usr/include/pango-1.0 -I/home/janneke/vc/gub/target/mingw/root/usr/include/cairo -I/home/janneke/vc/gub/target/mingw/root/usr/include/freetype2 -I/home/janneke/vc/gub/target/mingw/root/usr/include -I/home/janneke/vc/gub/target/mingw/root/usr/include/atk-1.0         -DG_DISABLE_SINGLE_INCLUDES -DATK_DISABLE_SINGLE_INCLUDES -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES  -DGDK_PIXBUF_DISABLE_DEPRECATED -g -O2 -g -Wall -mms-bitfields -MT gtkstock.lo -MD -MP -MF ".deps/gtkstock.Tpo" \
-	  -c -o gtkstock.lo `test -f '/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstock.c' || echo '/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/'`/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstock.c; \
-	then mv -f ".deps/gtkstock.Tpo" ".deps/gtkstock.Plo"; \
-	else rm -f ".deps/gtkstock.Tpo"; exit 1; \
-	fi
-/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstatusicon.c: In function 'wndproc':
-/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstatusicon.c:710: error: 'WM_XBUTTONDOWN' undeclared (first use in this function)
-/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstatusicon.c:710: error: (Each undeclared identifier is reported only once
-/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstatusicon.c:710: error: for each function it appears in.)
-/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstatusicon.c:711: error: 'XBUTTON1' undeclared (first use in this function)
-/home/janneke/vc/gub/target/mingw/src/gtk+-2.15.3/gtk/gtkstatusicon.c:736: error: 'WM_XBUTTONUP' undeclared (first use in this function)
-'''
-
-class Gtk_x___linux__64 (Gtk_x_):
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.26/2.26.3/sources/gtk+-2.16.4.tar.gz'
-    def patch (self):
-        Gtk_x_.patch (self)
-        # FIXME: PROMOTEME to target.py? -- yes, but in/after autoupdate stage
-        self.file_sub ([('cross_compiling=(maybe|no)', 'cross_compiling=yes')],
-                       '%(srcdir)s/configure')
-    def configure_command (self):
-        return (Gtk_x_.configure_command (self)
-                + ' --disable-glibtest'
-                + ' --disable-test-print-backend')
 
 class Gtk_x___darwin (Gtk_x_without_X11):
-    def LDFLAGS (self):
-        return ''
     def configure_command (self):
         return (Gtk_x_without_X11.configure_command (self)
-                .replace (''' LDFLAGS='%(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''', '')
                 + ' --with-gdktarget=quartz'
                 )
-                
--- a/gub/specs/guile.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/guile.py	Tue Sep 22 20:33:14 2009 +0200
@@ -61,7 +61,8 @@
 --enable-rpath
 ''')
     def configure_variables (self):
-        return misc.join_lines ('''
+        return (target.AutoBuild.configure_variables (self)
+                + misc.join_lines ('''
 CC_FOR_BUILD="
 C_INCLUDE_PATH=
 CPPFLAGS=
@@ -73,14 +74,11 @@
 -I%(builddir)s/libguile
 -I.
 -I%(srcdir)s/libguile"
-''')
+'''))
     def configure_command (self):
         return ('GUILE_FOR_BUILD=%(tools_prefix)s/bin/guile '
-                + 'LD_LIBRARY_PATH=%(system_prefix)s/lib:${LD_LIBRARY_PATH-/foe} '
                 + target.AutoBuild.configure_command (self)
                 + self.configure_flags ())
-    def makeflags (self):
-        return '''LDFLAGS='%(rpath)s' '''
     def compile_command (self):
         return ('preinstguile=%(tools_prefix)s/bin/guile ' +
                 target.AutoBuild.compile_command (self))
@@ -174,9 +172,6 @@
 
 class Guile__linux (Guile):
     def compile_command (self):
-        # FIXME: when not x-building, guile runs guile without
-        # setting the proper LD_LIBRARY_PATH.
-        # FIXME: try removing this and using cross_compiling=yes fix
         return ('export LD_LIBRARY_PATH=%(builddir)s/libguile/.libs:$LD_LIBRARY_PATH;'
                 + Guile.compile_command (self))
 
@@ -349,6 +344,3 @@
         # Ugh: remove development stuff from tools
         # Make sure no tool GUILE headers can interfere with compile.
         self.system ("rm -rf %(install_root)s%(packaging_suffix_dir)s%(prefix_dir)s/include/ %(install_root)s%(packaging_suffix_dir)s%(prefix_dir)s/bin/guile-config ")
-    def wrap_executables (self):
-        # using rpath
-        pass
--- a/gub/specs/icoutils.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/icoutils.py	Tue Sep 22 20:33:14 2009 +0200
@@ -9,9 +9,7 @@
                 + misc.join_lines ('''
 --with-libintl-prefix=%(system_prefix)s
 --disable-nls
-''')
-                # PROMOTEME: rpath
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' ''')
+'''))
 
 class Icoutils__darwin (tools.AutoBuild):
     def patch (self):
--- a/gub/specs/imagemagick.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/imagemagick.py	Tue Sep 22 20:33:14 2009 +0200
@@ -5,10 +5,8 @@
 
 class ImageMagick__tools (tools.AutoBuild):
     source = 'http://ftp.surfnet.nl/pub/ImageMagick/ImageMagick-6.4.5-4.tar.gz'
-#    source = 'http://ftp.surfnet.nl/pub/ImageMagick/ImageMagick-6.3.7-9.tar.gz'
     def _get_build_dependencies (self):
         return [
-#            'system::g++',
             'automake',
             'bzip2',
             'fontconfig',
@@ -18,8 +16,7 @@
             'libtiff',
             'libxml2',
             'libtool',
-#            'perl-extutils-makemaker',
-            'perl', # extutils-makemaker is now in perl-5.10.0?  Weird.
+            'perl',
             'zlib',
             ]
     def configure_flags (self):
@@ -28,23 +25,8 @@
 --without-magick-plus-plus
 --without-perl
 '''))
-    @context.subst_method
-    def LDFLAGS (self):
-        return '%(rpath)'
-    def configure (self):
-        # do *not* update libtool, GUB's 1.5.x is too old :-(
-        build.AutoBuild.configure (self)
-    def wrap_executables (self):
-        # using rpath
-        pass
 
 class ImageMagick__tools__autoupdate (ImageMagick__tools):
-    def XXforce_autoupdate (self):
-        # this does not work, ImageMagick adds cruft of its own in ./ltdl
-        # and somehow *needs* ./ltdl (1.5.22 will make ./libltdl)
-        return True
-    def XXaclocal_path (self):
-        return ['m4'] + tools.AutoBuild.aclocal_path (self)
     def autoupdate (self):
         self.system ('''
 cd %(autodir)s && libtoolize --copy --force --automake --ltdl
--- a/gub/specs/inkscape.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/inkscape.py	Tue Sep 22 20:33:14 2009 +0200
@@ -50,11 +50,7 @@
     def configure_command (self):
         return (target.AutoBuild.configure_command (self)
                 + ' --enable-lcms'
-#                + ' --disable-poppler-cairo'
                 + ' --enable-binreloc=yes'
-#                + ''' CXXFLAGS='-static-libgcc -lstdc++' '''
-#                + ''' CXXLD='$(CC)' '''
-                + ''' LDFLAGS='%(rpath)s' '''
                 + ' CXXFLAGS=-fpermissive'
                 )
 
@@ -67,21 +63,6 @@
         return (Inkscape.configure_command (self)
                 + ' --disable-poppler-cairo')
 
-''' poppler does not build for mingw
- i686-mingw32-g++ -mwindows -mms-bitfields -DHAVE_CONFIG_H -I. -I/home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/poppler -I.. -I/home/janneke/vc/gub/target/mingw/src/poppler-0.10.3 -I/home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/goo -I/home/janneke/vc/gub/target/mingw/root/usr/include/cairo -I/home/janneke/vc/gub/target/mingw/root/usr/include/libxml2 -I/home/janneke/vc/gub/target/mingw/root/usr/include/freetype2 -I/home/janneke/vc/gub/target/mingw/root/usr/include -Wall -Wno-write-strings -g -O2 -MT SplashOutputDev.lo -MD -MP -MF .deps/SplashOutputDev.Tpo -c /home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/poppler/SplashOutputDev.cc  -DDLL_EXPORT -DPIC -o .libs/SplashOutputDev.o
-In file included from /home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/poppler/GlobalParams.h:35,
-                 from /home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/poppler/SplashOutputDev.cc:37:
-/home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/poppler/poppler-config.h:80:1: warning: "CDECL" redefined
-In file included from /home/janneke/vc/gub/target/mingw/root/usr/include/windows.h:48,
-                 from /home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/goo/gfile.h:37,
-                 from /home/janneke/vc/gub/target/mingw/src/poppler-0.10.3/poppler/SplashOutputDev.cc:36:
-/home/janneke/vc/gub/target/mingw/root/usr/include/windef.h:111:1: warning: this is the location of the previous definition
-/home/janneke/vc/gub/target/mingw/root/usr/include/jmorecfg.h:161: error: conflicting declaration 'typedef long int INT32'
-/home/janneke/vc/gub/target/mingw/root/usr/include/basetsd.h:52: error: 'INT32' has a previous declaration as 'typedef int INT32'
-/home/janneke/vc/gub/target/mingw/root/usr/include/jmorecfg.h:227: error: conflicting declaration 'typedef int boolean'
-/home/janneke/vc/gub/target/mingw/root/usr/include/rpcndr.h:52: error: 'boolean' has a previous declaration as 'typedef unsigned char boolean'
-'''
-
 class Inkscape__freebsd (Inkscape):
     def configure_command (self):
         return (Inkscape.configure_command (self)
--- a/gub/specs/jade.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/jade.py	Tue Sep 22 20:33:14 2009 +0200
@@ -5,6 +5,7 @@
 
 class Jade__tools (tools.AutoBuild):
     source = 'ftp://ftp.jclark.com/pub/jade/jade-1.2.1.tar.gz'
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return ['tools::autoconf', 'tools::libtool']
     def autoupdate (self):
@@ -21,7 +22,6 @@
     def configure_binary (self):
         return '%(builddir)s/configure'
     def configure (self):
-        self.shadow ()
         tools.AutoBuild.configure (self)
         self.system ('cd %(builddir)s; for i in $(ls -1dF * |grep /); do make -C $i -f ../Makefile.lib Makefile.lt; done || :')
     def makeflags (self):
--- a/gub/specs/libgcrypt.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libgcrypt.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,4 +2,4 @@
 
 # hmmrg, no libgcrypt.so in here...
 class Libgcrypt (target.AutoBuild):
-    source = 'ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.9.tar.bz2'
+    source = 'http://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.9.tar.bz2'
--- a/gub/specs/libgphoto2.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libgphoto2.py	Tue Sep 22 20:33:14 2009 +0200
@@ -39,5 +39,5 @@
         return ('PATH=%(srcdir)s:$PATH '
                 + target.AutoBuild.configure_command (self))
     def makeflags (self):
-        return """ libgphoto2_port_la_DEPENDENCIES='$(top_srcdir)/gphoto2/gphoto2-port-version.h $(top_srcdir)/gphoto2/gphoto2-port-library.h $(srcdir)/libgphoto2_port.sym' libgphoto2_la_DEPENDENCIES='$(top_srcdir)/gphoto2/gphoto2-version.h $(srcdir)/libgphoto2.sym' LDFLAGS='%(rpath)s'"""
+        return """ libgphoto2_port_la_DEPENDENCIES='$(top_srcdir)/gphoto2/gphoto2-port-version.h $(top_srcdir)/gphoto2/gphoto2-port-library.h $(srcdir)/libgphoto2_port.sym' libgphoto2_la_DEPENDENCIES='$(top_srcdir)/gphoto2/gphoto2-version.h $(srcdir)/libgphoto2.sym'"""
 
--- a/gub/specs/libiconv.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libiconv.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,15 +1,12 @@
 from gub import target
 
 class Libiconv (target.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.11.tar.gz'
-    def force_sequential_build (self):
-        return True
+    source = 'http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.11.tar.gz'
+    parallel_build_broken = True
     def _get_build_dependencies (self):
         return ['gettext-devel', 'libtool']
     def patch (self):
         target.AutoBuild.patch (self)
-        #self.file_sub ([('	  [*][)]', '	  foobar)')],
-        #               '%(srcdir)s/src/Makefile.in')
         self.file_sub ([('$(DESTDIR)$(libdir)/libiconv.la', '../lib/libiconv.la')], '%(srcdir)s/src/Makefile.in', use_re=False)
     def install (self):
         target.AutoBuild.install (self)
--- a/gub/specs/liblpsolve.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/liblpsolve.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,14 +3,13 @@
 
 class Liblpsolve (target.AutoBuild):
     source = 'http://surfnet.dl.sourceforge.net/lpsolve/lp_solve_5.5.0.13_source.tar.gz'
-    def force_sequential_build (self):
-        return True
+    parallel_build_broken = True
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return ['tools::automake']
     def autoupdate (self):
         # install install-sh
         self.system ('cd %(srcdir)s && automake --add-missing --copy --force --foreign || :')
-        self.shadow ()
     def makeflags (self):
         return misc.join_lines ('''
 AR=%(toolchain_prefix)sar
--- a/gub/specs/libsamplerate.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libsamplerate.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,15 +4,3 @@
     source = 'http://www.mega-nerd.com/SRC/libsamplerate-0.1.7.tar.gz'
     def _get_build_dependencies (self):
         return ['tools::automake', 'tools::pkg-config',]
-
-class Libsamplerate__darwin__x86 (Libsamplerate):
-    # FIXME: PROMOTEME to build.py/target.py [or for darwin_x86 only?]
-    def patch (self):
-        Libsamplerate.patch (self)
-        # somehow retriggers autoconf?!?
-#        for i in ('configure.ac', 'configure'):
-        for i in ['configure']:
-            self.file_sub ([('-fpascal-strings ', ''),
-                            ('-I(/Developer/Headers/FlatCarbon)',
-                             r'-I%(system_root)s\1'),
-                            ], '%(srcdir)s/' + i)
--- a/gub/specs/libsndfile.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libsndfile.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,15 +4,3 @@
     source = 'http://www.mega-nerd.com/libsndfile/libsndfile-1.0.20.tar.gz'
     def _get_build_dependencies (self):
         return ['tools::automake', 'tools::pkg-config', 'libtool']
-
-class Libsndfile__darwin__x86 (Libsndfile):
-    # FIXME: PROMOTEME to build.py/target.py [or for darwin_x86 only?]
-    def patch (self):
-        Libsndfile.patch (self)
-        # somehow retriggers autoconf?!?
-#        for i in ('configure.ac', 'configure'):
-        for i in ['configure']:
-            self.file_sub ([('-fpascal-strings ', ''),
-                            ('-I(/Developer/Headers/FlatCarbon)',
-                             r'-I%(system_root)s\1'),
-                            ], '%(srcdir)s/' + i)
--- a/gub/specs/libt1.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libt1.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,23 +3,19 @@
 
 class Libt1 (target.AutoBuild):
     source = 'ftp://sunsite.unc.edu/pub/Linux/libs/graphics/t1lib-5.1.2.tar.gz'
+    parallel_build_broken = True
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return [
             'tools::libtool',
             ]
-    def force_sequential_build (self):
-        return True
-    def configure (self):
-        self.shadow ()
-        tools.AutoBuild.configure (self)
     def makeflags (self):
         return ''' without_doc 'VPATH:=$(srcdir)' '''
 
 class Libt1__tools (tools.AutoBuild, Libt1):
+    parallel_build_broken = True
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return [
             'libtool',
             ]
-    def configure (self):
-        self.shadow ()
-        tools.AutoBuild.configure (self)
--- a/gub/specs/libtool.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libtool.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,7 +7,7 @@
 from gub import tools
 
 class Libtool (target.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/libtool/libtool-2.2.6a.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/libtool/libtool-2.2.6a.tar.gz'
     #source = 'git://git.sv.gnu.org/libtool.git?branch=master&revision=77e114998457cb6170ad84b360cb5b9be90f2191'
     def __init__ (self, settings, source):
         target.AutoBuild.__init__ (self, settings, source)
@@ -90,8 +90,7 @@
     def __init__ (self, settings, source):
         tools.AutoBuild.__init__ (self, settings, source)
         Libtool.set_sover (self)
-    def update_libtool (self):
-        pass
+    update_libtool = tools.AutoBuild.nop
     def install (self):
         tools.AutoBuild.install (self)
         # FIXME: urg.  Are we doing something wrong?  Why does libtool
@@ -99,7 +98,3 @@
         self.file_sub ([(' (/usr/lib/*[" ])', r' %(system_prefix)s/lib \1'),
                         ('((-L| )/usr/lib/../lib/* )', r'\2%(system_prefix)s/lib \1')],
                        '%(install_prefix)s/bin/libtool')
-    def wrap_executables (self):
-        # The libtool script calls the cross compilers, and moreover,
-        # it is copied.  Two reasons why it cannot be wrapped.
-        pass
--- a/gub/specs/libxcb.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libxcb.py	Tue Sep 22 20:33:14 2009 +0200
@@ -21,16 +21,10 @@
 
 class Libxcb__freebsd (Libxcb):
     patches = Libxcb.patches + ['libxcb-0.9.93-freebsd.patch']
-    def force_sequential_build (self):
-        return True
+    parallel_build_broken = True
     def configure_command (self):
         return (Libxcb.configure_command (self)
                 + ' LDFLAGS=-pthread')
-#    def install (self):
-#        Libxcb.install (self)
-# FIXME: why doesn't libtool pick this up?
-#        self.file_sub ([("""(dependency_libs=.*)'""", r"""\1 -pthread '""")],
-#                       '%(install_prefix)s/lib/libxcb-xlib.la')
 
 class Libxcb__mingw (Libxcb):
     patches = []
--- a/gub/specs/libxml2.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/libxml2.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,10 +1,11 @@
 from gub import context
+from gub import gnome
 from gub import misc
 from gub import target
 from gub import tools
 
 class Libxml2 (target.AutoBuild):
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.18/2.18.1/sources/libxml2-2.6.27.tar.gz'
+    source = gnome.platform_url ('libxml2', '2.18.1')
     def _get_build_dependencies (self):
         return ['zlib']
     def configure_command (self):
--- a/gub/specs/lilypond.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/lilypond.py	Tue Sep 22 20:33:14 2009 +0200
@@ -10,6 +10,7 @@
 class LilyPond (target.AutoBuild):
     source = 'git://git.sv.gnu.org/lilypond.git'
     branch = 'master'
+    parallel_build_broken = True
 
     '''A program for printing sheet music
     LilyPond lets you create music notation.  It produces
@@ -417,33 +418,6 @@
 MALLOC_CHECK_=2
 LD_LIBRARY_PATH=%(tools_prefix)s/lib:%(system_prefix)s/lib:${LD_LIBRARY_PATH-/foe}
 ''')
-    def force_sequential_build (self):
-        '''
-Writing snippets...
-All snippets are up to date...lilypond-book.py (GNU LilyPond) 2.12.3
-Traceback (most recent call last):
-  File "/home/janneke/vc/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypo
-nd.git-master/scripts/lilypond-book.py", line 2107, in ?
-    main ()
-  File "/home/janneke/vc/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypo
-nd.git-master/scripts/lilypond-book.py", line 2089, in main
-    chunks = do_file (files[0])
-  File "/home/janneke/vc/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypo
-nd.git-master/scripts/lilypond-book.py", line 1993, in do_file
-    do_process_cmd (chunks, input_fullname, global_options)
-  File "/home/janneke/vc/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypo
-nd.git-master/scripts/lilypond-book.py", line 1844, in do_process_cmd
-    options.output_dir)
-  File "/home/janneke/vc/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypo
-nd.git-master/scripts/lilypond-book.py", line 1278, in link_all_output_files
-    os.makedirs (dst_path)
-  File "/home/janneke/vc/gub/target/tools/root/usr/lib/python2.4/os.py", line 15
-9, in makedirs
-    mkdir(name, mode)
-OSError: [Errno 17] File exists: '/home/janneke/vc/gub/target/linux-64/build/lil
-ypond-git.sv.gnu.org--lilypond.git-master/Documentation/user/out/6a'
-'''
-        return True
     def compile_command (self):
         return ('%(doc_limits)s '
                 '&& %(doc_relocation)s '
@@ -465,3 +439,9 @@
 Lilypond__freebsd = LilyPond__freebsd
 Lilypond__mingw = LilyPond__mingw
 Lilypond__mipsel = LilyPond__debian
+
+VERSION='v2.13'
+def url (version=VERSION):
+    url = 'http://lilypond.org/download/source/%(version)s/' % locals ()
+    raw_version_file = 'downloads/lilypond-%(version)s.index' % locals ()
+    return misc.latest_url (url, 'lilypond', raw_version_file)
--- a/gub/specs/lilypondcairo.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/lilypondcairo.py	Tue Sep 22 20:33:14 2009 +0200
@@ -6,7 +6,7 @@
 # in.  Hmm.
 
 class Lilypondcairo (lilypond.Lilypond):
-    source = 'http://lilypond.org/download/source/v2.13/lilypond-2.13.3.tar.gz'
+    source = lilypond.url ()
     def _get_build_dependencies (self):
         return [x.replace ('pango', 'pangocairo')
                 for x in lilypond.Lilypond._get_build_dependencies (self)]
--- a/gub/specs/linux-arm-softfloat/cross/gcc-core.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/linux-arm-softfloat/cross/gcc-core.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,7 +2,7 @@
 gcc = misc.load_spec ('cross/gcc-core')
 
 class Gcc_core (gcc.Gcc_core):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2'
     def patch (self):
         gcc.Gcc_core.patch (self)
         self.system ('''
--- a/gub/specs/linux-arm-softfloat/cross/gcc.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/linux-arm-softfloat/cross/gcc.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,7 +3,7 @@
 from gub import misc
 
 class Gcc (cross_gcc.Gcc_from_source):
-    source = 'ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2'
+    source = 'http://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2'
     def patch (self):
         cross_gcc.Gcc_from_source.patch (self)
         self.system ('''
--- a/gub/specs/m4.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/m4.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,12 +2,9 @@
 from gub import tools
 
 class M4__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/m4/m4-1.4.12.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/m4/m4-1.4.12.tar.gz'
     def config_cache_settings (self):
         return self.config_cache_overrides ('')
     def config_cache_overrides (self, string):
         # avoid using stray libsigsegv
         return string + '\ngl_cv_lib_sigsegv=${gl_cv_lib_sigsegv=no}\n'
-    def wrap_executables (self):
-        # no dynamic executables [other than /lib:libc]
-        pass
--- a/gub/specs/make.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/make.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,7 +4,7 @@
 if 'BOOTSTRAP' in os.environ.keys (): from gub import target as tools
 
 class Make_make__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/make/make-3.81.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/make/make-3.81.tar.gz'
     def __init__ (self, settings, source):
         tools.AutoBuild.__init__ (self, settings, source)
         self.source._unpack = self.source._unpack_promise_well_behaved
@@ -18,9 +18,6 @@
     def _get_build_dependencies (self):
         #return [self.librestrict_name ()]
         return ['librestrict']
-    def wrap_executables (self):
-        # no dynamic executables [other than /lib:libc]
-        pass
 
 class Make_build_sh__tools (Make_make__tools):
     def compile_command (self):
--- a/gub/specs/ncurses.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/ncurses.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,7 +2,7 @@
 from gub import tools
 
 class Ncurses (target.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.5.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.5.tar.gz'
     patches = ['ncurses-5.5-mkhashsize.sh.patch']
     def _get_build_dependencies (self):
         return [
--- a/gub/specs/netpbm.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/netpbm.py	Tue Sep 22 20:33:14 2009 +0200
@@ -5,14 +5,13 @@
     # source='svn:https://svn.sourceforge.net/svnroot/netpbm/stable&revision=172'
     source='http://lilypond.org/download/gub-sources/netpbm-patched-10.35.tar.bz2'
     patches = ['netpbm-10.35-glibc-2.10.1-name-conflict.patch']
+    parallel_build_broken = True
     def _get_build_dependencies (self):
         return ['flex', 'libjpeg', 'libpng', 'libtiff', 'zlib'] #libxml2? libx11-dev
     def configure (self):
         self.shadow ()
         self.dump ('\n'*3 + 'static\n' + '\n'*18, '%(builddir)s/answers')
-        self.system ('cd %(builddir)s && %(srcdir)s/configure < answers')
-    def force_sequential_build (self):
-        return True
+        self.system ('cd %(builddir)s && sh %(srcdir)s/configure < answers')
     def makeflags (self):
         '''
 libpbm3.c:116: note: use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts
--- a/gub/specs/openoffice.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/openoffice.py	Tue Sep 22 20:33:14 2009 +0200
@@ -801,10 +801,6 @@
                     ('(LD_LIBRARY_PATH=.*)', self.expand (r'\1:%(system_prefix)s/lib'))
                     ], file)
         self.map_locate (add_CFLAGS_LDFLAGS_already, '%(builddir)s', '*Env.Set.sh')
-    def wrap_executables (self):
-        # using rpath, and also openoffice has data files in bin/,
-        # such as types.rdb.
-        pass
 
 Openoffice = OpenOffice
 Openoffice__mingw = OpenOffice__mingw
--- a/gub/specs/pango.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/pango.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,5 +1,6 @@
 import re
 #
+from gub import gnome
 from gub import misc
 from gub import loggedos
 from gub import target
@@ -12,7 +13,7 @@
     ]
 
 class Pango (target.AutoBuild):
-    source = 'http://ftp.gnome.org/pub/GNOME/sources/pango/1.24/pango-1.24.2.tar.bz2'
+    source = gnome.platform_url ('pango')
     patches = ['pango-1.20-substitute-env.patch']
     def _get_build_dependencies (self):
         return [
@@ -90,7 +91,7 @@
     def install (self):
         Pango.install (self)                
         self.dump ('''
-set PANGO_SO_EXTENSION=.so
+set PANGO_SO_EXTENSION=%(so_extension)s
 ''', '%(install_prefix)s/etc/relocate/pango.reloc', env=locals (), mode='a')
 
 class Pango__mingw (Pango):
--- a/gub/specs/pangocairo.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/pangocairo.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,8 +1,8 @@
+from gub import gnome
 from gub.specs import pango
 
 class Pangocairo (pango.Pango):
-    #source = 'http://ftp.acc.umu.se/pub/GNOME/platform/2.25/2.25.5/sources/pango-1.22.4.tar.gz'
-    source = 'http://ftp.gnome.org/pub/GNOME/platform/2.26/2.26.3/sources/pango-1.24.4.tar.gz'
+    source = gnome.platform_url ('pango')
     def _get_build_dependencies (self):
         return pango.Pango._get_build_dependencies (self) + ['cairo-devel']
     def get_conflict_dict (self):
--- a/gub/specs/patch.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/patch.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,7 +1,7 @@
 from gub import tools
 
 class Patch__tools (tools.AutoBuild):
-#    source = 'ftp://ftp.gnu.org/pub/gnu/patch/patch-2.5.4.tar.gz'
+#    source = 'http://ftp.gnu.org/pub/gnu/patch/patch-2.5.4.tar.gz'
 #    source = 'ftp://alpha.gnu.org/pub/gnu/diffutils/patch-2.5.9.tar.gz'
 # ugh, openoffice the ooo-build flavour needs the latest patch with
 # additional [SUSE] patches to not barf on all CRLF problems.
@@ -16,6 +16,3 @@
                            '%(builddir)s/config.h')
     def install_command (self):
         return self.broken_install_command ()
-    def wrap_executables (self):
-        # no dynamic executables [other than /lib:libc]
-        pass
--- a/gub/specs/perl.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/perl.py	Tue Sep 22 20:33:14 2009 +0200
@@ -9,6 +9,7 @@
 # So why doesn't anyone fix configuring/compiling it?  Shees.
 class Perl__tools (tools.AutoBuild):
     source = 'http://www.cpan.org/src/perl-5.10.0.tar.gz'
+    srcdir_build_broken = True
     def patch (self):
         tools.AutoBuild.patch (self)
         self.file_sub ([('-c (/dev/null)', r'-e \1')], '%(srcdir)s/Configure')
@@ -45,7 +46,6 @@
  -Aldflags='%(rpath)s -lm -lrt -ldl'
 ''')
     def configure (self):
-        self.shadow ()
         tools.AutoBuild.configure (self)
         for i in ['%(builddir)s/makefile', '%(builddir)s/x2p/makefile']:
             # Ugh, missing some command?
--- a/gub/specs/pic.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/pic.py	Tue Sep 22 20:33:14 2009 +0200
@@ -9,9 +9,6 @@
 class Pic (target.AutoBuild):
     def get_subpackage_names (self):
         return ['']
-    def force_sequential_build (self):
-        ## upnpAllegro is broken
-        return True
     def get_build_dependencies (self): #debian
         neon_debian = ['comerr-dev',
                        'libcomerr2',
--- a/gub/specs/pjproject.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/pjproject.py	Tue Sep 22 20:33:14 2009 +0200
@@ -2,16 +2,13 @@
 
 class Pjproject (target.AutoBuild):
     source = 'http://www.pjsip.org/release/0.5.10.1/pjproject-0.5.10.1.tar.gz'
-    def force_sequential_build (self):
-        return True
+    parallel_build_broken = True
+    srcdir_build_broken = True
     def patch (self):
         self.system ('cd %(srcdir)s && patch -p0 < %(patchdir)s/pjproject-install.patch')
     def configure_command (self):
         return (target.AutoBuild.configure_command (self).replace ('%(srcdir)s/configure', './aconfigure')
                 + ' --disable-sound')
-    def configure (self):
-        self.shadow ()
-        target.AutoBuild.configure (self)
     def install_command (self):
         return (target.AutoBuild.install_command (self)
                 + ' prefix=%(prefix_dir)s')
--- a/gub/specs/python.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/python.py	Tue Sep 22 20:33:14 2009 +0200
@@ -46,17 +46,14 @@
         target.AutoBuild.patch (self)
         self.file_sub ([('@CC@', '@CC@ -I$(shell pwd)')],
                         '%(srcdir)s/Makefile.pre.in')
-
     def force_autoupdate (self):
         return True
-
     def autoupdate (self):
         target.AutoBuild.autoupdate (self)
-        # FIXME: PROMOTEME to target.py?
+        # FIXME: REMOVEME/PROMOTEME to target.py?
         if self.settings.build_platform == self.settings.target_platform:
-            self.file_sub ([('cross_compiling=(maybe|yes)', 'cross_compiling=no')],
-                           '%(srcdir)s/configure')
-
+            self.file_sub ([('cross_compiling=(maybe|no|yes)',
+                             'cross_compiling=no')], '%(srcdir)s/configure')
     def makeflags (self):
        return misc.join_lines (r'''
 BLDLIBRARY='%(rpath)s -L. -lpython$(VERSION)'
@@ -67,15 +64,12 @@
             relax = 'LIBRESTRICT_ALLOW=/usr/lib/python2.4/lib-dynload:${LIBRESTRICT_ALLOW-/foo} '
         return (relax
                 + target.AutoBuild.install_command (self))
-    @context.subst_method
-    def SO_EXTENSION (self):
-        return '.so' #FIXME!
     def install (self):
         target.AutoBuild.install (self)
         misc.dump_python_config (self)
         def assert_fine (logger):
             dynload_dir = self.expand ('%(install_prefix)s/lib/python%(python_version)s/lib-dynload')
-            so = self.SO_EXTENSION ()
+            so = self.expand ('%(so_extension)s')
             all = [x.replace (dynload_dir + '/', '') for x in misc.find_files (dynload_dir, '.*' + so)]
             failed = [x.replace (dynload_dir + '/', '') for x in misc.find_files (dynload_dir, '.*failed' + so)]
             if failed:
@@ -142,9 +136,6 @@
 ac_cv_sizeof_pthread_t=12
 ''')
 ##$(eval echo $((echo $ac_cv_sizeof_int + $ac_cv_sizeof_void_p)))
-    @context.subst_method
-    def SO_EXTENSION (self):
-        return '.dll' #FIXME!
     def install (self):
         Python.install (self)
         self.file_sub ([('extra = ""', 'extra = "-L%(system_prefix)s/bin -L%(system_prefix)s/lib -lpython2.4 -lpthread"')],
@@ -181,9 +172,6 @@
             relax = 'LIBRESTRICT_ALLOW=/usr/lib/python2.4/lib-dynload:${LIBRESTRICT_ALLOW-/foo} '
         return (relax
                 + tools.AutoBuild.install_command (self))
-    def wrap_executables (self):
-        # using rpath
-        pass
     def patch (self):
         tools.AutoBuild.patch (self)
         Python.patch (self)
--- a/gub/specs/sed.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/sed.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,4 +3,4 @@
 if 'BOOTSTRAP' in os.environ.keys (): from gub import target as tools
 
 class Sed__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/sed/sed-4.1.5.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/sed/sed-4.1.5.tar.gz'
--- a/gub/specs/tar.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/tar.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,10 +3,7 @@
 if 'BOOTSTRAP' in os.environ.keys (): from gub import target as tools
 
 class Tar__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/tar/tar-1.20.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/tar/tar-1.20.tar.gz'
     def __init__ (self, settings, source):
         tools.AutoBuild.__init__ (self, settings, source)
         self.source._unpack = self.source._unpack_promise_well_behaved
-    def wrap_executables (self):
-        # no dynamic executables [other than /lib:libc]
-        pass
--- a/gub/specs/tcltk.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/tcltk.py	Tue Sep 22 20:33:14 2009 +0200
@@ -3,10 +3,9 @@
  
 class Tcltk (target.AutoBuild):
     source = 'http://lilypond.org/download/gub-sources/tcltk-8.4.14.tar.gz'
+    parallel_build_broken = True
     def license_files (self):
         return ['%(srcdir)s/tcl/license.terms']
-    def force_sequential_build (self):
-        return True
     def configure (self):
         self.system ('''cd %(srcdir)s/tcl &&  ./unix/configure --prefix=%(install_prefix)s
 cd %(srcdir)s/tk/ && ./unix/configure --prefix=%(install_prefix)s
--- a/gub/specs/texinfo.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/texinfo.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,7 +1,7 @@
 from gub import tools
 
 class Texinfo__tools (tools.AutoBuild):
-    source = 'ftp://ftp.gnu.org/pub/gnu/texinfo/texinfo-4.13a.tar.gz'
+    source = 'http://ftp.gnu.org/pub/gnu/texinfo/texinfo-4.13a.tar.gz'
     def patch (self):
         tools.AutoBuild.patch (self)
         # Drop ncurses dependency
--- a/gub/specs/texlive.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/texlive.py	Tue Sep 22 20:33:14 2009 +0200
@@ -90,7 +90,7 @@
         # ugh.
         if self.source.have_client ():
             loggedos.download_url (logging.default_logger,
-                                   license_url,  self.source._checkout_dir ())
+                                   license_url, self.source._checkout_dir ())
     def untar (self):
         target.AutoBuild.untar (self)
         def defer (logger):
@@ -269,9 +269,6 @@
             't1utils',
             'zlib',
             ]
-    @context.subst_method
-    def LDFLAGS (self):
-        return '%(rpath)'
     def configure_command (self):
         SHELL = ' SHELL=/bin/bash'
         if 'stat' in misc.librestrict ():
@@ -282,7 +279,6 @@
                 + misc.join_lines ('''
 --without-x
 ''')
-                + ''' LDFLAGS='-L%(system_prefix)s/lib %(rpath)s -Wl,-rpath -Wl,%(system_prefix)s/lib' '''
                 + SHELL)
     def install (self):
         tools.AutoBuild.install (self)
--- a/gub/specs/xerces-c.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/xerces-c.py	Tue Sep 22 20:33:14 2009 +0200
@@ -4,6 +4,7 @@
 
 class Xerces_c (target.AutoBuild):
     source = 'http://www.apache.org/dist/xerces/c/2/sources/xerces-c-src_2_8_0.tar.gz'
+    parallel_build_broken = True
     def _get_build_dependencies (self):
         return ['tools::autoconf']
     def __init__ (self, settings, source):
@@ -21,8 +22,6 @@
             'CXXFLAGS': ' -DPROJ_XMLPARSER -DPROJ_XMLUTIL -DPROJ_PARSERS -DPROJ_SAX4C -DPROJ_SAX2 -DPROJ_DOM -DPROJ_DEPRECATED_DOM -DPROJ_VALIDATORS -DXML_USE_NATIVE_TRANSCODER -DXML_USE_INMEM_MESSAGELOADER -DXML_USE_PTHREADS -DXML_USE_NETACCESSOR_SOCKET ',
             }
         build.change_dict (self, self.compile_dict)
-    def force_sequential_build (self):
-        return True
     def autodir (self):
         return '%(srcdir)s/src/xercesc'
     def configure_command (self):
--- a/gub/specs/zlib.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/specs/zlib.py	Tue Sep 22 20:33:14 2009 +0200
@@ -7,11 +7,9 @@
 class Zlib (target.AutoBuild):
     source = 'http://heanet.dl.sourceforge.net/sourceforge/libpng/zlib-1.2.3.tar.gz'
     patches = ['zlib-1.2.3.patch']
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return ['tools::autoconf']
-    def configure (self):
-        self.shadow ()
-        target.AutoBuild.configure (self)
     def compile_command (self):
         return target.AutoBuild.compile_command (self) + ' ARFLAGS=r '
     def configure_command (self):
@@ -63,14 +61,9 @@
 '''
 
 class Zlib__tools (tools.AutoBuild, Zlib):
-# FIXME: tools not the same as target: asking for trouble
-#    source = 'http://heanet.dl.sourceforge.net/sourceforge/libpng/zlib-1.2.3.3.tar.gz'
-# FIXME: where lives 1.2.3.3 with gzopen64?
+    srcdir_build_broken = True
     def _get_build_dependencies (self):
         return ['autoconf']
-    def configure (self):
-        self.shadow ()
-        tools.AutoBuild.configure (self)
     def install_command (self):
         return tools.AutoBuild.broken_install_command (self)
     def configure_command (self):
--- a/gub/target.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/target.py	Tue Sep 22 20:33:14 2009 +0200
@@ -10,16 +10,19 @@
 class AutoBuild (build.AutoBuild):
     def __init__ (self, settings, source):
         build.AutoBuild.__init__ (self, settings, source)
-
     @context.subst_method
     def configure_command_native (self):
         return build.AutoBuild.configure_command (self)
-
-    def configure_command (self):
-        SHELL = ''
-        if 'stat' in misc.librestrict ():
-            SHELL = ' SHELL=%(tools_prefix)s/bin/sh'
-        return (misc.join_lines ('''%(configure_binary)s
+    @context.subst_method
+    def LD_PRELOAD (self):
+        return '%(tools_prefix)s/lib/librestrict.so'
+    def autoupdate (self):
+        build.AutoBuild.autoupdate (self)
+        self.file_sub ([('cross_compiling=(maybe|no|yes)',
+                         'cross_compiling=yes')], '%(configure_binary)s')
+    def configure_flags (self):
+        return (build.AutoBuild.configure_flags (self)
+                + misc.join_lines ('''
 --config-cache
 --enable-shared
 --disable-static
@@ -33,9 +36,12 @@
 --infodir=%(prefix_dir)s/share/info
 --mandir=%(prefix_dir)s/share/man
 --libdir=%(prefix_dir)s/lib
-''')
-# --with-slibdir=%(prefix)s/slib
-                + SHELL)
+'''))
+    def configure_variables (self):
+        if 'stat' in misc.librestrict ():
+            return (build.AutoBuild.configure_variables (self)
+                    + ' SHELL=%(tools_prefix)s/bin/sh')
+        return build.AutoBuild.configure_variables (self)
 
     def configure (self):
         build.AutoBuild.configure (self)
@@ -63,7 +69,7 @@
                         ('^includedir=/usr/include/*\s*$', 'includedir=%(system_prefix)s/include'),
                         ('^libdir=/usr/lib/*\s*$', 'libdir=%(system_prefix)s/lib'),],
                        '%(install_prefix)s%(cross_dir)s/bin/%(config_script)s',
-                       must_succeed=1)
+                       must_succeed=self.settings.target_platform != 'tools')
 
     def pre_install_libtool_fixup (self):
         ## Workaround for libtool bug.  libtool inserts -L/usr/lib
@@ -94,18 +100,11 @@
 
     @context.subst_method
     def compile_command_native (self):
-        return 'make %(makeflags_native)s '
+        return 'make %(job_spec)s %(makeflags_native)s '
 
     @context.subst_method
     def makeflags_native (self):
         return ''
-
-    def compile_command (self):
-        c = build.AutoBuild.compile_command (self)
-        if (not self.force_sequential_build () and self.settings.cpu_count_str):
-            c = re.sub (r'\bmake\b',
-                        'make -j%s '% self.settings.cpu_count_str, c)
-        return c
             
     def get_substitution_dict_native (self):
         return build.AutoBuild.get_substitution_dict
--- a/gub/tools.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/tools.py	Tue Sep 22 20:33:14 2009 +0200
@@ -59,47 +59,30 @@
 #AutoBuild = target.AutoBuild
 
 class AutoBuild (build.AutoBuild):
-    def configure_command (self):
-        return (build.AutoBuild.configure_command (self)
-                + self.configure_flags ()
-                + self.configure_variables ())
-    @context.subst_method
     def configure_prefix (self):
         if 'BOOTSTRAP' in os.environ.keys ():
             return '%(prefix_dir)s'
         return '%(system_prefix)s'
-    def LD_PRELOAD (self):
-        # Makes no sense for tools.  Be it /usr/bin/gcc or tools::gcc,
-        # it needs to read /usr/include/stdlib.h etc.  How to, or why
-        # restrict reading other files from /?
-        # See LIBRESTRICT_IGNORE below, it would need to include every
-        # binary in system_prefix :-)
-        return ''
-    # FIXME: promoteme to build.py?  Most Fragile operation...
     def configure_flags (self):
         config_cache = ''
         if self.config_cache_settings ():
-            config_cache = '\n--config-cache'
-        return misc.join_lines ('''
---prefix=%(configure_prefix)s
+            config_cache = ' --config-cache'
+        return (build.AutoBuild.configure_flags (self)
+                + misc.join_lines ('''
 --enable-shared
 --enable-static
 --disable-silent-rules
-''' + config_cache)
-    # FIXME: promoteme to build.py?  Most Fragile operation...
-    # BOOTSTRAP -- do we need this?
-    # LDFLAGS='-L%(system_prefix)s/lib -Wl,--as-needed'
+''')
+                + config_cache)
     def configure_variables (self):
-        return misc.join_lines ('''
+       return (build.AutoBuild.configure_variables (self)
+               + misc.join_lines ('''
 CFLAGS=-I%(system_prefix)s/include
-LDFLAGS=-L%(system_prefix)s/lib
-''')
-
+LDFLAGS='-L%(system_prefix)s/lib %(rpath)s %(libs)s'
+'''))
     ## ugh: prefix= will trigger libtool relinks.
     def install_command (self):
         return '''make %(makeflags)s DESTDIR=%(install_root)s install'''
-# Hmm, weird, this breaks?
-#        return self.compile_command () + ' DESTDIR=%(install_root)s install '
 
     def broken_install_command (self):
         # FIXME: use sysconfdir=%(install_PREFIX)s/etc?  If
@@ -119,11 +102,10 @@
 sysconfdir=%(install_prefix)s/etc
 tooldir=%(install_prefix)s
 ''')
-
-    def install (self):
-        build.AutoBuild.install (self)
-        # conditional on use of rpath, depending on shared libs?
-        if 0:
+    def post_install (self):
+        build.AutoBuild.post_install (self)
+        if not self.expand ('rpath'):
+            # and not if no shared libs?
             self.wrap_executables ()
 
     @context.subst_method
--- a/gub/w32.py	Tue Sep 22 11:09:24 2009 +0200
+++ b/gub/w32.py	Tue Sep 22 20:33:14 2009 +0200
@@ -1,4 +1,5 @@
 from gub import build
+from gub import context
 from gub import cross
 from gub import loggedos
 from gub import misc
@@ -21,6 +22,11 @@
         package.post_install_smurf_exe ()
     package.install = misc.MethodOverrider (package.install, install)
 
+    @context.subst_method
+    def so_extension (foo):
+        return '.dll'
+    package.so_extension = misc.MethodOverrider (package.nop, so_extension)
+
     # FIXME (cygwin): [why] do cross packages get here too?
     if isinstance (package, cross.AutoBuild):
         return