summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-11-18 23:12:36 +0100
committerLudovic Courtès <ludo@gnu.org>2018-11-18 23:12:36 +0100
commit2d546858b139e5fcf2cbdf9958a17fd98803ac4c (patch)
treed4949e03ad6e44bbd49220fa02f25645ed700454 /gnu
parent8504d1922240b29815fd3e1e231e27da391338cd (diff)
downloadguix-2d546858b139e5fcf2cbdf9958a17fd98803ac4c.tar.gz
gnu: hurd: Build against glibc 2.28.
Version 2.28 of glibc is the first in a long time that fully supports
GNU/Hurd.  This change updates the Hurd and Mach to provide the features
glibc 2.28 expects and adjusts the cross-compilation tool chain for
"i586-pc-gnu".

* gnu/packages/base.scm (glibc/linux): Rename to...
(glibc): ... this.
[propagated-inputs]: Add 'hurd-target?' case.
[arguments]: Use '--disable-werror' when 'hurd-target?'.  Add
'augment-libc.so' phase when 'hurd-target?'.
[native-inputs]: Add MIG and PERL when 'hurd-target?'.
(glibc/hurd, glibc-for-target): Remove
(glibc/hurd-headers): Inherit from GLIBC, not GLIBC/HURD.
[arguments]: Remove "--enable-obsolete-rpc" configure flag and
'patch-configure-script' phase.
* gnu/packages/cross-base.scm (cross-kernel-headers)[xglibc/hurd-headers]:
Move 'set-cross-headers-path' after 'unpack'.
* gnu/packages/cross-base.scm (cross-libc)[cross-libc-for-target]:
Remove.
Pass "--disable-werror" when TARGET matches 'hurd-triplet?'.
* gnu/packages/hurd.scm (hurd-target?, patch-url): New procedures.
(gnumach-headers)[source](patches, modules, snippet): New fields.
(hurd-headers): Use Git commit 98b3390.
[native-inputs]: Add AUTOCONF and AUTOMAKE.
[arguments]: Add "ac_cv_func_*" configure flags.
(hurd-minimal)[native-inputs]: Remove.
[arguments]: In 'build' phase, build "include/assert-backtrace.h"
first.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/packages/base.scm139
-rw-r--r--gnu/packages/cross-base.scm18
-rw-r--r--gnu/packages/hurd.scm136
3 files changed, 138 insertions, 155 deletions
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 3a1186673e..60f8051dc6 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -577,7 +577,9 @@ store.")
 
 (export make-ld-wrapper)
 
