diff gub/specs/guile-2.0.py @ 6512:ccc20ae889ca default tip guix

mingw::guile-2.0.7 builds.
author Jan Nieuwenhuizen <janneke@gnu.org>
date Thu, 24 Mar 2016 08:03:39 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gub/specs/guile-2.0.py	Thu Mar 24 08:03:39 2016 +0100
@@ -0,0 +1,323 @@
+import os
+#
+from gub import context
+from gub import misc
+from gub import loggedos
+from gub import octal
+from gub import repository
+from gub import target
+from gub import tools
+from gub import tools32
+
+class Guile (target.AutoBuild):
+    # source = 'git://git.sv.gnu.org/guile.git&branch=branch_release-1-8&revision=bba579611b3671c7e4c1515b100f01c048a07935'
+    source = 'http://ftp.gnu.org/gnu/guile/guile-2.0.0.1.tar.gz'
+    patches = [
+        'guile-1.9.14-reloc.patch',
+        'guile-1.8.6-test-use-srfi.patch',
+        'guile-2.0.0-configure-cross.patch',
+        'guile-2.0.0.1-cross.patch',
+        'guile-1.9.14-gnulib-libunistring.patch',
+        'guile-2.0.0.1-compile-mkdir.patch',
+        ]
+    force_autoupdate = True
+    dependencies = [
+        'gettext-devel',
+        'gmp-devel',
+        'libtool',
+        'libffi',
+        'libunistring',
+        'libgc',
+        'tools::guile',
+        'tools::gnulib',
+        'tools::pkg-config',
+        ]
+    guile_configure_flags = misc.join_lines ('''
+--without-threads
+--with-gnu-ld
+--enable-deprecated
+--enable-discouraged
+--disable-error-on-warning
+--enable-relocation
+--enable-rpath
+--with-pic
+''')
+    configure_variables = (target.AutoBuild.configure_variables
+                           + misc.join_lines ('''
+CC_FOR_BUILD="
+LD_PRELOAD=
+C_INCLUDE_PATH=
+CPPFLAGS=
+LIBRARY_PATH=
+PATH_SEPARATOR=':'
+PATH=/usr/bin:$PATH
+/usr/bin/cc
+-I%(builddir)s
+-I%(srcdir)s
+-I%(builddir)s/libguile
+-I.
+-I%(srcdir)s/libguile"
+'''))
+    config_cache_overrides = target.AutoBuild.config_cache_overrides + '''
+gl_cv_func_svid_putenv=yes
+'''
+    # FIXME: guile runs gen_scmconfig [when not x-building also guile]
+    # without setting the proper LD_LIBRARY_PATH.
+    compile_flags_native = (' LD_PRELOAD= '
+                            + ' LD_LIBRARY_PATH=%(tools_prefix)s/lib:${LD_LIBRARY_PATH-/foe} '
+                            + ' CFLAGS="-I%(srcdir)s -I%(builddir)s -DHAVE_CONFIG_H=1"'
+                            + ' LIBFFI_CFLAGS='
+                            + ' LDFLAGS='
+                            + ' cross_compiling=yes ')
+    # FIXME: guile runs gen_scmconfig [when not x-building also guile]
+    # without setting the proper LD_LIBRARY_PATH.
+    configure_command = ('GUILE_FOR_BUILD=%(tools_archmatch_prefix)s/bin/guile '
+                         + target.AutoBuild.configure_command
+                         + guile_configure_flags)
+    compile_command = ('export preinstguile=%(tools_archmatch_prefix)s/bin/guile; '
+                       + target.AutoBuild.compile_command)
+    install_command = ('export preinstguile=%(tools_archmatch_prefix)s/bin/guile; '
+                       + target.AutoBuild.install_command)
+    subpackage_names = ['doc', 'devel', 'runtime', '']
+    @staticmethod
+    def version_from_VERSION (self):
+        return self.version_from_shell_script ('GUILE-VERSION',
+                                               'GUILE_MAJOR_VERSION',
+                                               '%(GUILE_MAJOR_VERSION)s.%(GUILE_MINOR_VERSION)s.%(GUILE_MICRO_VERSION)s',
+                                               '1.8.6')
+    def __init__ (self, settings, source):
+        target.AutoBuild.__init__ (self, settings, source)
+        if isinstance (source, repository.Git):
+            ##source.version = lambda: '1.8.6'
+            source.version = misc.bind_method (Guile.version_from_VERSION,
+                                               source)
+        self.so_version = '17'
+    # REMOVE putenv!
+    gnulib_modules = 'alignof alloca-opt announce-gen autobuild byteswap canonicalize-lgpl duplocale environ extensions flock fpieee full-read full-write func gendocs getaddrinfo git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isinf isnan lib-symbol-versions lib-symbol-visibility libunistring locale maintainer-makefile nproc stat-time stdlib strcase strftime striconveh string sys_stat verify version-etc-fsf vsnprintf warnings     '
+    def patch (self):
+        self.dump ('''#!/bin/sh
+exec %(tools_archmatch_prefix)s/bin/guile "$@"
+''', "%(srcdir)s/pre-inst-guile.in")
+        #self.autopatch ()
+        self.system ('cp -pv %(sourcefiledir)s/fcntl-o.m4 %(srcdir)s/m4')
+        self.system ('%(tools_prefix)s/share/gnulib/gnulib-tool --import --dir=%(srcdir)s --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --libtool --macro-prefix=gl --no-vc-files %(gnulib_modules)s')
+        target.AutoBuild.patch (self)
+    def autoupdate (self):
+        self.system ('cd %(srcdir)s && ./autogen.sh')
+        # .libs/libguile_2.0_la-arbiters.o: In function `__gmpz_abs':
+        # arbiters.c:(.text+0x0): multiple definition of `__gmpz_abs'
+        self.file_sub ([('-std=gnu99', ''),('-std=c99', '')], '%(srcdir)s/configure')
+        self.file_sub ([('cross_compiling=(maybe|no|yes)',
+                         'cross_compiling=yes')], '%(srcdir)s/configure')
+    def autopatch (self):
+        self.file_sub ([(r'AC_CONFIG_SUBDIRS\(guile-readline\)', '')],
+                       '%(srcdir)s/configure.in')
+        self.file_sub ([(r'guile-readline', '')],
+                       '%(srcdir)s/Makefile.am')
+        # Guile [doc] does not compile with dash *and* not with
+        # librestrict-stat.so; patch out.
+        if isinstance (self.source, repository.Git):
+            self.file_sub ([(' doc ', ' ')], '%(srcdir)s/Makefile.am')
+            self.file_sub ([('guile-readline', '')], '%(srcdir)s/Makefile.am')
+        else:
+            self.file_sub ([(' doc ', ' ')], '%(srcdir)s/Makefile.in')
+            self.file_sub ([('guile-readline', '')], '%(srcdir)s/Makefile.in')
+        self.dump ('', '%(srcdir)s/doc/ref/version.texi')
+        self.dump ('', '%(srcdir)s/doc/tutorial/version.texi')
+    def compile (self):
+        ## Ugh: broken dependencies break parallel build with make -jX
+        self.system ('cd %(builddir)s/libguile && make %(compile_flags_native)s gen-scmconfig guile_filter_doc_snarfage')
+        # Remove -L %(system_root)s from `guile-config link'
+        self.system ('cd %(builddir)s/libguile && make %(compile_flags_native)slibpath.h')
+        self.file_sub ([('''-L *%(system_root)s''', '-L')],
+                       '%(builddir)s/libguile/libpath.h')
+        target.AutoBuild.compile (self)
+    def install (self):
+        # with 1.8.7: libtool: cannot install directory not ending in...
+        # after config.status is being re-run for building of libpath.h
+        self.update_libtool ()
+        target.AutoBuild.install (self)
+        majmin_version = '.'.join (self.expand ('%(version)s').split ('.')[0:2])
+        majmin_version = '2.0'
+
+        self.dump ('''
+prependdir GUILE_LOAD_PATH=$INSTALLER_PREFIX/share/guile/%(majmin_version)s
+prependdir GUILE_LOAD_PATH=$INSTALLER_PREFIX/share/guile/site
+prependdir GUILE_LOAD_COMPILED_PATH=$INSTALLER_PREFIX/lib/guile/%(majmin_version)s/ccache
+''',
+                   '%(install_prefix)s/etc/relocate/guile.reloc',
+                   env=locals ())
+        version = self.expand ('%(version)s')
+        #FIXME: c&p linux.py
+        self.dump ('''\
+#! /bin/sh
+test "$1" = "--version" && echo "%(target_architecture)s-guile-config - Guile version %(version)s"
+prefix=%(system_prefix)s
+test "$1" = "compile" && echo "-I$prefix/include/guile/2.0"
+test "$1" = "link" && echo "-L$prefix/lib -lguile-2.0 -lgmp"
+test "$1" = "info" && test "$2" = "guileversion" && echo "%(version)s"
+exit 0
+''',
+             '%(install_prefix)s%(cross_dir)s/bin/%(target_architecture)s-guile-config')
+        self.chmod ('%(install_prefix)s%(cross_dir)s/bin/%(target_architecture)s-guile-config', octal.o755)
+        self.system ('cd %(install_prefix)s%(cross_dir)s/bin && cp -pv %(target_architecture)s-guile-config guile-config')
+
+class Guile__mingw (Guile):
+    def __init__ (self, settings, source):
+        Guile.__init__ (self, settings, source)
+        # Configure (compile) without -mwindows for console
+        self.target_gcc_flags = '-mms-bitfields'
+    patches = Guile.patches + [
+        'guile-1.9.15-mingw.patch',
+        'guile-1.9.14-mingw-dirent.patch',
+        'guile-1.9.15-mingw-compile.patch',
+        'guile-1.9.15-mingw-canonicalize.patch',
+        'guile-1.9.15-mingw-fports.patch',
+        'guile-1.9.15-mingw-rename.patch',
+        'guile-1.9.15-mingw-cachedir.patch',
+        'guile-2.0.0-mingw-compile-binary.patch',
+        'guile-2.0.0-mingw-fchmod.patch',
+        'guile-2.0.0-mingw-dynl.patch',
+        'guile-2.0.0.1-mingw-boot.scm',
+        ]
+    dependencies = (Guile.dependencies + [
+            #'pthreads-w32',
+            'regex-devel',
+            'mingw-extras',
+            ])
+    configure_flags = (Guile.configure_flags
+                       + ' --without-threads')
+    configure_variables = (Guile.configure_variables
+                           .replace ("':'", "';'")
+###we're debugging here
+###CFLAGS='-O2 -DHAVE_CONFIG_H=1 -I%(builddir)s'
+                + misc.join_lines ('''
+CFLAGS='-g -DHAVE_CONFIG_H=1 -I%(builddir)s'
+LIBS='-lgc -lmingw-extras'
+'''))
+    config_cache_overrides = Guile.config_cache_overrides + '''
+gl_cv_socket_ipv6=no
+guile_cv_have_ipv6=no
+scm_cv_struct_timespec=${scm_cv_struct_timespec=no}
+guile_cv_func_usleep_declared=${guile_cv_func_usleep_declared=yes}
+guile_cv_exeext=${guile_cv_exeext=}
+libltdl_cv_sys_search_path=${libltdl_cv_sys_search_path="%(system_prefix)s/lib"}
+'''
+    def configure (self):
+        self.file_sub ([('''^#(LIBOBJS=".*fileblocks.*)''', r'\1')],
+                       '%(srcdir)s/configure')
+        Guile.configure (self)
+        for libtool in ['%(builddir)s/libtool']: # readline patched-out: '%(builddir)s/guile-readline/libtool']:
+            self.file_sub ([('-mwindows', '')], libtool)
+
+    gnulib_modules = (Guile.gnulib_modules
+                      + 'accept bind close connect getpeername getsockname getsockopt listen recv recv recvfrom send sendto setsockopt shutdown socket ')
+    def patch (self):
+        Guile.patch (self)
+        # self.file_sub ([('putenv', 'gnulib_putenv')], '%(srcdir)s/lib/putenv.c')
+        self.file_sub ([('putenv', 'gnulib_putenv')], '%(srcdir)s/lib/stdlib.in.h')
+    def compile (self):
+        ## Why the !?#@$ is .EXE only for guile_filter_doc_snarfage?
+        self.system ('''cd %(builddir)s/libguile &&make %(compile_flags_native)sgen-scmconfig guile_filter_doc_snarfage.exe''')
+        self.system ('cd %(builddir)s/libguile && cp guile_filter_doc_snarfage.exe guile_filter_doc_snarfage')
+        Guile.compile (self)
+    def install (self):
+        Guile.install (self)
+        self.system ('''cd %(install_prefix)s/bin && cp guile.exe guile-windows.exe''')
+
+class Guile__linux (Guile):
+    compile_command = ('export LD_LIBRARY_PATH=%(builddir)s/libguile/.libs:$LD_LIBRARY_PATH;'
+                       + Guile.compile_command)
+
+class Guile__linux__ppc (Guile__linux):
+    config_cache_overrides = Guile__linux.config_cache_overrides + '''
+guile_cv_have_libc_stack_end=no
+'''
+
+class Guile__freebsd (Guile):
+    config_cache_overrides = Guile.config_cache_overrides + '''
+ac_cv_type_socklen_t=yes
+guile_cv_use_csqrt="no"
+'''
+
+class Guile__darwin (Guile):
+    patches = Guile.patches + ['guile-1.9.14-pthreads-cross.patch']
+    def install (self):
+        Guile.install (self)
+        def dylib_link (logger, fname):
+            directory = os.path.split (fname)[0]
+            src = os.path.basename (fname)
+            dst = os.path.splitext (os.path.basename (fname))[0] + '.so'
+            loggedos.symlink (logger, src, os.path.join (directory, dst))
+        self.map_locate (dylib_link,
+                         self.expand ('%(install_prefix)s/lib/'),
+                         'libguile-srfi*.dylib')
+
+class Guile__darwin__x86 (Guile__darwin):
+    def configure (self):
+        self.file_sub ([('guile-readline', '')],
+                       '%(srcdir)s/Makefile.in')
+        Guile__darwin.configure (self)
+
+class Guile__linux__x86 (Guile):
+    patches = Guile.patches + [
+        'guile-1.9.14-pthreads-cross.patch',
+        'guile-1.9.14-struct.patch',
+        ]
+    compile_flags_native = (Guile.compile_flags_native +
+                            'CPATH="%(srcdir)s:%(builddir)s:%(system_prefix)s/include" ')
+
+class Guile__tools (tools.AutoBuild, Guile):
+    patches = [
+        'guile-2.0.0.1-testsuite.patch',
+        'guile-2.0.0-mingw-compile-binary.patch',
+        'guile-2.0.0.1-compile-mkdir.patch',
+        ]
+    dependencies = (Guile.dependencies
+                    + [
+                'autoconf',
+                'automake',
+                'gettext',
+                'flex',
+                'libtool'
+                ])
+    make_flags = Guile.make_flags
+    # Doing make gen-scmconfig, guile starts a configure recheck:
+    #    cd .. && make  am--refresh
+    #    /bin/sh ./config.status --recheck
+    # leading to
+    #    checking size of char... 0
+    # Great idea, let's re-check!  You never know... :-)
+    compile_flags_native = misc.join_lines ('''
+LD_LIBRARY_PATH=%(system_prefix)s/lib
+CFLAGS='-O2 -I%(system_prefix)s/include'
+LDFLAGS='-L%(system_prefix)s/lib %(rpath)s'
+''')
+    configure_command = ('LD_LIBRARY_PATH=%(system_prefix)s/lib:${LD_LIBRARY_PATH-/foe} '
+                         + tools.AutoBuild.configure_command
+                         + Guile.guile_configure_flags)
+    # FIXME: when configuring, guile runs binaries linked against
+    # libltdl.
+    # FIXME: when not x-building, guile runs gen_scmconfig, guile without
+    # setting the proper LD_LIBRARY_PATH.
+    compile_command = ('export LD_LIBRARY_PATH=%(builddir)s/libguile/.libs:%(system_prefix)s/lib:${LD_LIBRARY_PATH-/foe};'
+                + tools.AutoBuild.compile_command)
+    install_command = tools.AutoBuild.install_command
+    def patch (self):
+        tools.AutoBuild.patch (self)
+        #Guile.autopatch (self)
+        self.system ('cp -pv %(sourcefiledir)s/fcntl-o.m4 %(srcdir)s/m4')
+    def autoupdate (self):
+        self.system ('cd %(srcdir)s && ./autogen.sh')
+        # .libs/libguile_2.0_la-arbiters.o: In function `__gmpz_abs':
+        # arbiters.c:(.text+0x0): multiple definition of `__gmpz_abs'
+        self.file_sub ([('-std=gnu99', ''),('-std=c99', '')], '%(srcdir)s/configure')
+    def install (self):
+        tools.AutoBuild.install (self)
+        self.system ('cd %(install_root)s%(packaging_suffix_dir)s%(prefix_dir)s/bin && cp guile guile-2.0')
+#        self.file_sub ([('[(]string-join other-flags[)]', '(string-join (filter (lambda (x) (not (equal? x "-L/usr/lib"))) other-flags))')],
+#                       '%(install_root)s%(packaging_suffix_dir)s%(prefix_dir)s/bin/guile-config',
+#                       must_succeed=True)
+
+class Guile__tools32 (tools32.AutoBuild, Guile__tools):
+    pass