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.
This commit is contained in:
Ludovic Courtès 2018-11-18 23:12:36 +01:00
parent 8504d19222
commit 2d546858b1
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
3 changed files with 138 additions and 155 deletions

View file

@ -577,7 +577,9 @@ (define* (make-ld-wrapper name #:key
(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 @@ (define-public glibc/linux
(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 @@ (define-public glibc/linux
;; 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 @@ (define (linker-script? file)
(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 @@ (define (linker-script? file)
(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 @@ (define (linker-script? file)
(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 @@ (define-public which
(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 @@ (define-public glibc/hurd-headers
(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

View file

@ -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 @@ (define xglibc/hurd-headers
,@(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 @@ (define* (cross-libc target
(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 @@ (define (cross-libc-for-target target)
,@(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

View file

@ -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 @@ (define-module (gnu packages hurd)
#: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 @@ (define (hurd-source-url version)
(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 @@ (define-public gnumach-headers
(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 @@ (define-public mig
(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 @@ (define-public hurd-minimal
#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")