-(define-public glibc/linux
+(define-public glibc
+  ;; This is the GNU C Library, used on GNU/Linux and GNU/Hurd.  Prior to
+  ;; version 2.28, GNU/Hurd used a different glibc branch.
   (package
    (name "glibc")
    ;; Note: Always use a dot after the minor version since various places rely
@@ -608,8 +610,13 @@ store.")
    (build-system gnu-build-system)
 
    ;; Glibc's <limits.h> refers to <linux/limit.h>, for instance, so glibc
-   ;; users should automatically pull Linux headers as well.
-   (propagated-inputs `(("kernel-headers" ,linux-libre-headers)))
+   ;; users should automatically pull Linux headers as well.  On GNU/Hurd,
+   ;; libc provides <hurd.h>, which includes a bunch of Hurd and Mach headers,
+   ;; so both should be propagated.
+   (propagated-inputs
+    (if (hurd-target?)
+        `(("hurd-core-headers" ,hurd-core-headers))
+        `(("kernel-headers" ,linux-libre-headers))))
 
    (outputs '("out" "debug"
               "static"))                          ;9 MiB of .a files
@@ -664,7 +671,13 @@ store.")
             ;; Use our Bash instead of /bin/sh.
             (string-append "BASH_SHELL="
                            (assoc-ref %build-inputs "bash")
-                           "/bin/bash"))
+                           "/bin/bash")
+
+            ;; On GNU/Hurd we get discarded-qualifiers warnings for
+            ;; 'device_write_inband' among other things.  Ignore them.
+            ,@(if (hurd-target?)
+                  '("--disable-werror")
+                  '()))
 
       #:tests? #f                                 ; XXX
       #:phases (modify-phases %standard-phases
@@ -769,7 +782,18 @@ store.")
                                  (filter linker-script?
                                          (map (cut string-append slib "/" <>)
                                               files)))
-                       #t))))))
+                       #t)))
+
+                 ,@(if (hurd-target?)
+                       '((add-after 'install 'augment-libc.so
+                           (lambda* (#:key outputs #:allow-other-keys)
+                             (let* ((out (assoc-ref outputs "out")))
+                               (substitute* (string-append out "/lib/libc.so")
+                                 (("/[^ ]+/lib/libc.so.0.3")
+                                  (string-append out "/lib/libc.so.0.3"
+                                                 " libmachuser.so libhurduser.so"))))
+                             #t)))
+                       '()))))
 
    (inputs `(("static-bash" ,static-bash)))
 
@@ -778,7 +802,12 @@ store.")
    (native-inputs `(("texinfo" ,texinfo)
                     ("perl" ,perl)
                     ("bison" ,bison)
-                    ("gettext" ,gettext-minimal)))
+                    ("gettext" ,gettext-minimal)
+
+                    ,@(if (hurd-target?)
+                          `(("mig" ,mig)
+                            ("perl" ,perl))
+                          '())))
 
    (native-search-paths
     ;; Search path for packages that provide locale data.  This is useful
@@ -800,89 +829,6 @@ with the Linux kernel.")
    (license lgpl2.0+)
    (home-page "https://www.gnu.org/software/libc/")))
 
-(define-public glibc/hurd
-  ;; The Hurd's libc variant.
-  (package (inherit glibc/linux)
-    (name "glibc-hurd")
-    (version "2.23")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "http://alpha.gnu.org/gnu/hurd/glibc-"
-                                  version "-hurd+libpthread-20161218" ".tar.gz"))
-              (sha256
-               (base32
-                "0vpdv05j6j3ria5bw8gp468i64gij94cslxkxj9xkfgi6p615b8p"))))
-
-    ;; Libc provides <hurd.h>, which includes a bunch of Hurd and Mach headers,
-    ;; so both should be propagated.
-    (propagated-inputs `(("hurd-core-headers" ,hurd-core-headers)))
-    (native-inputs
-     `(,@(package-native-inputs glibc/linux)
-       ("mig" ,mig)
-       ("perl" ,perl)))
-
-    (arguments
-     (substitute-keyword-arguments (package-arguments glibc/linux)
-       ((#:phases original-phases)
-        ;; Add libmachuser.so and libhurduser.so to libc.so's search path.
-        ;; See <http://lists.gnu.org/archive/html/bug-hurd/2015-07/msg00051.html>.
-        `(modify-phases ,original-phases
-           (add-after 'install 'augment-libc.so
-             (lambda* (#:key outputs #:allow-other-keys)
-               (let* ((out (assoc-ref outputs "out")))
-                 (substitute* (string-append out "/lib/libc.so")
-                   (("/[^ ]+/lib/libc.so.0.3")
-                    (string-append out "/lib/libc.so.0.3" " libmachuser.so" " libhurduser.so"))))
-               #t))
-           (add-after 'pre-configure 'pre-configure-set-pwd
-             (lambda _
-               ;; Use the right 'pwd'.
-               (substitute* "configure"
-                 (("/bin/pwd") "pwd"))
-               #t))
-           (replace 'build
-             (lambda _
-               ;; Force mach/hurd/libpthread subdirs to build first in order to avoid
-               ;; linking errors.
-               ;; See <https://lists.gnu.org/archive/html/bug-hurd/2016-11/msg00045.html>
-               (let ((flags (list "-j" (number->string (parallel-job-count)))))
-                 (define (make target)
-                   (apply invoke "make" target flags))
-                 (make "mach/subdir_lib")
-                 (make "hurd/subdir_lib")
-                 (make "libpthread/subdir_lib")
-                 (apply invoke "make" flags))))))
-        ((#:configure-flags original-configure-flags)
-        `(append (list "--host=i586-pc-gnu"
-
-                       ;; We need this to get a working openpty() function.
-                       "--enable-pt_chown"
-
-                       ;; <https://lists.gnu.org/archive/html/bug-hurd/2016-10/msg00033.html>
-                       "--disable-werror"
-
-                       ;; nscd fails to build for GNU/Hurd:
-                       ;; <https://lists.gnu.org/archive/html/bug-hurd/2014-07/msg00006.html>.
-                       ;; Disable it.
-                       "--disable-nscd")
-                 (filter (lambda (flag)
-                           (not (string-prefix? "--enable-kernel=" flag)))
-                         ,original-configure-flags)))))
-    (synopsis "The GNU C Library (GNU Hurd variant)")
-    (supported-systems %hurd-systems)))
-
-(define* (glibc-for-target #:optional
-                           (target (or (%current-target-system)
-                                       (%current-system))))
-  "Return the glibc for TARGET, GLIBC/LINUX for a Linux host or
-GLIBC/HURD for a Hurd host"
-  (match target
-    ((or "i586-pc-gnu" "i586-gnu") glibc/hurd)
-    (_ glibc/linux)))
-
-(define-syntax glibc
-  (identifier-syntax (glibc-for-target)))
-
 ;; Below are old libc versions, which we use mostly to build locale data in
 ;; the old format (which the new libc cannot cope with.)
 
