gnu: gcc-5.1: Add specific libvtv patch.
[jackhill/guix/guix.git] / gnu / packages / gcc.scm
dissimilarity index 62%
index 878d246..4512e54 100644 (file)
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 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 gcc)
-  #:use-module (guix licenses)
-  #:use-module (gnu packages)
-  #:use-module (gnu packages bootstrap)
-  #:use-module (gnu packages compression)
-  #:use-module (gnu packages multiprecision)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix build-system gnu))
-
-(define %gcc-infrastructure
-  ;; Base URL for GCC's infrastructure.
-  "ftp://gcc.gnu.org/pub/gcc/infrastructure/")
-
-(define-public gcc-4.7
-  (let ((stripped? #t))                         ; TODO: make this a parameter
-    (package
-     (name "gcc")
-     (version "4.7.2")
-     (source (origin
-              (method url-fetch)
-              (uri (string-append "mirror://gnu/gcc/gcc-"
-                                  version "/gcc-" version ".tar.bz2"))
-              (sha256
-               (base32
-                "115h03hil99ljig8lkrq4qk426awmzh0g99wrrggxf8g07bq74la"))))
-     (build-system gnu-build-system)
-     (inputs `(("gmp" ,gmp)
-               ("mpfr" ,mpfr)
-               ("mpc" ,mpc)))           ; TODO: libelf, ppl, cloog, zlib, etc.
-     (arguments
-      `(#:out-of-source? #t
-        #:strip-binaries? ,stripped?
-        #:configure-flags
-        `("--enable-plugin"
-          "--enable-languages=c,c++"
-          "--disable-multilib"
-
-          "--with-local-prefix=/no-gcc-local-prefix"
-
-          ,(let ((libc (assoc-ref %build-inputs "libc")))
-             (if libc
-                 (string-append "--with-native-system-header-dir=" libc
-                                "/include")
-                 "--without-headers")))
-        #:make-flags
-        (let ((libc (assoc-ref %build-inputs "libc")))
-          `(,@(if libc
-                  (list (string-append "LDFLAGS_FOR_TARGET="
-                                       "-B" libc "/lib "
-                                       "-Wl,-dynamic-linker "
-                                       "-Wl," libc
-                                       ,(glibc-dynamic-linker)))
-                  '())
-            ,(string-append "BOOT_CFLAGS=-O2 "
-                            ,(if stripped? "-g0" "-g"))))
-
-        #:tests? #f
-        #:phases
-        (alist-cons-before
-         'configure 'pre-configure
-         (lambda* (#:key inputs outputs #:allow-other-keys)
-           (let ((out  (assoc-ref outputs "out"))
-                 (libc (assoc-ref inputs "libc")))
-             (when libc
-               ;; The following is not performed for `--without-headers'
-               ;; cross-compiler builds.
-
-               ;; Fix the dynamic linker's file name.
-               (substitute* (find-files "gcc/config"
-                                        "^linux(64|-elf)?\\.h$")
-                 (("#define GLIBC_DYNAMIC_LINKER([^ ]*).*$" _ suffix)
-                  (format #f "#define GLIBC_DYNAMIC_LINKER~a \"~a\"~%"
-                          suffix
-                          (string-append libc ,(glibc-dynamic-linker)))))
-
-               ;; Tell where to find libstdc++, libc, and `?crt*.o', except
-               ;; `crt{begin,end}.o', which come with GCC.
-               (substitute* (find-files "gcc/config"
-                                        "^(gnu-user(64)?|linux-elf)\\.h$")
-                 (("#define LIB_SPEC (.*)$" _ suffix)
-                  ;; Note that with this "lib" spec, we may still add a
-                  ;; 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"
-                          libc libc out out suffix))
-                 (("#define STARTFILE_SPEC.*$" line)
-                  (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"
-#define STANDARD_STARTFILE_PREFIX_2 \"\"
-~a~%"
-                          libc line))))
-
-             ;; Don't retain a dependency on the build-time sed.
-             (substitute* "fixincludes/fixincl.x"
-               (("static char const sed_cmd_z\\[\\] =.*;")
-                "static char const sed_cmd_z[] = \"sed\";"))))
-
-         (alist-cons-after
-          'configure 'post-configure
-          (lambda _
-            ;; Don't store configure flags, to avoid retaining references to
-            ;; build-time dependencies---e.g., `--with-ppl=/nix/store/xxx'.
-            (substitute* "Makefile"
-              (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
-               "TOPLEVEL_CONFIGURE_ARGUMENTS=\n")))
-          (alist-replace 'install
-                         (lambda* (#:key outputs #:allow-other-keys)
-                           (zero?
-                            (system* "make"
-                                     ,(if stripped?
-                                          "install-strip"
-                                          "install"))))
-                         %standard-phases)))))
-
-     (native-search-paths
-      (list (search-path-specification
-             (variable "CPATH")
-             (directories '("include")))
-            (search-path-specification
-             (variable "LIBRARY_PATH")
-             (directories '("lib" "lib64")))))
-
-     (properties `((gcc-libc . ,(assoc-ref inputs "libc"))))
-     (synopsis "The GNU Compiler Collection")
-     (description
-      "The GNU Compiler Collection includes compiler front ends for C, C++,
-Objective-C, Fortran, OpenMP for C/C++/Fortran, Java, and Ada, as well as
-libraries for these languages (libstdc++, libgcj, libgomp,...).
-
-GCC development is a part of the GNU Project, aiming to improve the compiler
-used in the GNU system including the GNU/Linux variant.")
-     (license gpl3+)
-     (home-page "http://gcc.gnu.org/"))))
-
-(define-public isl
-  (package
-    (name "isl")
-    (version "0.11.1")
-    (source (origin
-             (method url-fetch)
-             (uri (list (string-append
-                         "ftp://ftp.linux.student.kuleuven.be/pub/people/skimo/isl/isl-"
-                         version
-                         ".tar.bz2")
-                        (string-append %gcc-infrastructure
-                                       name "-" version ".tar.gz")))
-             (sha256
-              (base32
-               "13d9cqa5rzhbjq0xf0b2dyxag7pqa72xj9dhsa03m8ccr1a4npq9"))))
-    (build-system gnu-build-system)
-    (inputs `(("gmp" ,gmp)))
-    (home-page "http://www.kotnet.org/~skimo/isl/")
-    (synopsis
-     "A library for manipulating sets and relations of integer points bounded
-by linear constraints")
-    (description
-     "isl is a library for manipulating sets and relations of integer points
-bounded by linear constraints. Supported operations on sets include
-intersection, union, set difference, emptiness check, convex hull, (integer)
-affine hull, integer projection, computing the lexicographic minimum using
-parametric integer programming, coalescing and parametric vertex
-enumeration. It also includes an ILP solver based on generalized basis
-reduction, transitive closures on maps (which may encode infinite graphs),
-dependence analysis and bounds on piecewise step-polynomials.")
-    (license lgpl2.1+)))
-
-(define-public cloog
-  (package
-    (name "cloog")
-    (version "0.18.0")
-    (source
-     (origin
-      (method url-fetch)
-      (uri (list (string-append
-                  "http://www.bastoul.net/cloog/pages/download/count.php3?url=cloog-"
-                  version
-                  ".tar.gz")
-                 (string-append %gcc-infrastructure
-                                name "-" version ".tar.gz")))
-      (sha256
-       (base32
-        "0a12rwfwp22zd0nlld0xyql11cj390rrq1prw35yjsw8wzfshjhw"))
-      (file-name (string-append name "-" version ".tar.gz"))))
-    (build-system gnu-build-system)
-    (inputs `(("gmp" ,gmp)
-              ("isl" ,isl)))
-    (arguments '(#:configure-flags '("--with-isl=system")))
-    (home-page "http://www.cloog.org/")
-    (synopsis "A library to generate code for scanning Z-polyhedra")
-    (description
-     "CLooG is a free software library to generate code for scanning
-Z-polyhedra.  That is, it finds a code (e.g., in C, FORTRAN...) that
-reaches each integral point of one or more parameterized polyhedra.
-CLooG has been originally written to solve the code generation problem
-for optimizing compilers based on the polytope model.  Nevertheless it
-is used now in various area e.g., to build control automata for
-high-level synthesis or to find the best polynomial approximation of a
-function.  CLooG may help in any situation where scanning polyhedra
-matters.  While the user has full control on generated code quality,
-CLooG is designed to avoid control overhead and to produce a very
-effective code.")
-    (license gpl2+)))
-
-(define-public libelf
-  (package
-    (name "libelf")
-    (version "0.8.13")
-    (source (origin
-             (method url-fetch)
-             (uri (string-append "http://www.mr511.de/software/libelf-"
-                                 version ".tar.gz"))
-             (sha256
-              (base32
-               "0vf7s9dwk2xkmhb79aigqm0x0yfbw1j0b9ksm51207qwr179n6jr"))))
-    (build-system gnu-build-system)
-    (arguments '(#:phases (alist-replace
-                           'configure
-                           (lambda* (#:key outputs #:allow-other-keys)
-                             ;; This old `configure' script doesn't support
-                             ;; variables passed as arguments.
-                             (let ((out (assoc-ref outputs "out")))
-                               (setenv "CONFIG_SHELL" (which "bash"))
-                               (zero?
-                                (system* "./configure"
-                                         (string-append "--prefix=" out)))))
-                           %standard-phases)))
-    (home-page "http://www.mr511.de/software/english.html")
-    (synopsis "An ELF object file access library")
-    (description "libelf is a C library to access ELF object files.")
-    (license lgpl2.0+)))
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
+;;;
+;;; 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 gcc)
+  #:use-module ((guix licenses)
+                #:select (gpl3+ gpl2+ lgpl2.1+ lgpl2.0+))
+  #:use-module (gnu packages)
+  #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages elf)
+  #:use-module (gnu packages perl)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system trivial)
+  #:use-module (guix utils)
+  #:use-module (ice-9 regex))
+
+(define %gcc-infrastructure
+  ;; Base URL for GCC's infrastructure.
+  "ftp://gcc.gnu.org/pub/gcc/infrastructure/")
+
+(define (gcc-configure-flags-for-triplet target)
+  "Return a list of additional GCC `configure' flags for TARGET, a GNU triplet.
+
+The purpose of this procedure is to translate extended GNU triplets---e.g.,
+where the OS part is overloaded to denote a specific ABI---into GCC
+`configure' options.  We take extended GNU triplets that glibc recognizes."
+  (cond ((string-match "^mips64el.*gnuabin?64$" target)
+         ;; Triplets recognized by glibc as denoting the N64 ABI; see
+         ;; ports/sysdeps/mips/preconfigure.
+         '("--with-abi=64"))
+
+        ((string-match "^arm.*-gnueabihf$" target)
+         '("--with-arch=armv7-a"
+           "--with-float=hard"
+           "--with-mode=thumb"
+
+           ;; See <https://wiki.debian.org/ArmHardFloatPort/VfpComparison#FPU>
+           "--with-fpu=vfpv3-d16"))
+
+        (else
+         ;; TODO: Add `arm.*-gnueabi', etc.
+         '())))
+
+(define-public gcc-4.7
+  (let* ((stripped? #t)                           ; TODO: make this a parameter
+         (install-target
+          (lambda ()
+            ;; The 'install-strip' rule uses the native 'strip' instead of
+            ;; 'TARGET-strip' when cross-compiling.  Thus, use 'install' in that
+            ;; case.
+            (if (and stripped? (not (%current-target-system)))
+                "install-strip"
+                "install")))
+         (maybe-target-tools
+          (lambda ()
+            ;; Return the `_FOR_TARGET' variables that are needed when
+            ;; cross-compiling GCC.
+            (let ((target (%current-target-system)))
+              (if target
+                  (map (lambda (var tool)
+                         (string-append (string-append var "_FOR_TARGET")
+                                        "=" target "-" tool))
+                       '("CC"  "CXX" "LD" "AR" "NM" "RANLIB" "STRIP")
+                       '("gcc" "g++" "ld" "ar" "nm" "ranlib" "strip"))
+                  '()))))
+         (libdir
+          (let ((base '(or (assoc-ref outputs "lib")
+                           (assoc-ref outputs "out"))))
+            (lambda ()
+              ;; Return the directory that contains lib/libgcc_s.so et al.
+              (if (%current-target-system)
+                  `(string-append ,base "/" ,(%current-target-system))
+                  base))))
+         (configure-flags
+          (lambda ()
+            ;; This is terrible.  Since we have two levels of quasiquotation,
+            ;; we have to do this convoluted thing just so we can insert the
+            ;; contents of (maybe-target-tools).
+            (list 'quasiquote
+                  (append
+                   '("--enable-plugin"
+                     "--enable-languages=c,c++"
+                     "--disable-multilib"
+
+                     ;; No pre-compiled libstdc++ headers, to save space.
+                     "--disable-libstdcxx-pch"
+
+                     "--with-local-prefix=/no-gcc-local-prefix"
+
+                     ;; With a separate "lib" output, the build system
+                     ;; incorrectly guesses GPLUSPLUS_INCLUDE_DIR, so force
+                     ;; it.  (Don't use a versioned sub-directory, that's
+                     ;; unnecessary.)
+                     ,(string-append "--with-gxx-include-dir="
+                                     (assoc-ref %outputs "out")
+                                     "/include/c++")
+
+                     ,(let ((libc (assoc-ref %build-inputs "libc")))
+                        (if libc
+                            (string-append "--with-native-system-header-dir=" libc
+                                           "/include")
+                            "--without-headers")))
+
+                   ;; Pass the right options for the target triplet.
+                   (let ((triplet
+                          (or (%current-target-system)
+                              (nix-system->gnu-triplet (%current-system)))))
+                     (gcc-configure-flags-for-triplet triplet))
+
+                   (maybe-target-tools))))))
+    (package
+      (name "gcc")
+      (version "4.7.4")
+      (source (origin
+               (method url-fetch)
+               (uri (string-append "mirror://gnu/gcc/gcc-"
+                                   version "/gcc-" version ".tar.bz2"))
+               (sha256
+                (base32
+                 "10k2k71kxgay283ylbbhhs51cl55zn2q38vj5pk4k950qdnirrlj"))))
+      (build-system gnu-build-system)
+
+      ;; Separate out the run-time support libraries because all the
+      ;; dynamic-linked objects depend on it.
+      (outputs '("out"                     ; commands, etc. (60+ MiB)
+                 "lib"))                   ; libgcc_s, libgomp, etc. (15+ MiB)
+
+      (inputs `(("gmp" ,gmp)
+                ("mpfr" ,mpfr)
+                ("mpc" ,mpc)
+                ("isl" ,isl)
+                ("cloog" ,cloog)
+                ("libelf" ,libelf)
+                ("zlib" ,zlib)))
+
+      ;; GCC is one of the few packages that doesn't ship .info files.
+      (native-inputs `(("texinfo" ,texinfo)))
+
+      (arguments
+       `(#:out-of-source? #t
+         #:strip-binaries? ,stripped?
+         #:configure-flags ,(configure-flags)
+         #:make-flags
+         ;; None of the flags below are needed when doing a Canadian cross.
+         ;; TODO: Simplify this.
+         ,(if (%current-target-system)
+              (if stripped?
+                  ''("CFLAGS=-g0 -O2")
+                  ''())
+              `(let* ((libc        (assoc-ref %build-inputs "libc"))
+                      (libc-native (or (assoc-ref %build-inputs "libc-native")
+                                       libc)))
+                 `(,@(if libc
+                         (list (string-append "LDFLAGS_FOR_TARGET="
+                                              "-B" libc "/lib "
+                                              "-Wl,-dynamic-linker "
+                                              "-Wl," libc
+                                              ,(glibc-dynamic-linker)))
+                         '())
+
+                   ;; Native programs like 'genhooks' also need that right.
+                   ,(string-append "LDFLAGS="
+                                   "-Wl,-rpath=" libc-native "/lib "
+                                   "-Wl,-dynamic-linker "
+                                   "-Wl," libc-native ,(glibc-dynamic-linker))
+                   ,(string-append "BOOT_CFLAGS=-O2 "
+                                   ,(if stripped? "-g0" "-g")))))
+
+         #:tests? #f
+
+         #:phases
+         (alist-cons-before
+          'configure 'pre-configure
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            (let ((libdir ,(libdir))
+                  (libc   (assoc-ref inputs "libc")))
+              (when libc
+                ;; The following is not performed for `--without-headers'
+                ;; cross-compiler builds.
+
+                ;; Join multi-line definitions of GLIBC_DYNAMIC_LINKER* into a
+                ;; single line, to allow the next step to work properly.
+                (for-each
+                 (lambda (x)
+                   (substitute* (find-files "gcc/config"
+                                            "^linux(64|-elf|-eabi)?\\.h$")
+                     (("(#define GLIBC_DYNAMIC_LINKER.*)\\\\\n$" _ line)
+                      line)))
+                 '(1 2 3))
+
+                ;; Fix the dynamic linker's file name.
+                (substitute* (find-files "gcc/config"
+                                         "^linux(64|-elf|-eabi)?\\.h$")
+                  (("#define GLIBC_DYNAMIC_LINKER([^ ]*).*$" _ suffix)
+                   (format #f "#define GLIBC_DYNAMIC_LINKER~a \"~a\"~%"
+                           suffix
+                           (string-append libc ,(glibc-dynamic-linker)))))
+
+                ;; Tell where to find libstdc++, libc, and `?crt*.o', except
+                ;; `crt{begin,end}.o', which come with GCC.
+                (substitute* (find-files "gcc/config"
+                                         "^gnu-user.*\\.h$")
+                  (("#define GNU_USER_TARGET_LIB_SPEC (.*)$" _ suffix)
+                   ;; Help libgcc_s.so be found (see also below.)  Always use
+                   ;; '-lgcc_s' so that libgcc_s.so is always found by those
+                   ;; programs that use 'pthread_cancel' (glibc dlopens
+                   ;; libgcc_s.so when pthread_cancel support is needed, but
+                   ;; having it in the application's RUNPATH isn't enough; see
+                   ;; <http://sourceware.org/ml/libc-help/2013-11/msg00023.html>.)
+                   ;;
+                   ;; NOTE: The '-lgcc_s' added below needs to be removed in a
+                   ;; later phase of %gcc-static.  If you change the string
+                   ;; below, make sure to update the relevant code in
+                   ;; %gcc-static package as needed.
+                   (format #f "#define GNU_USER_TARGET_LIB_SPEC \
+\"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib64 -rpath=~a/lib -lgcc_s}} \" ~a"
+                           libc libc libdir libdir suffix))
+                  (("#define GNU_USER_TARGET_STARTFILE_SPEC.*$" line)
+                   (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"
+#define STANDARD_STARTFILE_PREFIX_2 \"\"
+~a"
+                           libc line))))
+
+              ;; Don't retain a dependency on the build-time sed.
+              (substitute* "fixincludes/fixincl.x"
+                (("static char const sed_cmd_z\\[\\] =.*;")
+                 "static char const sed_cmd_z[] = \"sed\";"))
+
+              ;; Add a RUNPATH to libstdc++.so so that it finds libgcc_s.
+              ;; See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=32354>
+              ;; and <http://bugs.gnu.org/20358>.
+              (substitute* "libstdc++-v3/src/Makefile.in"
+                (("^OPT_LDFLAGS = ")
+                 "OPT_LDFLAGS = -Wl,-rpath=$(libdir) "))
+
+              ;; Move libstdc++*-gdb.py to the "lib" output to avoid a
+              ;; circularity between "out" and "lib".  (Note:
+              ;; --with-python-dir is useless because it imposes $(prefix) as
+              ;; the parent directory.)
+              (substitute* "libstdc++-v3/python/Makefile.in"
+                (("pythondir = .*$")
+                 (string-append "pythondir = " libdir "/share"
+                                "/gcc-$(gcc_version)/python\n")))
+
+              ;; Avoid another circularity between the outputs: this #define
+              ;; ends up in auto-host.h in the "lib" output, referring to
+              ;; "out".  (This variable is used to augment cpp's search path,
+              ;; but there's nothing useful to look for here.)
+              (substitute* "gcc/config.in"
+                (("PREFIX_INCLUDE_DIR")
+                 "PREFIX_INCLUDE_DIR_isnt_necessary_here"))))
+
+          (alist-cons-after
+           'configure 'post-configure
+           (lambda _
+             ;; Don't store configure flags, to avoid retaining references to
+             ;; build-time dependencies---e.g., `--with-ppl=/gnu/store/xxx'.
+             (substitute* "Makefile"
+               (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
+                "TOPLEVEL_CONFIGURE_ARGUMENTS=\n")))
+           (alist-replace 'install
+                          (lambda* (#:key outputs #:allow-other-keys)
+                            (zero?
+                             (system* "make" ,(install-target))))
+                          %standard-phases)))))
+
+      (native-search-paths
+       (list (search-path-specification
+              (variable "CPATH")
+              (files '("include")))
+             (search-path-specification
+              (variable "LIBRARY_PATH")
+              (files '("lib" "lib64")))))
+
+      (properties `((gcc-libc . ,(assoc-ref inputs "libc"))))
+      (synopsis "GNU Compiler Collection")
+      (description
+       "GCC is the GNU Compiler Collection.  It provides compiler front-ends
+for several languages, including C, C++, Objective-C, Fortran, Java, Ada, and
+Go.  It also includes runtime support libraries for these languages.")
+      (license gpl3+)
+      (home-page "http://gcc.gnu.org/"))))
+
+(define-public gcc-4.8
+  (package (inherit gcc-4.7)
+    (version "4.8.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/gcc/gcc-"
+                                  version "/gcc-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "15c6gwm6dzsaagamxkak5smdkf1rdfbqqjs9jdbrp3lbg4ism02a"))
+
+              ;; ARM 'link' spec issue reported at
+              ;; <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65711> and
+              ;; <https://gcc.gnu.org/ml/gcc-patches/2015-04/msg01387.html>.
+              (patches (list (search-patch "gcc-arm-link-spec-fix.patch")))))))
+
+(define-public gcc-4.9
+  (package (inherit gcc-4.8)
+    (version "4.9.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/gcc/gcc-"
+                                  version "/gcc-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "1pbjp4blk2ycaa6r3jmw4ky5f1s9ji3klbqgv8zs2sl5jn1cj810"))
+              (patches (map search-patch
+                            '("gcc-arm-link-spec-fix.patch"
+                              "gcc-libvtv-runpath.patch")))))))
+
+(define-public gcc-5.1
+  (package (inherit gcc-4.9)
+    (version "5.1.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/gcc/gcc-"
+                                  version "/gcc-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "1bd5vj4px3s8nlakbgrh38ynxq4s654m6nxz7lrj03mvkkwgvnmp"))
+              (patches (map search-patch
+                            '("gcc-arm-link-spec-fix.patch"
+                              "gcc-5.0-libvtv-runpath.patch")))))))
+
+(define* (custom-gcc gcc name languages #:key (separate-lib-output? #t))
+  "Return a custom version of GCC that supports LANGUAGES."
+  (package (inherit gcc)
+    (name name)
+    (outputs (if separate-lib-output?
+                 (package-outputs gcc)
+                 (delete "lib" (package-outputs gcc))))
+    (arguments
+     (substitute-keyword-arguments `(#:modules ((guix build gnu-build-system)
+                                                (guix build utils)
+                                                (ice-9 regex)
+                                                (srfi srfi-1)
+                                                (srfi srfi-26))
+                                               ,@(package-arguments gcc))
+       ((#:configure-flags flags)
+        `(cons (string-append "--enable-languages="
+                              ,(string-join languages ","))
+               (remove (cut string-match "--enable-languages.*" <>)
+                       ,flags)))))))
+
+(define-public gfortran-4.8
+  (custom-gcc gcc-4.8 "gfortran" '("fortran")))
+
+(define-public gccgo-4.8
+  (custom-gcc gcc-4.8 "gccgo" '("go")
+              ;; Suppress the separate "lib" output, because otherwise the
+              ;; "lib" and "out" outputs would refer to each other, creating
+              ;; a cyclic dependency.  <http://debbugs.gnu.org/18101>
+              #:separate-lib-output? #f))
+
+(define javac.in
+  (origin
+    (method url-fetch)
+    (uri (string-append "http://sources.gentoo.org/cgi-bin/viewvc.cgi/"
+                        "gentoo-x86/dev-java/gcj-jdk/files/javac.in?revision=1.1"))
+    (file-name "javac.in")
+    (sha256 (base32
+              "1c3dk4z5yfj6ic2fn3lyxs27n6pmn2wy9k0r1s17lnkf1bzkrciv"))))
+
+(define-public gcj-4.8
+  (package (inherit gcc-4.8)
+    (name "gcj")
+    (inputs
+     `(("fastjar" ,fastjar)
+       ("perl" ,perl)
+       ("javac.in" ,javac.in)
+       ("ecj-bootstrap" ,ecj-bootstrap-4.8)
+       ,@(package-inputs gcc-4.8)))
+    ;; Suppress the separate "lib" output, because otherwise the
+    ;; "lib" and "out" outputs would refer to each other, creating
+    ;; a cyclic dependency.  <http://debbugs.gnu.org/18101>
+    (outputs
+     (delete "lib" (package-outputs gcc-4.8)))
+    (arguments
+     (substitute-keyword-arguments `(#:modules ((guix build gnu-build-system)
+                                                (guix build utils)
+                                                (ice-9 regex)
+                                                (srfi srfi-1)
+                                                (srfi srfi-26))
+                                               ,@(package-arguments gcc-4.8))
+       ((#:configure-flags flags)
+        `(let ((ecj (assoc-ref %build-inputs "ecj-bootstrap")))
+           `("--enable-java-home"
+             "--enable-gjdoc"
+             ,(string-append "--with-ecj-jar=" ecj)
+             "--enable-languages=java"
+             ,@(remove (cut string-match "--enable-languages.*" <>)
+                       ,flags))))
+        ((#:phases phases)
+         `(alist-cons-after
+           'install 'install-javac-and-javap-wrappers
+           (lambda _
+             (let* ((javac  (assoc-ref %build-inputs "javac.in"))
+                    (ecj    (assoc-ref %build-inputs "ecj-bootstrap"))
+                    (gcj    (assoc-ref %outputs "out"))
+                    (gcjbin (string-append gcj "/bin/"))
+                    (jvm    (string-append gcj "/lib/jvm/"))
+                    (target (string-append jvm "/bin/javac")))
+
+               (symlink (string-append gcjbin "jcf-dump")
+                        (string-append jvm "/bin/javap"))
+
+               (copy-file ecj (string-append gcj "/share/java/ecj.jar"))
+
+               ;; Create javac wrapper from the template javac.in by
+               ;; replacing the @VARIABLES@ with paths.
+               (copy-file javac target)
+               (patch-shebang target)
+               (substitute* target
+                 (("@JAVA@")
+                  (string-append jvm "/bin/java"))
+                 (("@ECJ_JAR@")
+                  (string-append gcj "/share/java/ecj.jar"))
+                 (("@RT_JAR@")
+                  (string-append jvm "/jre/lib/rt.jar"))
+                 (("@TOOLS_JAR@")
+                  (string-append jvm "/lib/tools.jar")))
+               (chmod target #o755)
+               #t))
+           (alist-cons-after
+            'install 'remove-broken-or-conflicting-files
+            (lambda _
+              (let ((out (assoc-ref %outputs "out")))
+                (for-each
+                 delete-file
+                 (append (find-files (string-append out "/lib/jvm/jre/lib")
+                                     "libjawt.so")
+                         (find-files (string-append out "/bin")
+                                     ".*(c\\+\\+|cpp|g\\+\\+|gcc.*)"))))
+              #t)
+            ,phases)))))))
+
+(define ecj-bootstrap-4.8
+  (origin
+    (method url-fetch)
+    (uri "ftp://sourceware.org/pub/java/ecj-4.8.jar")
+    (sha256
+     (base32
+      "10fpqfbdzff1zcbxzh66xc8xbij9saykcj4xzm19wk9p3n7i5zcq"))))
+
+(define-public gcc-objc-4.8
+  (custom-gcc gcc-4.8 "gcc-objc" '("objc")))
+
+(define-public gcc-objc++-4.8
+  (custom-gcc gcc-4.8 "gcc-objc++" '("obj-c++")))
+
+(define-public isl
+  (package
+    (name "isl")
+    (version "0.11.1")
+    (source (origin
+             (method url-fetch)
+             (uri (list (string-append
+                         "http://isl.gforge.inria.fr/isl-"
+                         version
+                         ".tar.bz2")
+                        (string-append %gcc-infrastructure
+                                       name "-" version ".tar.gz")))
+             (sha256
+              (base32
+               "13d9cqa5rzhbjq0xf0b2dyxag7pqa72xj9dhsa03m8ccr1a4npq9"))))
+    (build-system gnu-build-system)
+    (inputs `(("gmp" ,gmp)))
+    (home-page "http://isl.gforge.inria.fr/")
+    (synopsis
+     "Manipulating sets and relations of integer points \
+bounded by linear constraints")
+    (description
+     "isl is a library for manipulating sets and relations of integer points
+bounded by linear constraints.  Supported operations on sets include
+intersection, union, set difference, emptiness check, convex hull, (integer)
+affine hull, integer projection, computing the lexicographic minimum using
+parametric integer programming, coalescing and parametric vertex
+enumeration.  It also includes an ILP solver based on generalized basis
+reduction, transitive closures on maps (which may encode infinite graphs),
+dependence analysis and bounds on piecewise step-polynomials.")
+    (license lgpl2.1+)))
+
+(define-public cloog
+  (package
+    (name "cloog")
+    (version "0.18.0")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (list (string-append
+                  "http://www.bastoul.net/cloog/pages/download/count.php3?url=cloog-"
+                  version
+                  ".tar.gz")
+                 (string-append %gcc-infrastructure
+                                name "-" version ".tar.gz")))
+      (sha256
+       (base32
+        "0a12rwfwp22zd0nlld0xyql11cj390rrq1prw35yjsw8wzfshjhw"))
+      (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system gnu-build-system)
+    (inputs `(("gmp" ,gmp)
+              ("isl" ,isl)))
+    (arguments '(#:configure-flags '("--with-isl=system")))
+    (home-page "http://www.cloog.org/")
+    (synopsis "Library to generate code for scanning Z-polyhedra")
+    (description
+     "CLooG is a free software library to generate code for scanning
+Z-polyhedra.  That is, it finds a code (e.g., in C, FORTRAN...) that
+reaches each integral point of one or more parameterized polyhedra.
+CLooG has been originally written to solve the code generation problem
+for optimizing compilers based on the polytope model.  Nevertheless it
+is used now in various area e.g., to build control automata for
+high-level synthesis or to find the best polynomial approximation of a
+function.  CLooG may help in any situation where scanning polyhedra
+matters.  While the user has full control on generated code quality,
+CLooG is designed to avoid control overhead and to produce a very
+effective code.")
+    (license gpl2+)))
+