diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | gnu/packages/base.scm | 6 | ||||
-rw-r--r-- | gnu/packages/bootstrap.scm | 1 | ||||
-rw-r--r-- | gnu/packages/cross-base.scm | 243 | ||||
-rw-r--r-- | gnu/packages/curl.scm | 13 | ||||
-rw-r--r-- | gnu/packages/linux.scm | 25 | ||||
-rw-r--r-- | gnu/packages/multiprecision.scm | 11 | ||||
-rw-r--r-- | gnu/packages/openldap.scm | 16 | ||||
-rw-r--r-- | gnu/packages/patches/gcc-cross-environment-variables.patch | 24 | ||||
-rw-r--r-- | gnu/packages/wget.scm | 7 | ||||
-rw-r--r-- | guix/build/gnu-build-system.scm | 3 | ||||
-rw-r--r-- | guix/build/utils.scm | 34 |
12 files changed, 322 insertions, 63 deletions
diff --git a/Makefile.am b/Makefile.am index c56bc41226..c9dcc4a356 100644 --- a/Makefile.am +++ b/Makefile.am @@ -68,6 +68,7 @@ MODULES = \ gnu/packages/check.scm \ gnu/packages/compression.scm \ gnu/packages/cpio.scm \ + gnu/packages/cross-base.scm \ gnu/packages/curl.scm \ gnu/packages/cyrus-sasl.scm \ gnu/packages/dejagnu.scm \ @@ -189,6 +190,7 @@ dist_patch_DATA = \ gnu/packages/patches/flac-fix-memcmp-not-declared.patch \ gnu/packages/patches/flex-bison-tests.patch \ gnu/packages/patches/gawk-shell.patch \ + gnu/packages/patches/gcc-cross-environment-variables.patch \ gnu/packages/patches/gettext-gets-undeclared.patch \ gnu/packages/patches/glib-tests-desktop.patch \ gnu/packages/patches/glib-tests-homedir.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 23bf00b241..5aeb050863 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -412,8 +412,8 @@ BFD (Binary File Descriptor) library, `gprof', `nm', `strip', etc.") #:make-flags (let ((libc (assoc-ref %build-inputs "libc"))) `(,@(if libc - (list (string-append "LDFLAGS_FOR_BUILD=" - "-L" libc "/lib " + (list (string-append "LDFLAGS_FOR_TARGET=" + "-B" libc "/lib " "-Wl,-dynamic-linker " "-Wl," libc ,(glibc-dynamic-linker))) @@ -449,7 +449,7 @@ BFD (Binary File Descriptor) library, `gprof', `nm', `strip', etc.") ;; RUNPATH to GCC even when `libgcc_s' is not NEEDED. ;; There's not much that can be done to avoid it, though. (format #f "#define LIB_SPEC \"-L~a/lib %{!static:-rpath=~a/lib \ -%{!static-libgcc:-rpath=~a/lib64 -rpath=~a/lib}} \" ~a~%" +%{!static-libgcc:-rpath=~a/lib64 -rpath=~a/lib}} \" ~a" libc libc out out suffix)) (("#define STARTFILE_SPEC.*$" line) (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\" diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm index 22ee98879a..809eb84295 100644 --- a/gnu/packages/bootstrap.scm +++ b/gnu/packages/bootstrap.scm @@ -134,6 +134,7 @@ check whether everything is alright." "Return the name of Glibc's dynamic linker for SYSTEM." (cond ((string=? system "x86_64-linux") "/lib/ld-linux-x86-64.so.2") ((string=? system "i686-linux") "/lib/ld-linux.so.2") + ((string=? system "mips64el-linux") "/lib/ld.so.1") (else (error "dynamic linker name not known for this system" system)))) diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm new file mode 100644 index 0000000000..69dc9f5b0b --- /dev/null +++ b/gnu/packages/cross-base.scm @@ -0,0 +1,243 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu packages cross-base) + #:use-module (guix licenses) + #:use-module (gnu packages) + #:use-module (gnu packages base) + #:use-module (gnu packages linux) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix utils) + #:use-module (guix build-system gnu) + #:use-module (guix build-system trivial) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (ice-9 match)) + +(define (cross p target) + (package (inherit p) + (location (source-properties->location (current-source-location))) + (name (string-append (package-name p) "-cross-" target)) + (arguments + (substitute-keyword-arguments (package-arguments p) + ((#:configure-flags flags) + `(cons ,(string-append "--target=" target) + ,flags)))))) + +(define cross-binutils + (cut cross binutils <>)) + +(define* (cross-gcc target + #:optional (xbinutils (cross-binutils target)) libc) + "Return a cross-compiler for TARGET, where TARGET is a GNU triplet. Use +XBINUTILS as the associated cross-Binutils. If LIBC is false, then build a +GCC that does not target a libc; otherwise, target that libc." + (define args + ;; Get the arguments as if we were building for TARGET. In particular, we + ;; want `glibc-dynamic-linker' to return the right thing. + (parameterize ((%current-system (gnu-triplet->nix-system target))) + (package-arguments gcc-4.7))) + + (package (inherit gcc-4.7) + (name (string-append "gcc-cross-" + (if libc "" "sans-libc-") + target)) + (arguments + `(#:implicit-inputs? #f + #:modules ((guix build gnu-build-system) + (guix build utils) + (ice-9 regex) + (srfi srfi-1) + (srfi srfi-26)) + #:patches (list (assoc-ref %build-inputs "patch/cross-env-vars")) + + ,@(substitute-keyword-arguments args + ((#:configure-flags flags) + `(append (list ,(string-append "--target=" target) + ,@(if libc + '() + `( ;; Disable features not needed at this stage. + "--disable-shared" "--enable-static" + + ;; Disable C++ because libstdc++'s + ;; configure script otherwise fails with + ;; "Link tests are not allowed after + ;; GCC_NO_EXECUTABLES." + "--enable-languages=c" + + "--disable-threads" ; libgcc, would need libc + "--disable-libmudflap" + "--disable-libgomp" + "--disable-libssp" + "--disable-libquadmath" + "--disable-decimal-float" ; would need libc + ))) + + ,(if libc + flags + `(remove (cut string-match "--enable-languages.*" <>) + ,flags)))) + ((#:make-flags flags) + (if libc + `(let ((libc (assoc-ref %build-inputs "libc"))) + ;; FLAGS_FOR_TARGET are needed for the target libraries to + ;; receive the -Bxxx for the startfiles. + (cons (string-append "FLAGS_FOR_TARGET=-B" libc "/lib") + ,flags)) + flags)) + ((#:phases phases) + (let ((phases + `(alist-cons-after + 'install 'make-cross-binutils-visible + (lambda* (#:key outputs inputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (libexec (string-append out "/libexec/gcc/" + ,target)) + (binutils (string-append + (assoc-ref inputs "binutils-cross") + "/bin/" ,target "-"))) + (for-each (lambda (file) + (symlink (string-append binutils file) + (string-append libexec "/" + file))) + '("as" "ld" "nm")) + #t)) + ,phases))) + (if libc + `(alist-cons-before + 'configure 'set-cross-path + (lambda* (#:key inputs #:allow-other-keys) + ;; Add the cross Linux headers to CROSS_CPATH, and remove + ;; them from CPATH. + (let ((libc (assoc-ref inputs "libc")) + (linux (assoc-ref inputs + "libc/cross-linux-headers"))) + (define (cross? x) + ;; Return #t if X is a cross-libc or cross Linux. + (or (string-prefix? libc x) + (string-prefix? linux x))) + + (setenv "CROSS_CPATH" + (string-append libc "/include:" + linux "/include")) + (setenv "CROSS_LIBRARY_PATH" + (string-append libc "/lib")) + + (let ((cpath (search-path-as-string->list + (getenv "CPATH"))) + (libpath (search-path-as-string->list + (getenv "LIBRARY_PATH")))) + (setenv "CPATH" + (list->search-path-as-string + (remove cross? cpath) ":")) + (setenv "LIBRARY_PATH" + (list->search-path-as-string + (remove cross? libpath) ":")) + #t))) + ,phases) + phases))) + ((#:strip-binaries? _) + ;; Disable stripping as this can break binaries, with object files + ;; of libgcc.a showing up as having an unknown architecture. See + ;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html> + ;; for instance. + #f)))) + (inputs + `(("patch/cross-env-vars" + ,(search-patch "gcc-cross-environment-variables.patch")) + + ("binutils-cross" ,xbinutils) + + ;; Call it differently so that the builder can check whether the "libc" + ;; input is #f. + ("libc-native" ,@(assoc-ref %final-inputs "libc")) + + ;; Remaining inputs. + ,@(let ((inputs (append (package-inputs gcc-4.7) + (alist-delete "libc" %final-inputs)))) + (if libc + `(("libc" ,libc) + ,@inputs) + inputs)))))) + +(define* (cross-libc target + #:optional + (xgcc (cross-gcc target)) + (xbinutils (cross-binutils target))) + "Return a libc cross-built for TARGET, a GNU triplet. Use XGCC and +XBINUTILS and the cross tool chain." + (define xlinux-headers + (package (inherit linux-libre-headers) + (name (string-append (package-name linux-libre-headers) + "-cross-" target)) + (arguments + (substitute-keyword-arguments (package-arguments linux-libre-headers) + ((#:phases phases) + `(alist-replace + 'build + (lambda _ + (setenv "ARCH" ,(system->linux-architecture target)) + (format #t "`ARCH' set to `~a' (cross compiling)~%" (getenv "ARCH")) + + (and (zero? (system* "make" "defconfig")) + (zero? (system* "make" "mrproper" "headers_check")))) + ,phases)))) + (inputs `(("cross-gcc" ,xgcc) + ("cross-binutils" ,xbinutils) + ,@(package-inputs linux-libre-headers))))) + + (package (inherit glibc) + (name (string-append "glibc-cross-" target)) + (arguments + (substitute-keyword-arguments + `(#:strip-binaries? #f ; disable stripping (see above) + ,@(package-arguments glibc)) + ((#:configure-flags flags) + `(cons ,(string-append "--host=" target) + ,flags)) + ((#:phases phases) + `(alist-cons-before + 'configure 'set-cross-linux-headers-path + (lambda* (#:key inputs #:allow-other-keys) + (let ((linux (assoc-ref inputs "cross-linux-headers"))) + (setenv "CROSS_CPATH" + (string-append linux "/include")) + #t)) + ,phases)))) + (propagated-inputs `(("cross-linux-headers" ,xlinux-headers))) + (inputs `(("cross-gcc" ,xgcc) + ("cross-binutils" ,xbinutils) + ,@(package-inputs glibc))))) + + +;;; +;;; Concrete cross toolchains. +;;; + +(define-public xgcc-mips64el + (let ((triplet "mips64el-linux-gnu")) + (cross-gcc triplet + (cross-binutils triplet) + (cross-libc triplet)))) + +;; (define-public xgcc-armel +;; (let ((triplet "armel-linux-gnueabi")) +;; (cross-gcc triplet +;; (cross-binutils triplet) +;; (cross-libc triplet)))) diff --git a/gnu/packages/curl.scm b/gnu/packages/curl.scm index 00fd0f3232..4f5d96087e 100644 --- a/gnu/packages/curl.scm +++ b/gnu/packages/curl.scm @@ -55,18 +55,7 @@ ("pkg-config" ,pkg-config) ("zlib" ,zlib))) (arguments - `(#:configure-flags '("--with-gnutls" "--with-gssapi") - #:phases - (alist-replace - 'unpack - (lambda* (#:key #:allow-other-keys #:rest args) - (let ((unpack (assoc-ref %standard-phases 'unpack))) - (apply unpack args) - ;; The following patch-shebang phase will replace perl - ;; by the correct path. - (substitute* "tests/runtests.pl" - (("#!/usr/bin/env perl") "#!/usr/bin/perl")))) - %standard-phases))) + `(#:configure-flags '("--with-gnutls" "--with-gssapi"))) (synopsis "curl, command line tool for transferring data with URL syntax") (description "curl is a command line tool for transferring data with URL syntax, diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index b97315580b..b687e363f6 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -31,18 +31,25 @@ #:use-module (guix download) #:use-module (guix build-system gnu)) +(define-public (system->linux-architecture arch) + "Return the Linux architecture name for ARCH, a Guix system name such as +\"x86_64-linux\"." + (let ((arch (car (string-split arch #\-)))) + (cond ((string=? arch "i686") "i386") + ((string-prefix? "mips" arch) "mips") + ((string-prefix? "arm" arch) "arm") + (else arch)))) + (define-public linux-libre-headers (let* ((version* "3.3.8") (build-phase - '(lambda* (#:key system #:allow-other-keys) - (let ((arch (car (string-split system #\-)))) - (setenv "ARCH" - (cond ((string=? arch "i686") "i386") - (else arch))) - (format #t "`ARCH' set to `~a'~%" (getenv "ARCH"))) + (lambda (arch) + `(lambda _ + (setenv "ARCH" ,(system->linux-architecture arch)) + (format #t "`ARCH' set to `~a'~%" (getenv "ARCH")) - (and (zero? (system* "make" "defconfig")) - (zero? (system* "make" "mrproper" "headers_check"))))) + (and (zero? (system* "make" "defconfig")) + (zero? (system* "make" "mrproper" "headers_check")))))) (install-phase `(lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) @@ -73,7 +80,7 @@ (guix build utils) (srfi srfi-1)) #:phases (alist-replace - 'build ,build-phase + 'build ,(build-phase (%current-system)) (alist-replace 'install ,install-phase (alist-delete 'configure %standard-phases))) diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm index 7778552b40..5e0dee0620 100644 --- a/gnu/packages/multiprecision.scm +++ b/gnu/packages/multiprecision.scm @@ -27,18 +27,15 @@ (define-public gmp (package (name "gmp") - (version "5.1.0") + (version "5.1.1") (source (origin (method url-fetch) (uri - ;; Note: this version is not available from GNU mirrors - ;; because it was made with an Automake affected by - ;; CVE-2012-3386. - (string-append "ftp://ftp.gmplib.org/pub/gmp-" - version "/gmp-" version ".tar.bz2")) + (string-append "mirror://gnu/gmp/gmp-" + version ".tar.xz")) (sha256 (base32 - "15n7xxgasbxdch8ii8z9ic6fxc2ysk3q8iavf55abjp5iylspnfz")))) + "1hili06lcf0clg5qfvz7knm6pmj6ab54yhsvskp1mdny5xw4vmjb")))) (build-system gnu-build-system) (native-inputs `(("m4" ,m4))) (arguments `(#:configure-flags diff --git a/gnu/packages/openldap.scm b/gnu/packages/openldap.scm index d2525a6310..a4a28ccf1b 100644 --- a/gnu/packages/openldap.scm +++ b/gnu/packages/openldap.scm @@ -55,7 +55,7 @@ ("libtool" ,libtool "bin") ("zlib" ,zlib))) (arguments - `(#:parallel-tests? #f + `(#:tests? #f #:phases (alist-replace 'configure @@ -63,19 +63,7 @@ (let ((configure (assoc-ref %standard-phases 'configure))) (apply configure args) (copy-file (which "libtool") "libtool"))) - (alist-replace - 'check - (lambda* (#:key #:allow-other-keys #:rest args) - (let ((check (assoc-ref %standard-phases 'check))) - (for-each (lambda (f) - (substitute* (string-append "tests/scripts/" f) - (("/bin/rm") "rm"))) - '("all" "its-all" "passwd-search" "sql-all" "test027-emptydn")) - ;; disable especially finicky tests - (delete-file "tests/scripts/test058-syncrepl-asymmetric") - (delete-file "tests/scripts/test061-syncreplication-initiation") - (apply check args))) - %standard-phases)))) + %standard-phases))) (synopsis "openldap, an implementation of the Lightweight Directory Access Protocol") (description "OpenLDAP is a free implementation of the Lightweight Directory Access Protocol.") diff --git a/gnu/packages/patches/gcc-cross-environment-variables.patch b/gnu/packages/patches/gcc-cross-environment-variables.patch new file mode 100644 index 0000000000..30a07ec3db --- /dev/null +++ b/gnu/packages/patches/gcc-cross-environment-variables.patch @@ -0,0 +1,24 @@ +Search path environment variables for cross-compilers. See the discussion +at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>. + +--- gcc-4.7.2/gcc/incpath.c 2012-01-27 00:34:58.000000000 +0100 ++++ gcc-4.7.2/gcc/incpath.c 2013-02-12 10:11:27.000000000 +0100 +@@ -452,7 +452,7 @@ register_include_chains (cpp_reader *pfi + + /* CPATH and language-dependent environment variables may add to the + include chain. */ +- add_env_var_paths ("CPATH", BRACKET); ++ add_env_var_paths ("CROSS_CPATH", BRACKET); + add_env_var_paths (lang_env_vars[idx], SYSTEM); + + target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc); + +--- gcc-4.7.2/gcc/system.h 2012-02-17 00:16:28.000000000 +0100 ++++ gcc-4.7.2/gcc/system.h 2013-02-12 10:22:17.000000000 +0100 +@@ -1023,4 +1023,6 @@ helper_const_non_const_cast (const char + #define DEBUG_VARIABLE + #endif + ++#define LIBRARY_PATH_ENV "CROSS_LIBRARY_PATH" ++ + #endif /* ! GCC_SYSTEM_H */ diff --git a/gnu/packages/wget.scm b/gnu/packages/wget.scm index ea31a1e70d..1f2f53c97f 100644 --- a/gnu/packages/wget.scm +++ b/gnu/packages/wget.scm @@ -43,13 +43,6 @@ `(("gnutls" ,gnutls) ("perl" ,perl) ("gettext" ,guix:gettext))) - (arguments - '(#:phases - (alist-cons-before 'build 'patch-/usr/bin/env - (lambda _ - (for-each patch-shebang - '("doc/texi2pod.pl" "tests/run-px"))) - %standard-phases))) (home-page "http://www.gnu.org/software/wget/") (synopsis "GNU Wget, a tool for retrieving files using HTTP, HTTPS, and FTP") diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm index b7b9fdac95..8fc6f86507 100644 --- a/guix/build/gnu-build-system.scm +++ b/guix/build/gnu-build-system.scm @@ -73,7 +73,8 @@ ;; FIXME: Eventually move this to the `search-paths' field of the ;; `pkg-config' package. (set-path-environment-variable "PKG_CONFIG_PATH" - '("lib/pkgconfig" "lib64/pkgconfig") + '("lib/pkgconfig" "lib64/pkgconfig" + "share/pkgconfig") (relevant-input-directories "PKG_CONFIG_PATH")) ;; Dump the environment variables as a shell script, for handy debugging. diff --git a/guix/build/utils.scm b/guix/build/utils.scm index 6921e31bdd..d17346607f 100644 --- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,7 +52,7 @@ fold-port-matches remove-store-references)) - + ;;; ;;; Directories. ;;; @@ -426,7 +427,7 @@ bytes transferred and the continuation of the transfer as a thunk." (stat:mtimensec stat))) (define patch-shebang - (let ((shebang-rx (make-regexp "^[[:blank:]]*([[:graph:]]+)(.*)$"))) + (let ((shebang-rx (make-regexp "^[[:blank:]]*([[:graph:]]+)[[:blank:]]*([[:graph:]]*)(.*)$"))) (lambda* (file #:optional (path (search-path-as-string->list (getenv "PATH"))) @@ -465,16 +466,29 @@ FILE are kept unchanged." (let ((line (false-if-exception (read-line p)))) (and=> (and line (regexp-exec shebang-rx line)) (lambda (m) - (let* ((cmd (match:substring m 1)) - (bin (search-path path (basename cmd)))) + (let* ((interp (match:substring m 1)) + (arg1 (match:substring m 2)) + (rest (match:substring m 3)) + (has-env (string-suffix? "/env" interp)) + (cmd (if has-env arg1 (basename interp))) + (bin (search-path path cmd))) (if bin - (if (string=? bin cmd) + (if (string=? bin interp) #f ; nothing to do - (begin - (format (current-error-port) - "patch-shebang: ~a: changing `~a' to `~a'~%" - file cmd bin) - (patch p bin (match:substring m 2)))) + (if has-env + (begin + (format (current-error-port) + "patch-shebang: ~a: changing `~a' to `~a'~%" + file (string-append interp " " arg1) bin) + (patch p bin rest)) + (begin + (format (current-error-port) + "patch-shebang: ~a: changing `~a' to `~a'~%" + file interp bin) + (patch p bin + (if (string-null? arg1) + "" + (string-append " " arg1 rest)))))) (begin (format (current-error-port) "patch-shebang: ~a: warning: no binary for interpreter `~a' found in $PATH~%" |