gnu: facter: Update to 4.0.33.
[jackhill/guix/guix.git] / gnu / packages / gcc.scm
index 6f28830..a39ac3b 100644 (file)
@@ -7,6 +7,8 @@
 ;;; Copyright © 2016 Carlos Sánchez de La Lama <csanchezdll@gmail.com>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2020 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2020 Joseph LaFreniere <joseph@lafreniere.xyz>
+;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -422,7 +424,33 @@ Go.  It also includes runtime support libraries for these languages.")
                   #t))))
     ;; Override inherited texinfo-5 with latest version.
     (native-inputs `(("perl" ,perl)   ;for manpages
-                     ("texinfo" ,texinfo)))))
+                     ("texinfo" ,texinfo)))
+    (arguments
+     (if (%current-target-system)
+         (package-arguments gcc-4.8)
+         ;; For native builds of GCC 4.9 and GCC 5, the C++ include path needs
+         ;; to be adjusted so it does not interfere with GCC's own build processes.
+         (substitute-keyword-arguments (package-arguments gcc-4.8)
+           ((#:modules modules %gnu-build-system-modules)
+            `((srfi srfi-1)
+              ,@modules))
+           ((#:phases phases)
+            `(modify-phases ,phases
+               (add-after 'set-paths 'adjust-CPLUS_INCLUDE_PATH
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (let ((libc (assoc-ref inputs "libc"))
+                         (gcc (assoc-ref inputs  "gcc")))
+                     (setenv "CPLUS_INCLUDE_PATH"
+                             (string-join (fold delete
+                                                (string-split (getenv "CPLUS_INCLUDE_PATH")
+                                                              #\:)
+                                                (list (string-append libc "/include")
+                                                      (string-append gcc "/include/c++")))
+                                          ":"))
+                     (format #t
+                             "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%"
+                             (getenv "CPLUS_INCLUDE_PATH"))
+                     #t))))))))))
 
 (define-public gcc-5
   ;; Note: GCC >= 5 ships with .info files but 'make install' fails to install
@@ -443,7 +471,8 @@ Go.  It also includes runtime support libraries for these languages.")
                                        "gcc-5-source-date-epoch-1.patch"
                                        "gcc-5-source-date-epoch-2.patch"
                                        "gcc-6-libsanitizer-mode-size.patch"
-                                       "gcc-fix-texi2pod.patch"))
+                                       "gcc-fix-texi2pod.patch"
+                                       "gcc-5-hurd.patch"))
               (modules '((guix build utils)))
               (snippet
                ;; Fix 'libcc1/configure' error when cross-compiling GCC.
@@ -479,8 +508,18 @@ Go.  It also includes runtime support libraries for these languages.")
                                        "gcc-6-source-date-epoch-1.patch"
                                        "gcc-6-source-date-epoch-2.patch"
                                        "gcc-5.0-libvtv-runpath.patch"))))
+
+    ;; GCC 4.9 and 5 has a workaround that is not needed for GCC 6 and later.
+    (arguments (package-arguments gcc-4.8))
+
     (inputs
      `(("isl" ,isl)
+
+       ;; XXX: This gross hack allows us to have libstdc++'s <bits/c++config.h>
+       ;; in the search path, thereby avoiding misconfiguration of libstdc++:
+       ;; <https://bugs.gnu.org/42392>.
+       ("libstdc++" ,libstdc++-headers)
+
        ,@(package-inputs gcc-4.7)))))
 
 (define-public gcc-7
@@ -514,25 +553,37 @@ It also includes runtime support libraries for these languages.")))
                (base32
                 "1m1d3gfix56w4aq8myazzfffkl8bqcrx4jhhapnjf7qfs596w2p3"))
               (patches (search-patches "gcc-8-strmov-store-file-names.patch"
-                                       "gcc-8-libsanitizer-mode-size.patch"
                                        "gcc-5.0-libvtv-runpath.patch"))))))
 
 (define-public gcc-9
   (package
    (inherit gcc-8)
-   (version "9.2.0")
+   (version "9.3.0")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnu/gcc/gcc-"
                                 version "/gcc-" version ".tar.xz"))
             (sha256
              (base32
-              "01mj3yk7z49i49168hg2cg7qs4bsccrrnv7pjmbdlf8j2a7z0vpa"))
+              "1la2yy27ziasyf0jvzk58y1i5b5bq2h176qil550bxhifs39gqbi"))
             (patches (search-patches "gcc-9-strmov-store-file-names.patch"
-                                     "gcc-9-libsanitizer-mode-size.patch"
                                      "gcc-9-asan-fix-limits-include.patch"
                                      "gcc-5.0-libvtv-runpath.patch"))))))
 
