From 64754ff26105d1581d70ec1432c7d8a3cbdf23ab Mon Sep 17 00:00:00 2001 From: Manolis Ragkousis Date: Sat, 27 Sep 2014 20:07:19 +0300 Subject: [PATCH] gnu: base: Add glibc-hurd and hurd-minimal. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/packages/base.scm (glibc/hurd, glibc/hurd-headers): New variables. * gnu/packages/hurd.scm (hurd-minimal): New variable. * gnu/packages/patches/glibc-hurd-extern-inline.patch: New file. * gnu/packages/patches/libpthread-glibc-preparation.patch: New file. * gnu/packages/patches/hurd-minimal.patch: New file. * gnu-system.am (dist_patch_DATA): Add them. Co-authored-by: Ludovic Courtès Co-authored-by: Mark H Weaver --- gnu-system.am | 3 + gnu/packages/base.scm | 106 +++++++++++++++ gnu/packages/hurd.scm | 67 +++++++++- .../patches/glibc-hurd-extern-inline.patch | 35 +++++ gnu/packages/patches/hurd-minimal.patch | 22 ++++ .../patches/libpthread-glibc-preparation.patch | 146 +++++++++++++++++++++ 6 files changed, 378 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/glibc-hurd-extern-inline.patch create mode 100644 gnu/packages/patches/hurd-minimal.patch create mode 100644 gnu/packages/patches/libpthread-glibc-preparation.patch diff --git a/gnu-system.am b/gnu-system.am index 617e8bb..3a10757 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -434,6 +434,7 @@ dist_patch_DATA = \ gnu/packages/patches/glibc-locales.patch \ gnu/packages/patches/gmp-arm-asm-nothumb.patch \ gnu/packages/patches/gnutls-fix-duplicate-manpages.patch \ + gnu/packages/patches/glibc-hurd-extern-inline.patch \ gnu/packages/patches/gobject-introspection-absolute-shlib-path.patch \ gnu/packages/patches/gobject-introspection-cc.patch \ gnu/packages/patches/gobject-introspection-girepository.patch \ @@ -452,6 +453,7 @@ dist_patch_DATA = \ gnu/packages/patches/hop-bigloo-4.0b.patch \ gnu/packages/patches/inetutils-syslogd.patch \ gnu/packages/patches/irrlicht-mesa-10.patch \ + gnu/packages/patches/hurd-minimal.patch \ gnu/packages/patches/jbig2dec-ignore-testtest.patch \ gnu/packages/patches/kmod-module-directory.patch \ gnu/packages/patches/lftp-dont-save-unknown-host-fingerprint.patch \ @@ -472,6 +474,7 @@ dist_patch_DATA = \ gnu/packages/patches/libvpx-vp9-out-of-bounds-access.patch \ gnu/packages/patches/linux-libre-libreboot-fix.patch \ gnu/packages/patches/lirc-localstatedir.patch \ + gnu/packages/patches/libpthread-glibc-preparation.patch \ gnu/packages/patches/lm-sensors-hwmon-attrs.patch \ gnu/packages/patches/lua51-liblua-so.patch \ gnu/packages/patches/luajit-no_ldconfig.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 3614361..08a3e1e 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2012 Nikita Karetnikov ;;; Copyright © 2014, 2015 Mark H Weaver ;;; Copyright © 2014 Alex Kost +;;; Copyright © 2014, 2015 Manolis Fragkiskos Ragkousis ;;; ;;; This file is part of GNU Guix. ;;; @@ -33,10 +34,13 @@ #:use-module (gnu packages perl) #:use-module (gnu packages linux) #:use-module (gnu packages texinfo) + #:use-module (gnu packages gettext) + #:use-module (gnu packages hurd) #:use-module (gnu packages pkg-config) #:use-module (guix utils) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix build-system trivial)) @@ -686,6 +690,108 @@ variety of options. It is an alternative to the shell \"type\" built-in command.") (license gpl3+))) ; some files are under GPLv2+ +(define-public glibc/hurd + (package (inherit glibc) + (name "glibc-hurd") + (version "2.18") + (source (origin + (method git-fetch) + (uri (git-reference + (url "git://git.sv.gnu.org/hurd/glibc") + (commit "cc94b3cfe65523f980359e5f0e93a26196bda1d3"))) + (sha256 + (base32 + "17gsh0kaz0zyvghjmx861mi2p65m9901lngi179x61zm6v2v3xc4")) + (file-name (string-append name "-" version)) + (patches (map search-patch + '("glibc-hurd-extern-inline.patch"))))) + + ;; Libc provides , which includes a bunch of Hurd and Mach headers, + ;; so both should be propagated. + (propagated-inputs `(("gnumach-headers" ,gnumach-headers) + ("hurd-headers" ,hurd-headers) + ("hurd-minimal" ,hurd-minimal))) + (native-inputs + `(,@(package-native-inputs glibc) + ("patch/libpthread-patch" ,(search-patch "libpthread-glibc-preparation.patch")) + ("mig" ,mig) + ("perl" ,perl) + ("libpthread" ,(origin + (method git-fetch) + (uri (git-reference + (url "git://git.sv.gnu.org/hurd/libpthread") + (commit "0ef7b75c4ba91b6660f0d3d8b51d14d25e3d5bfb"))) + (sha256 + (base32 + "031py18fls15z0wprni33mf762kg6fx8xqijppimhp83yp6ky3l3")) + (file-name "libpthread"))))) + + (arguments + (substitute-keyword-arguments (package-arguments glibc) + ((#:configure-flags original-configure-flags) + `(append (list "--host=i686-pc-gnu" + + ;; nscd fails to build for GNU/Hurd: + ;; . + ;; Disable it. + "--disable-nscd") + (filter (lambda (flag) + (not (or (string-prefix? "--with-headers=" flag) + (string-prefix? "--enable-kernel=" flag)))) + ;; Evaluate 'original-configure-flags' in a + ;; lexical environment that has a dummy + ;; "linux-headers" input, to prevent errors. + (let ((%build-inputs `(("linux-headers" . "@DUMMY@") + ,@%build-inputs))) + ,original-configure-flags)))) + ((#:phases phases) + `(alist-cons-after + 'unpack 'prepare-libpthread + (lambda* (#:key inputs #:allow-other-keys) + (copy-recursively (assoc-ref inputs "libpthread") "libpthread") + + (system* "patch" "--force" "-p1" "-i" + (assoc-ref inputs "patch/libpthread-patch")) + #t) + ,phases)))))) + +(define-public glibc/hurd-headers + (package (inherit glibc/hurd) + (name "glibc-hurd-headers") + (outputs '("out")) + (arguments + (substitute-keyword-arguments (package-arguments glibc/hurd) + ;; We just pass the flags really needed to build the headers. + ((#:configure-flags _) + `(list "--enable-add-ons" + "--host=i686-pc-gnu" + "--enable-obsolete-rpc")) + ((#:phases _) + '(alist-replace + 'install + (lambda* (#:key outputs #:allow-other-keys) + (and (zero? (system* "make" "install-headers")) + + ;; Make an empty stubs.h to work around not being able to + ;; produce a valid stubs.h and causing the build to fail. See + ;; . + (let ((out (assoc-ref outputs "out"))) + (close-port + (open-output-file + (string-append out "/include/gnu/stubs.h")))))) + + ;; Nothing to build. + (alist-delete + 'build + + (alist-cons-before + 'configure 'pre-configure + (lambda _ + ;; Use the right 'pwd'. + (substitute* "configure" + (("/bin/pwd") "pwd"))) + %standard-phases)))))))) + (define-public tzdata (package (name "tzdata") diff --git a/gnu/packages/hurd.scm b/gnu/packages/hurd.scm index 62dc043..3dcab81 100644 --- a/gnu/packages/hurd.scm +++ b/gnu/packages/hurd.scm @@ -20,11 +20,14 @@ #:use-module (guix licenses) #:use-module (guix download) #:use-module (guix packages) + #:use-module (gnu packages) #:use-module (guix build-system gnu) #:use-module (gnu packages flex) #:use-module (gnu packages bison) #:use-module (gnu packages perl) - #:use-module (gnu packages autotools)) + #:use-module (gnu packages autotools) + #:use-module (gnu packages base) + #:use-module (guix git-download)) (define-public gnumach-headers (package @@ -128,3 +131,65 @@ communication.") "This package provides C headers of the GNU Hurd, used to build the GNU C Library and other user programs.") (license gpl2+))) + +(define-public hurd-minimal + (package + (name "hurd-minimal") + (version "0.5") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "git://git.savannah.gnu.org/hurd/hurd") + (commit "a5ca1de1eb575294dbc865a2c4ff643efc117ef4"))) + (sha256 + (base32 + "17vqdlpy1ifw4ijhc3ydkp8p5d406c7aq4ghpmg4a1h1wlwy32kr")) + (file-name (string-append name "-" version)) + (patches (list (search-patch "hurd-minimal.patch"))))) + (build-system gnu-build-system) + (inputs `(("glibc-hurd-headers" ,glibc/hurd-headers))) + (native-inputs + `(("autoconf" ,(autoconf-wrapper)) + ("mig" ,mig))) + + (arguments + `(#:phases (alist-replace + 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + ;; We need to copy libihash.a to the output directory manually, + ;; since there is no target for that in the makefile. + (mkdir-p (string-append out "/include")) + (copy-file "libihash/ihash.h" + (string-append out "/include/ihash.h")) + (mkdir-p (string-append out "/lib")) + (copy-file "libihash/libihash.a" + (string-append out "/lib/libihash.a")) + #t)) + (alist-replace + 'build + (lambda _ + (zero? (system* "make" "-Clibihash" "libihash.a"))) + (alist-cons-before + 'configure 'bootstrap + (lambda _ + (zero? (system* "autoreconf" "-vfi"))) + %standard-phases))) + #:configure-flags '(;; Pretend we're on GNU/Hurd; 'configure' wants + ;; that. + "--host=i686-pc-gnu" + + ;; Reduce set of dependencies. + "--disable-ncursesw" + "--disable-test" + "--without-libbz2" + "--without-libz" + "--without-parted") + #:tests? #f)) + (home-page "http://www.gnu.org/software/hurd/hurd.html") + (synopsis "GNU Hurd libraries") + (description + "This package provides libihash, needed to build the GNU C +Library for GNU/Hurd") + (license gpl2+))) diff --git a/gnu/packages/patches/glibc-hurd-extern-inline.patch b/gnu/packages/patches/glibc-hurd-extern-inline.patch new file mode 100644 index 0000000..a609b1f --- /dev/null +++ b/gnu/packages/patches/glibc-hurd-extern-inline.patch @@ -0,0 +1,35 @@ +This changes the way _EXTERN_INLINE is defined so we can +avoid external definition errors. +https://lists.gnu.org/archive/html/bug-hurd/2014-04/msg00002.html + +diff --git a/signal/sigsetops.c b/signal/sigsetops.c +index 0317662..b92c296 100644 +--- a/signal/sigsetops.c ++++ b/signal/sigsetops.c +@@ -3,7 +3,9 @@ + + #include + +-#define _EXTERN_INLINE ++#ifndef _EXTERN_INLINE ++#define _EXTERN_INLINE __extern_inline ++#endif + #ifndef __USE_EXTERN_INLINES + # define __USE_EXTERN_INLINES 1 + #endif + +Link libmachuser and libhurduser automatically with libc, since they are +considered a standard part of the API in GNU-land. + +--- a/Makerules ++++ b/Makerules +@@ -978,6 +978,9 @@ + '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ + ' AS_NEEDED (' $(rtlddir)/$(rtld-installed-name) ') )' \ + ) > address@hidden ++ifeq ($(patsubst gnu%,,$(config-os)),) ++ echo 'INPUT ( AS_NEEDED ( -lmachuser -lhurduser ) )' >> address@hidden ++endif + mv -f address@hidden $@ + + endif \ No newline at end of file diff --git a/gnu/packages/patches/hurd-minimal.patch b/gnu/packages/patches/hurd-minimal.patch new file mode 100644 index 0000000..b551d5c --- /dev/null +++ b/gnu/packages/patches/hurd-minimal.patch @@ -0,0 +1,22 @@ +We want to build the Hurd's libihash very early so that we can then +build libc. Because of that, we cannot link against libc, and thus +we miss 'clnt_create' and friends. + +See . + +diff --git a/configure.ac b/configure.ac +index f8856db..a381219 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -297,9 +297,9 @@ AC_SUBST([XKB_BASE]) + AC_DEFINE_UNQUOTED([X11_PREFIX], "$X11_PREFIX") + AC_SUBST([X11_KEYSYMDEF_H]) + +-# Check for Sun RPC headers and library. ++# Check only for Sun RPC headers. We do not need the library yet. + AC_CHECK_HEADER([rpc/types.h], [HAVE_SUN_RPC=yes], [HAVE_SUN_RPC=no]) +-AC_SEARCH_LIBS([clnt_create], [], [:], [HAVE_SUN_RPC=no]) ++# AC_SEARCH_LIBS([clnt_create], [], [:], [HAVE_SUN_RPC=no]) + AC_SUBST([HAVE_SUN_RPC]) + + if test -f ./$ac_unique_file; then diff --git a/gnu/packages/patches/libpthread-glibc-preparation.patch b/gnu/packages/patches/libpthread-glibc-preparation.patch new file mode 100644 index 0000000..a432454 --- /dev/null +++ b/gnu/packages/patches/libpthread-glibc-preparation.patch @@ -0,0 +1,146 @@ +This patch helps to integrate the Hurd's libpthread as a libc add-on. + +It writes the configure file, removes an rpc call not yet +implemented on the version of gnumach we use and defines +a missing macro. + +diff --git a/libpthread/configure b/libpthread/configure +new file mode 100644 +index 0000000..2cdbc71 +--- /dev/null ++++ b/libpthread/configure +@@ -0,0 +1,2 @@ ++libc_add_on_canonical=libpthread ++libc_add_on_subdirs=. +-- +1.9.0 + +We are using a version of GNU Mach that lacks 'thread_terminate_release' +(not introduced yet). The 'thread_terminate' RPC call will be enough for +our needs. +See . + +diff --git a/libpthread/sysdeps/mach/pt-thread-terminate.c b/libpthread/sysdeps/mach/pt-thread-terminate.c +index 6672065..129a611 100644 +--- a/libpthread/sysdeps/mach/pt-thread-terminate.c ++++ b/libpthread/sysdeps/mach/pt-thread-terminate.c +@@ -70,9 +70,9 @@ __pthread_thread_terminate (struct __pthread *thread) + __mach_port_destroy (__mach_task_self (), wakeup_port); + + /* Terminate and release all that's left. */ +- err = __thread_terminate_release (kernel_thread, mach_task_self (), +- kernel_thread, reply_port, +- stackaddr, stacksize); ++ /* err = __thread_terminate_release (kernel_thread, mach_task_self (), */ ++ /* kernel_thread, reply_port, */ ++ /* stackaddr, stacksize); */ + + /* The kernel does not support it yet. Leak but at least terminate + correctly. */ +-- +1.9.2 + +The __PTHREAD_SPIN_LOCK_INITIALIZER definition is missing, so we +define it to __SPIN_LOCK_INITIALIZER which already exists. +See . + +diff --git a/libpthread/sysdeps/mach/bits/spin-lock.h b/libpthread/sysdeps/mach/bits/spin-lock.h +index 537dac9..fca0e5a 100644 +--- a/libpthread/sysdeps/mach/bits/spin-lock.h ++++ b/libpthread/sysdeps/mach/bits/spin-lock.h +@@ -30,7 +30,7 @@ typedef __spin_lock_t __pthread_spinlock_t; + + /* Initializer for a spin lock object. */ + #ifndef __PTHREAD_SPIN_LOCK_INITIALIZER +-#error __PTHREAD_SPIN_LOCK_INITIALIZER undefined: should be defined by . ++#define __PTHREAD_SPIN_LOCK_INITIALIZER __SPIN_LOCK_INITIALIZER + #endif + + __END_DECLS + +The version of the glibc we use doesn't include the shm-directory.c file and does +not yet support IS_IN. +See + +diff --git a/libpthread/Makefile b/libpthread/Makefile +index 2906788..b8dee58 100644 +--- a/libpthread/Makefile ++++ b/libpthread/Makefile +@@ -149,8 +149,6 @@ libpthread-routines := pt-attr pt-attr-destroy pt-attr-getdetachstate \ + sem-post sem-timedwait sem-trywait sem-unlink \ + sem-wait \ + \ +- shm-directory \ +- \ + cthreads-compat \ + $(SYSDEPS) + +-- +2.3.6 + +diff --git a/libpthread/pthread/pt-create.c b/libpthread/pthread/pt-create.c +index d88afae..84044dc 100644 +--- a/libpthread/pthread/pt-create.c ++++ b/libpthread/pthread/pt-create.c +@@ -28,7 +28,7 @@ + + #include + +-#if IS_IN (libpthread) ++#ifdef IS_IN_libpthread + # include + #endif + #ifdef HAVE_USELOCALE +@@ -50,7 +50,7 @@ entry_point (struct __pthread *self, void *(*start_routine)(void *), void *arg) + __resp = &self->res_state; + #endif + +-#if IS_IN (libpthread) ++#ifdef IS_IN_libpthread + /* Initialize pointers to locale data. */ + __ctype_init (); + #endif +diff --git a/libpthread/pthread/pt-initialize.c b/libpthread/pthread/pt-initialize.c +index 9e5404b..b9cacbd 100644 +--- a/libpthread/pthread/pt-initialize.c ++++ b/libpthread/pthread/pt-initialize.c +@@ -28,7 +28,7 @@ + + DEFINE_HOOK (__pthread_init, (void)); + +-#if IS_IN (libpthread) ++#ifdef IS_IN_libpthread + static const struct pthread_functions pthread_functions = + { + .ptr_pthread_attr_destroy = __pthread_attr_destroy, +@@ -81,7 +81,7 @@ static const struct pthread_functions pthread_functions = + void + ___pthread_init (void) + { +-#if IS_IN (libpthread) ++#ifdef IS_IN_libpthread + __libc_pthread_init(&pthread_functions); + #endif + RUN_HOOK (__pthread_init, ()); +diff --git a/libpthread/pthread/pt-internal.h b/libpthread/pthread/pt-internal.h +index 18b5b4c..8cdcfce 100644 +--- a/libpthread/pthread/pt-internal.h ++++ b/libpthread/pthread/pt-internal.h +@@ -35,7 +35,7 @@ + #include + #include + +-#if IS_IN (libpthread) ++#ifdef IS_IN_libpthread + # include + #endif + +@@ -60,7 +60,7 @@ enum pthread_state + # define PTHREAD_SYSDEP_MEMBERS + #endif + +-#if !(IS_IN (libpthread)) ++#ifndef IS_IN_libpthread + #ifdef ENABLE_TLS + /* Type of the TCB. */ + typedef struct -- 2.3.6