@@ -1121,18 +1067,17 @@ command.")
     (license gpl3+))) ; some files are under GPLv2+
 
 (define-public glibc/hurd-headers
-  (package (inherit glibc/hurd)
+  (package (inherit glibc)
     (name "glibc-hurd-headers")
     (outputs '("out"))
     (propagated-inputs `(("gnumach-headers" ,gnumach-headers)
                          ("hurd-headers" ,hurd-headers)))
     (arguments
-     (substitute-keyword-arguments (package-arguments glibc/hurd)
+     (substitute-keyword-arguments (package-arguments glibc)
        ;; We just pass the flags really needed to build the headers.
        ((#:configure-flags _)
         `(list "--enable-add-ons"
-               "--host=i586-pc-gnu"
-               "--enable-obsolete-rpc"))
+               "--host=i586-pc-gnu"))
        ((#:phases _)
         '(modify-phases %standard-phases
            (replace 'install
@@ -1147,13 +1092,7 @@ command.")
                   (open-output-file
                    (string-append out "/include/gnu/stubs.h"))))
                #t))
-           (delete 'build)              ; nothing to build
-           (add-before 'configure 'patch-configure-script
-             (lambda _
-               ;; Use the right 'pwd'.
-               (substitute* "configure"
-                 (("/bin/pwd") "pwd"))
-               #t))))))))
+           (delete 'build)))))))                  ; nothing to build
 
 (define-public tzdata
   (package
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index bbd779ae4e..2fcb7fb36b 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
@@ -356,7 +356,7 @@ target that libc."
              ,@(package-arguments glibc/hurd-headers))
          ((#:phases phases)
           `(modify-phases ,phases
-             (add-before 'pre-configure 'set-cross-headers-path
+             (add-after 'unpack 'set-cross-headers-path
                (lambda* (#:key inputs #:allow-other-keys)
                  (let* ((mach (assoc-ref inputs "gnumach-headers"))
                         (hurd (assoc-ref inputs "hurd-headers"))
@@ -426,17 +426,9 @@ target that libc."
                      (xheaders (cross-kernel-headers target)))
   "Return a libc cross-built for TARGET, a GNU triplet.  Use XGCC and
 XBINUTILS and the cross tool chain."
-  (define (cross-libc-for-target target)
-    "Return libc depending on TARGET."
-    (match target
-      ((or "i586-pc-gnu" "i586-gnu") glibc/hurd)
-      (_ glibc/linux)))
-
-  ;; Use (cross-libc-for-target ...) to determine the correct libc to use.
-
   (if (cross-newlib? target)
       (native-libc target)
-      (let ((libc (cross-libc-for-target target)))
+      (let ((libc glibc))
         (package (inherit libc)
           (name (string-append "glibc-cross-" target))
           (arguments
@@ -457,7 +449,9 @@ XBINUTILS and the cross tool chain."
                  ,@(package-arguments libc))
              ((#:configure-flags flags)
               `(cons ,(string-append "--host=" target)
-                   ,flags))
+                     ,(if (hurd-triplet? target)
+                          `(cons "--disable-werror" ,flags)
+                          flags)))
              ((#:phases phases)
               `(modify-phases ,phases
                  (add-before 'configure 'set-cross-kernel-headers-path
diff --git a/gnu/packages/hurd.scm b/gnu/packages/hurd.scm
index d6c1fb5e64..938cb116ca 100644
--- a/gnu/packages/hurd.scm
+++ b/gnu/packages/hurd.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015, 2016, 2017 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
+;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,17 +25,25 @@
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages base)
   #:use-module (guix git-download)
-  #:export (hurd-triplet?))
+  #:export (hurd-triplet?
+            hurd-target?))
 
 (define (hurd-triplet? triplet)
   (and (string-suffix? "-gnu" triplet)
        (not (string-contains triplet "linux"))))
 
+(define (hurd-target?)
+  "Return true if the cross-compilation target or the current system is
+GNU/Hurd."
+  (or (and=> (%current-target-system) hurd-triplet?)
+      (string-suffix? (%current-system) "-gnu")))
+
 (define (gnumach-source-url version)
   (string-append "mirror://gnu/gnumach/gnumach-"
                  version ".tar.gz"))
@@ -43,6 +52,10 @@
   (string-append "mirror://gnu/hurd/hurd-"
                  version ".tar.gz"))
 
+(define (patch-url repository commit)
+  (string-append "https://git.savannah.gnu.org/cgit/hurd/" repository
+                 ".git/patch/?id=" commit))
+
 (define-public gnumach-headers
   (package
     (name "gnumach-headers")
@@ -53,7 +66,24 @@
       (uri (gnumach-source-url version))
       (sha256
        (base32
-        "02hygsfpd2dljl5lg1vjjg9pizi9jyxd4aiiqzjshz6jax62jm9f"))))
+        "02hygsfpd2dljl5lg1vjjg9pizi9jyxd4aiiqzjshz6jax62jm9f"))
+      (patches (list (origin
+                       ;; This patch adds <mach/vm_wire.h>, which defines the
+                       ;; VM_WIRE_* constants needed by glibc 2.28.
+                       (method url-fetch)
+                       (uri (patch-url "gnumach" "2b0f19f602e08fd9d37268233b962674fd592634"))
+                       (sha256
+                        (base32
+                         "01iajnwsmka0w9hwjkxxijc4xfhwqbvlkw1w8n71hpnhfixd0y28"))
+                       (file-name "gnumach-vm-wire-header.patch"))))
+      (modules '((guix build utils)))
+      (snippet
+       '(begin
+          ;; Actually install vm_wire.h.
+          (substitute* "Makefile.in"
+            (("^include_mach_HEADERS =")
+             "include_mach_HEADERS = include/mach/vm_wire.h"))
+          #t))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -110,56 +140,71 @@ communication.")
     (license gpl2+)))
 
 (define-public hurd-headers
-  (package
-    (name "hurd-headers")
-    (version "0.9")
-    (source (origin
-              (method url-fetch)
-              (uri (hurd-source-url version))
-              (sha256
-               (base32
-                "1nw9gly0n7pyv3cpfm4mmxy4yccrx4g0lyrvd3vk2vil26jpbggw"))))
-    (build-system gnu-build-system)
-    (native-inputs
-     `(("mig" ,mig)))
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (replace 'install
-           (lambda _
-             (invoke "make" "install-headers" "no_deps=t")))
-         (delete 'build))
+  ;; Resort to a post-0.9 snapshot that provides the 'file_utimens' and
+  ;; 'file_exec_paths' RPCs that glibc 2.28 expects.
+  (let ((revision "0")
+        (commit "98b33905c89b7e5c309c74ae32302a5745901a6e"))
+   (package
+     (name "hurd-headers")
+     (version "0.9")
+     (source (origin
+               (method git-fetch)
+               (uri (git-reference
+                     (url "https://git.savannah.gnu.org/git/hurd/hurd.git")
+                     (commit commit)))
+               (sha256
+                (base32
+                 "1mj22sxgscas2675vrbxr477mwbxdj68pqcrh65lbir8qlssrgrf"))
+               (file-name (git-file-name name version))))
+     (build-system gnu-build-system)
+     (native-inputs
+      `(("mig" ,mig)
+        ("autoconf" ,autoconf)
+        ("automake" ,automake)))
+     (arguments
+      `(#:phases
+        (modify-phases %standard-phases
+          (replace 'install
+            (lambda _
+              (invoke "make" "install-headers" "no_deps=t")))
+          (delete 'build))
 
-       #:configure-flags '(;; Pretend we're on GNU/Hurd; 'configure' wants
-                           ;; that.
-                           ,@(if (%current-target-system)
-                                 '()
-                                 '("--host=i586-pc-gnu"))
+        #:configure-flags '( ;; Pretend we're on GNU/Hurd; 'configure' wants
+                            ;; that.
+                            ,@(if (%current-target-system)
+                                  '()
+                                  '("--host=i586-pc-gnu"))
 
-                           ;; Reduce set of dependencies.
-                           "--without-parted"
-                           "--disable-ncursesw"
-                           "--disable-test"
-                           "--without-libbz2"
-                           "--without-libz"
-                           ;; Skip the clnt_create check because it expects
-                           ;; a working glibc causing a circular dependency.
-                           "ac_cv_search_clnt_create=no")
+                            ;; Reduce set of dependencies.
+                            "--without-parted"
+                            "--disable-ncursesw"
+                            "--disable-test"
+                            "--without-libbz2"
+                            "--without-libz"
+                            ;; Skip the clnt_create check because it expects
+                            ;; a working glibc causing a circular dependency.
+                            "ac_cv_search_clnt_create=no"
 
-       #:tests? #f))
-    (home-page "https://www.gnu.org/software/hurd/hurd.html")
-    (synopsis "GNU Hurd headers")
-    (description
-     "This package provides C headers of the GNU Hurd, used to build the GNU C
+                            ;; Annihilate the checks for the 'file_exec_paths'
+                            ;; & co. libc functions to avoid "link tests are
+                            ;; not allowed after AC_NO_EXECUTABLES" error.
+                            "ac_cv_func_file_exec_paths=no"
+                            "ac_cv_func_exec_exec_paths=no"
+                            "ac_cv_func__hurd_exec_paths=no"
+                            "ac_cv_func_file_futimens=no")
+
+        #:tests? #f))
+     (home-page "https://www.gnu.org/software/hurd/hurd.html")
+     (synopsis "GNU Hurd headers")
+     (description
+      "This package provides C headers of the GNU Hurd, used to build the GNU C
 Library and other user programs.")
-    (license gpl2+)))
+     (license gpl2+))))
 
 (define-public hurd-minimal
   (package (inherit hurd-headers)
     (name "hurd-minimal")
     (inputs `(("glibc-hurd-headers" ,glibc/hurd-headers)))
-    (native-inputs
-     `(("mig" ,mig)))
     (arguments
      (substitute-keyword-arguments (package-arguments hurd-headers)
        ((#:phases _)
@@ -178,6 +223,11 @@ Library and other user programs.")
                  #t)))
            (replace 'build
              (lambda _
+               ;; Install <assert-backtrace.h> & co.
+               (invoke "make" "-Clibshouldbeinlibc"
+                       "../include/assert-backtrace.h")
+
+               ;; Build libihash.
                (invoke "make" "-Clibihash" "libihash.a")))))))
     (home-page "https://www.gnu.org/software/hurd/hurd.html")
     (synopsis "GNU Hurd libraries")