+(define-public gcc-10
+  (package
+   (inherit gcc-8)
+   (version "10.2.0")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "mirror://gnu/gcc/gcc-"
+                                version "/gcc-" version ".tar.xz"))
+            (sha256
+             (base32
+              "130xdkhmz1bc2kzx061s3sfwk36xah1fw5w332c0nzwwpdl47pdq"))
+            (patches (search-patches "gcc-9-strmov-store-file-names.patch"
+                                     "gcc-5.0-libvtv-runpath.patch"))))))
+
 ;; Note: When changing the default gcc version, update
 ;;       the gcc-toolchain-* definitions and the gfortran definition
 ;;       accordingly.
@@ -562,6 +613,31 @@ using compilers other than GCC."
     (propagated-inputs '())
     (synopsis "GNU C++ standard library")))
 
+(define libstdc++
+  ;; Libstdc++ matching the default GCC.
+  (make-libstdc++ gcc))
+
+(define libstdc++-headers
+  ;; XXX: This package is for internal use to work around
+  ;; <https://bugs.gnu.org/42392> (see above).  The main difference compared
+  ;; to the libstdc++ headers that come with 'gcc' is that <bits/c++config.h>
+  ;; is right under include/c++ and not under
+  ;; include/c++/x86_64-unknown-linux-gnu (aka. GPLUSPLUS_TOOL_INCLUDE_DIR).
+  (package
+    (inherit libstdc++)
+    (name "libstdc++-headers")
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     '(#:builder (let* ((out       (assoc-ref %outputs "out"))
+                        (libstdc++ (assoc-ref %build-inputs "libstdc++")))
+                   (mkdir out)
+                   (mkdir (string-append out "/include"))
+                   (symlink (string-append libstdc++ "/include")
+                            (string-append out "/include/c++")))))
+    (inputs `(("libstdc++" ,libstdc++)))
+    (synopsis "Headers of GNU libstdc++")))
+
 (define-public libstdc++-4.9
   (make-libstdc++ gcc-4.9))
 
@@ -575,26 +651,22 @@ using compilers other than GCC."
        #:phases
        (modify-phases %standard-phases
          (add-before 'configure 'chdir
-                     (lambda _
-                       (chdir "libiberty")
-                       #t))
-         (replace
-          'install
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let* ((out     (assoc-ref outputs "out"))
-                   (lib     (string-append out "/lib/"))
-                   (include (string-append out "/include/")))
-              (mkdir-p lib)
-              (mkdir-p include)
-              (copy-file "libiberty.a"
-                         (string-append lib "libiberty.a"))
-              (copy-file "../include/libiberty.h"
-                         (string-append include "libiberty.h"))
-              #t))))))
+           (lambda _
+             (chdir "libiberty")
+             #t))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out     (assoc-ref outputs "out"))
+                    (lib     (string-append out "/lib/"))
+                    (include (string-append out "/include/")))
+               (install-file "libiberty.a" lib)
+               (install-file "../include/libiberty.h" include))
+             #t)))))
     (inputs '())
     (outputs '("out"))
     (native-inputs '())
     (propagated-inputs '())
+    (properties '())
     (synopsis "Collection of subroutines used by various GNU programs")))
 
 (define-public libiberty
@@ -614,12 +686,12 @@ as the 'native-search-paths' field."
     (native-search-paths search-paths)
     (properties (alist-delete 'hidden? (package-properties 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))
+     (substitute-keyword-arguments (package-arguments gcc)
+       ((#:modules modules %gnu-build-system-modules)
+        `(,@modules
+          (srfi srfi-1)
+          (srfi srfi-26)
+          (ice-9 regex)))
        ((#:configure-flags flags)
         `(cons (string-append "--enable-languages="
                               ,(string-join languages ","))
@@ -646,47 +718,49 @@ as the 'native-search-paths' field."
          (variable "LIBRARY_PATH")
          (files '("lib" "lib64")))))
 
-(define-public gfortran-4.8
-  (hidden-package
-   (custom-gcc gcc-4.8 "gfortran" '("fortran")
-               %generic-search-paths)))
-
-(define-public gfortran-4.9
-  (hidden-package
-   (custom-gcc gcc-4.9 "gfortran" '("fortran")
-               %generic-search-paths)))
-
-(define-public gfortran-5
-  (hidden-package
-   (custom-gcc gcc-5 "gfortran" '("fortran")
-               %generic-search-paths)))
-
-(define-public gfortran-6
-  (hidden-package
-   (custom-gcc gcc-6 "gfortran" '("fortran")
-               %generic-search-paths)))
-
-(define-public gfortran-7
+(define-public gfortran
   (hidden-package
-   (custom-gcc gcc-7 "gfortran" '("fortran")
+   (custom-gcc (package
+                 (inherit gcc)
+                 ;; XXX: Remove LIBSTDC++-HEADERS from the inputs just to
+                 ;; avoid a rebuild of all the GFORTRAN dependents.
+                 ;; TODO: Remove this hack on the next rebuild cycle.
+                 (inputs (alist-delete "libstdc++" (package-inputs gcc))))
+               "gfortran" '("fortran")
                %generic-search-paths)))
 
-(define-public gfortran-8
+(define-public gdc-10
   (hidden-package
-   (custom-gcc gcc-8 "gfortran" '("fortran")
+   (custom-gcc gcc-10 "gdc" '("d")
                %generic-search-paths)))
 
-(define-public gfortran-9
-  (hidden-package
-   (custom-gcc gcc-9 "gfortran" '("fortran")
-               %generic-search-paths)))
+(define-public libgccjit
+  (package
+    (inherit gcc-9)
+    (name "libgccjit")
+    (outputs (delete "lib" (package-outputs gcc)))
+    (properties (alist-delete 'hidden? (package-properties 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)
+        `(append `("--enable-host-shared"
+                   ,(string-append "--enable-languages=jit"))
+                 (remove (cut string-match "--enable-languages.*" <>)
+                         ,flags)))
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'remove-broken-or-conflicting-files
+             (lambda* (#:key outputs #:allow-other-keys)
+               (for-each delete-file
+                         (find-files (string-append (assoc-ref outputs "out") "/bin")
+                                     ".*(c\\+\\+|cpp|g\\+\\+|gcov|gcc|gcc-.*)"))
+               #t))))))))
 
-(define-public gfortran
-  ;; Note: Update this when GCC changes!  We cannot use
-  ;; (custom-gcc gcc "fortran" …) because that would lead to a package object
-  ;; that is not 'eq?' with GFORTRAN-5, and thus 'fold-packages' would
-  ;; report two gfortran@5 that are in fact identical.
-  gfortran-7)
 
 (define-public gccgo-4.9
   (custom-gcc gcc-4.9 "gccgo" '("go")
@@ -696,115 +770,87 @@ as the 'native-search-paths' field."
               ;; a cyclic dependency.  <http://debbugs.gnu.org/18101>
               #:separate-lib-output? #f))
 
+(define %objc-search-paths
+  (list (search-path-specification
+         (variable "OBJC_INCLUDE_PATH")
+         (files '("include")))
+        (search-path-specification
+         (variable "LIBRARY_PATH")
+         (files '("lib" "lib64")))))
+
 (define-public gcc-objc-4.8
   (custom-gcc gcc-4.8 "gcc-objc" '("objc")
-              (list (search-path-specification
-                     (variable "OBJC_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc-search-paths))
 
 (define-public gcc-objc-4.9
   (custom-gcc gcc-4.9 "gcc-objc" '("objc")
-              (list (search-path-specification
-                     (variable "OBJC_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc-search-paths))
 
 (define-public gcc-objc-5
   (custom-gcc gcc-5 "gcc-objc" '("objc")
-              (list (search-path-specification
-                     (variable "OBJC_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc-search-paths))
 
 (define-public gcc-objc-6
   (custom-gcc gcc-6 "gcc-objc" '("objc")
-              (list (search-path-specification
-                     (variable "OBJC_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc-search-paths))
 
 (define-public gcc-objc-7
   (custom-gcc gcc-7 "gcc-objc" '("objc")
-              (list (search-path-specification
-                     (variable "OBJC_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc-search-paths))
 
 (define-public gcc-objc-8
   (custom-gcc gcc-8 "gcc-objc" '("objc")
-              (list (search-path-specification
-                     (variable "OBJC_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc-search-paths))
+
+(define-public gcc-objc-9
+  (custom-gcc gcc-9 "gcc-objc" '("objc")
+              %objc-search-paths))
+
+(define-public gcc-objc-10
+  (custom-gcc gcc-10 "gcc-objc" '("objc")
+              %objc-search-paths))
 
 (define-public gcc-objc gcc-objc-7)
 
+(define %objc++-search-paths
+  (list (search-path-specification
+         (variable "OBJCPLUS_INCLUDE_PATH")
+         (files '("include")))
+        (search-path-specification
+         (variable "LIBRARY_PATH")
+         (files '("lib" "lib64")))))
+
 (define-public gcc-objc++-4.8
   (custom-gcc gcc-4.8 "gcc-objc++" '("obj-c++")
-              (list (search-path-specification
-                     (variable "OBJCPLUS_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc++-search-paths))
 
 (define-public gcc-objc++-4.9
   (custom-gcc gcc-4.9 "gcc-objc++" '("obj-c++")
-              (list (search-path-specification
-                     (variable "OBJCPLUS_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc++-search-paths))
 
 (define-public gcc-objc++-5
   (custom-gcc gcc-5 "gcc-objc++" '("obj-c++")
-              (list (search-path-specification
-                     (variable "OBJCPLUS_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc++-search-paths))
 
 (define-public gcc-objc++-6
   (custom-gcc gcc-6 "gcc-objc++" '("obj-c++")
-              (list (search-path-specification
-                     (variable "OBJCPLUS_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc++-search-paths))
 
 (define-public gcc-objc++-7
   (custom-gcc gcc-7 "gcc-objc++" '("obj-c++")
-              (list (search-path-specification
-                     (variable "OBJCPLUS_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc++-search-paths))
 
 (define-public gcc-objc++-8
   (custom-gcc gcc-8 "gcc-objc++" '("obj-c++")
-              (list (search-path-specification
-                     (variable "OBJCPLUS_INCLUDE_PATH")
-                     (files '("include")))
-                    (search-path-specification
-                     (variable "LIBRARY_PATH")
-                     (files '("lib" "lib64"))))))
+              %objc++-search-paths))
+
+(define-public gcc-objc++-9
+  (custom-gcc gcc-9 "gcc-objc++" '("obj-c++")
+              %objc++-search-paths))
+
+(define-public gcc-objc++-10
+  (custom-gcc gcc-10 "gcc-objc++" '("obj-c++")
+              %objc++-search-paths))
 
 (define-public gcc-objc++ gcc-objc++-7)