summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--gnu/packages/base.scm6
-rw-r--r--gnu/packages/bootstrap.scm1
-rw-r--r--gnu/packages/cross-base.scm243
-rw-r--r--gnu/packages/curl.scm13
-rw-r--r--gnu/packages/linux.scm25
-rw-r--r--gnu/packages/multiprecision.scm11
-rw-r--r--gnu/packages/openldap.scm16
-rw-r--r--gnu/packages/patches/gcc-cross-environment-variables.patch24
-rw-r--r--gnu/packages/wget.scm7
-rw-r--r--guix/build/gnu-build-system.scm3
-rw-r--r--guix/build/utils.scm34
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~%"