Revert "gnu: e2fsprogs: Update to 1.43.5."
[jackhill/guix/guix.git] / gnu / packages / gcc.scm
CommitLineData
e9c0b944 1;;; GNU Guix --- Functional package management for GNU
9af07624 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
270b501e 3;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
9117448e 4;;; Copyright © 2014, 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
ed2b1c4f 5;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
0dd87919 6;;; Copyright © 2015, 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
fc649d0a 7;;; Copyright © 2016 Carlos Sánchez de La Lama <csanchezdll@gmail.com>
e9c0b944
LC
8;;;
9;;; This file is part of GNU Guix.
10;;;
11;;; GNU Guix is free software; you can redistribute it and/or modify it
12;;; under the terms of the GNU General Public License as published by
13;;; the Free Software Foundation; either version 3 of the License, or (at
14;;; your option) any later version.
15;;;
16;;; GNU Guix is distributed in the hope that it will be useful, but
17;;; WITHOUT ANY WARRANTY; without even the implied warranty of
18;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;;; GNU General Public License for more details.
20;;;
21;;; You should have received a copy of the GNU General Public License
22;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
23
24(define-module (gnu packages gcc)
c6d7e299 25 #:use-module ((guix licenses)
50c7a1e2 26 #:select (gpl3+ gpl2+ lgpl2.1+ lgpl2.0+ fdl1.3+))
e9c0b944
LC
27 #:use-module (gnu packages)
28 #:use-module (gnu packages bootstrap)
29 #:use-module (gnu packages compression)
30 #:use-module (gnu packages multiprecision)
c8ebc821 31 #:use-module (gnu packages texinfo)
c364a287 32 #:use-module (gnu packages dejagnu)
99828fa7 33 #:use-module (gnu packages documentation)
98b385d1
LC
34 #:use-module (gnu packages xml)
35 #:use-module (gnu packages docbook)
36 #:use-module (gnu packages graphviz)
3e778ad3 37 #:use-module (gnu packages elf)
38cf2ba0 38 #:use-module (gnu packages perl)
e9c0b944
LC
39 #:use-module (guix packages)
40 #:use-module (guix download)
ca16cb96 41 #:use-module (guix build-system gnu)
74574fd1 42 #:use-module (guix build-system trivial)
fdd6c726 43 #:use-module (guix utils)
e052c7e1 44 #:use-module (srfi srfi-1)
ca16cb96 45 #:use-module (ice-9 regex))
e9c0b944 46
832abc76
LC
47(define %gcc-infrastructure
48 ;; Base URL for GCC's infrastructure.
966a543b 49 "mirror://gcc/infrastructure/")
832abc76 50
76e639a0 51(define (gcc-configure-flags-for-triplet target)
ca16cb96
LC
52 "Return a list of additional GCC `configure' flags for TARGET, a GNU triplet.
53
54The purpose of this procedure is to translate extended GNU triplets---e.g.,
55where the OS part is overloaded to denote a specific ABI---into GCC
56`configure' options. We take extended GNU triplets that glibc recognizes."
57 (cond ((string-match "^mips64el.*gnuabin?64$" target)
58 ;; Triplets recognized by glibc as denoting the N64 ABI; see
59 ;; ports/sysdeps/mips/preconfigure.
60 '("--with-abi=64"))
3f00ff8b
MW
61
62 ((string-match "^arm.*-gnueabihf$" target)
63 '("--with-arch=armv7-a"
64 "--with-float=hard"
65 "--with-mode=thumb"
aa725117 66 "--with-fpu=neon"))
3f00ff8b 67
ca16cb96 68 (else
3f00ff8b 69 ;; TODO: Add `arm.*-gnueabi', etc.
ca16cb96
LC
70 '())))
71
e9c0b944 72(define-public gcc-4.7
9063ef0f 73 (let* ((stripped? #t) ;whether to strip the compiler, not the libraries
de1d41f9
LC
74 (maybe-target-tools
75 (lambda ()
76 ;; Return the `_FOR_TARGET' variables that are needed when
77 ;; cross-compiling GCC.
78 (let ((target (%current-target-system)))
79 (if target
80 (map (lambda (var tool)
81 (string-append (string-append var "_FOR_TARGET")
82 "=" target "-" tool))
83 '("CC" "CXX" "LD" "AR" "NM" "RANLIB" "STRIP")
84 '("gcc" "g++" "ld" "ar" "nm" "ranlib" "strip"))
85 '()))))
7e3c9f74
LC
86 (libdir
87 (let ((base '(or (assoc-ref outputs "lib")
88 (assoc-ref outputs "out"))))
89 (lambda ()
90 ;; Return the directory that contains lib/libgcc_s.so et al.
91 (if (%current-target-system)
92 `(string-append ,base "/" ,(%current-target-system))
93 base))))
de1d41f9
LC
94 (configure-flags
95 (lambda ()
96 ;; This is terrible. Since we have two levels of quasiquotation,
97 ;; we have to do this convoluted thing just so we can insert the
98 ;; contents of (maybe-target-tools).
99 (list 'quasiquote
100 (append
101 '("--enable-plugin"
102 "--enable-languages=c,c++"
103 "--disable-multilib"
98bd851e 104 "--with-system-zlib"
de1d41f9 105
06213498
LC
106 ;; No pre-compiled libstdc++ headers, to save space.
107 "--disable-libstdcxx-pch"
108
de1d41f9
LC
109 "--with-local-prefix=/no-gcc-local-prefix"
110
84e6756c
LC
111 ;; With a separate "lib" output, the build system
112 ;; incorrectly guesses GPLUSPLUS_INCLUDE_DIR, so force
113 ;; it. (Don't use a versioned sub-directory, that's
114 ;; unnecessary.)
115 ,(string-append "--with-gxx-include-dir="
116 (assoc-ref %outputs "out")
117 "/include/c++")
118
de1d41f9
LC
119 ,(let ((libc (assoc-ref %build-inputs "libc")))
120 (if libc
121 (string-append "--with-native-system-header-dir=" libc
122 "/include")
123 "--without-headers")))
124
76e639a0
MW
125 ;; Pass the right options for the target triplet.
126 (let ((triplet
127 (or (%current-target-system)
128 (nix-system->gnu-triplet (%current-system)))))
129 (gcc-configure-flags-for-triplet triplet))
ca16cb96 130
de1d41f9 131 (maybe-target-tools))))))
e9c0b944 132 (package
de1d41f9 133 (name "gcc")
d2e2f142 134 (version "4.7.4")
de1d41f9
LC
135 (source (origin
136 (method url-fetch)
137 (uri (string-append "mirror://gnu/gcc/gcc-"
138 version "/gcc-" version ".tar.bz2"))
139 (sha256
140 (base32
d2e2f142 141 "10k2k71kxgay283ylbbhhs51cl55zn2q38vj5pk4k950qdnirrlj"))))
de1d41f9 142 (build-system gnu-build-system)
84e6756c
LC
143
144 ;; Separate out the run-time support libraries because all the
145 ;; dynamic-linked objects depend on it.
9063ef0f
LC
146 (outputs '("out" ;commands, etc. (60+ MiB)
147 "lib" ;libgcc_s, libgomp, etc. (15+ MiB)
148 "debug")) ;debug symbols of run-time libraries
84e6756c 149
de1d41f9
LC
150 (inputs `(("gmp" ,gmp)
151 ("mpfr" ,mpfr)
152 ("mpc" ,mpc)
153 ("isl" ,isl)
154 ("cloog" ,cloog)
155 ("libelf" ,libelf)
156 ("zlib" ,zlib)))
c8ebc821 157
868c13c5 158 ;; GCC < 5 is one of the few packages that doesn't ship .info files.
72246dc0
EF
159 ;; Newer texinfos fail to build the manual, so we use an older one.
160 (native-inputs `(("texinfo" ,texinfo-5)))
c8ebc821 161
de1d41f9
LC
162 (arguments
163 `(#:out-of-source? #t
de1d41f9
LC
164 #:configure-flags ,(configure-flags)
165 #:make-flags
fd0b2766
LC
166 ;; None of the flags below are needed when doing a Canadian cross.
167 ;; TODO: Simplify this.
168 ,(if (%current-target-system)
169 (if stripped?
170 ''("CFLAGS=-g0 -O2")
171 ''())
172 `(let* ((libc (assoc-ref %build-inputs "libc"))
173 (libc-native (or (assoc-ref %build-inputs "libc-native")
174 libc)))
175 `(,@(if libc
176 (list (string-append "LDFLAGS_FOR_TARGET="
177 "-B" libc "/lib "
178 "-Wl,-dynamic-linker "
179 "-Wl," libc
180 ,(glibc-dynamic-linker)))
181 '())
182
183 ;; Native programs like 'genhooks' also need that right.
184 ,(string-append "LDFLAGS="
185 "-Wl,-rpath=" libc-native "/lib "
186 "-Wl,-dynamic-linker "
187 "-Wl," libc-native ,(glibc-dynamic-linker))
188 ,(string-append "BOOT_CFLAGS=-O2 "
189 ,(if stripped? "-g0" "-g")))))
de1d41f9
LC
190
191 #:tests? #f
dfc8bb20 192
de1d41f9
LC
193 #:phases
194 (alist-cons-before
195 'configure 'pre-configure
196 (lambda* (#:key inputs outputs #:allow-other-keys)
7e3c9f74 197 (let ((libdir ,(libdir))
84e6756c 198 (libc (assoc-ref inputs "libc")))
de1d41f9
LC
199 (when libc
200 ;; The following is not performed for `--without-headers'
201 ;; cross-compiler builds.
202
91c47bef
MW
203 ;; Join multi-line definitions of GLIBC_DYNAMIC_LINKER* into a
204 ;; single line, to allow the next step to work properly.
205 (for-each
206 (lambda (x)
207 (substitute* (find-files "gcc/config"
33ae7d43
LC
208 "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
209 (("(#define (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$" _ line)
91c47bef
MW
210 line)))
211 '(1 2 3))
212
de1d41f9
LC
213 ;; Fix the dynamic linker's file name.
214 (substitute* (find-files "gcc/config"
fc649d0a 215 "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
33ae7d43
LC
216 (("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^ ]*).*$"
217 _ gnu-user suffix)
218 (format #f "#define ~a_DYNAMIC_LINKER~a \"~a\"~%"
219 gnu-user suffix
de1d41f9
LC
220 (string-append libc ,(glibc-dynamic-linker)))))
221
222 ;; Tell where to find libstdc++, libc, and `?crt*.o', except
223 ;; `crt{begin,end}.o', which come with GCC.
224 (substitute* (find-files "gcc/config"
06213498
LC
225 "^gnu-user.*\\.h$")
226 (("#define GNU_USER_TARGET_LIB_SPEC (.*)$" _ suffix)
fa1e2f3d
MW
227 ;; Help libgcc_s.so be found (see also below.) Always use
228 ;; '-lgcc_s' so that libgcc_s.so is always found by those
229 ;; programs that use 'pthread_cancel' (glibc dlopens
230 ;; libgcc_s.so when pthread_cancel support is needed, but
231 ;; having it in the application's RUNPATH isn't enough; see
a7bf595f 232 ;; <http://sourceware.org/ml/libc-help/2013-11/msg00023.html>.)
270b501e
MW
233 ;;
234 ;; NOTE: The '-lgcc_s' added below needs to be removed in a
235 ;; later phase of %gcc-static. If you change the string
236 ;; below, make sure to update the relevant code in
237 ;; %gcc-static package as needed.
06213498 238 (format #f "#define GNU_USER_TARGET_LIB_SPEC \
81197492
LC
239\"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
240 libc libc libdir suffix))
06213498 241 (("#define GNU_USER_TARGET_STARTFILE_SPEC.*$" line)
de1d41f9 242 (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"
e9c0b944 243#define STANDARD_STARTFILE_PREFIX_2 \"\"
06213498 244~a"
fc649d0a
CSLL
245 libc line)))
246
247 ;; The rs6000 (a.k.a. powerpc) config in GCC does not use
248 ;; GNU_USER_* defines. Do the above for this case.
249 (substitute*
250 "gcc/config/rs6000/sysv4.h"
251 (("#define LIB_LINUX_SPEC (.*)$" _ suffix)
252 (format #f "#define LIB_LINUX_SPEC \
253\"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
254 libc libc libdir suffix))
255 (("#define STARTFILE_LINUX_SPEC.*$" line)
256 (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"
257#define STANDARD_STARTFILE_PREFIX_2 \"\"
258~a"
259 libc line))))
de1d41f9
LC
260
261 ;; Don't retain a dependency on the build-time sed.
262 (substitute* "fixincludes/fixincl.x"
263 (("static char const sed_cmd_z\\[\\] =.*;")
84e6756c
LC
264 "static char const sed_cmd_z[] = \"sed\";"))
265
b773e9b0
EF
266 ;; Aarch64 support didn't land in GCC until the 4.8 series.
267 (when (file-exists? "gcc/config/aarch64")
268 ;; Force Aarch64 libdir to be /lib and not /lib64
269 (substitute* "gcc/config/aarch64/t-aarch64-linux"
270 (("lib64") "lib")))
271
d0b62698
LC
272 (when (file-exists? "libbacktrace")
273 ;; GCC 4.8+ comes with libbacktrace. By default it builds
274 ;; with -Werror, which fails with a -Wcast-qual error in glibc
275 ;; 2.21's stdlib-bsearch.h. Remove -Werror.
276 (substitute* "libbacktrace/configure"
277 (("WARN_FLAGS=(.*)-Werror" _ flags)
ec299071
LC
278 (string-append "WARN_FLAGS=" flags)))
279
280 (when (file-exists? "libsanitizer/libbacktrace")
281 ;; Same in libsanitizer's bundled copy (!) found in 4.9+.
282 (substitute* "libsanitizer/libbacktrace/Makefile.in"
283 (("-Werror")
284 ""))))
d0b62698 285
21e583de
LC
286 ;; Add a RUNPATH to libstdc++.so so that it finds libgcc_s.
287 ;; See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=32354>
288 ;; and <http://bugs.gnu.org/20358>.
289 (substitute* "libstdc++-v3/src/Makefile.in"
290 (("^OPT_LDFLAGS = ")
291 "OPT_LDFLAGS = -Wl,-rpath=$(libdir) "))
292
84e6756c
LC
293 ;; Move libstdc++*-gdb.py to the "lib" output to avoid a
294 ;; circularity between "out" and "lib". (Note:
295 ;; --with-python-dir is useless because it imposes $(prefix) as
296 ;; the parent directory.)
297 (substitute* "libstdc++-v3/python/Makefile.in"
298 (("pythondir = .*$")
299 (string-append "pythondir = " libdir "/share"
300 "/gcc-$(gcc_version)/python\n")))
301
302 ;; Avoid another circularity between the outputs: this #define
303 ;; ends up in auto-host.h in the "lib" output, referring to
304 ;; "out". (This variable is used to augment cpp's search path,
305 ;; but there's nothing useful to look for here.)
306 (substitute* "gcc/config.in"
307 (("PREFIX_INCLUDE_DIR")
308 "PREFIX_INCLUDE_DIR_isnt_necessary_here"))))
de1d41f9
LC
309
310 (alist-cons-after
311 'configure 'post-configure
312 (lambda _
313 ;; Don't store configure flags, to avoid retaining references to
6f58d582 314 ;; build-time dependencies---e.g., `--with-ppl=/gnu/store/xxx'.
de1d41f9
LC
315 (substitute* "Makefile"
316 (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
317 "TOPLEVEL_CONFIGURE_ARGUMENTS=\n")))
9063ef0f 318 %standard-phases))))
de1d41f9
LC
319
320 (native-search-paths
009b53fd
LC
321 ;; Use the language-specific variables rather than 'CPATH' because they
322 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
323 ;; The intent is to allow headers that are in the search path to be
324 ;; treated as "system headers" (headers exempt from warnings) just like
325 ;; the typical /usr/include headers on an FHS system.
de1d41f9 326 (list (search-path-specification
009b53fd
LC
327 (variable "C_INCLUDE_PATH")
328 (files '("include")))
329 (search-path-specification
330 (variable "CPLUS_INCLUDE_PATH")
af070955 331 (files '("include")))
de1d41f9
LC
332 (search-path-specification
333 (variable "LIBRARY_PATH")
af070955 334 (files '("lib" "lib64")))))
de1d41f9
LC
335
336 (properties `((gcc-libc . ,(assoc-ref inputs "libc"))))
337 (synopsis "GNU Compiler Collection")
338 (description
a22dc0c4
LC
339 "GCC is the GNU Compiler Collection. It provides compiler front-ends
340for several languages, including C, C++, Objective-C, Fortran, Java, Ada, and
79c311b8 341Go. It also includes runtime support libraries for these languages.")
de1d41f9 342 (license gpl3+)
721d7a69 343 (supported-systems (delete "aarch64-linux" %supported-systems))
6fd52309 344 (home-page "https://gcc.gnu.org/"))))
832abc76 345
3b401612 346(define-public gcc-4.8
3b401612 347 (package (inherit gcc-4.7)
ab5f49cf 348 (version "4.8.5")
3b401612 349 (source (origin
7e35b9dd
LC
350 (method url-fetch)
351 (uri (string-append "mirror://gnu/gcc/gcc-"
352 version "/gcc-" version ".tar.bz2"))
353 (sha256
354 (base32
ab5f49cf 355 "08yggr18v373a1ihj0rg2vd6psnic42b518xcgp3r9k81xz1xyr2"))
721d7a69
EF
356 (patches (search-patches "gcc-arm-link-spec-fix.patch"))))
357 (supported-systems %supported-systems)))
3b401612 358
571aa6cd 359(define-public gcc-4.9
e052c7e1 360 (package (inherit gcc-4.7)
b0847497 361 (version "4.9.4")
571aa6cd 362 (source (origin
7e35b9dd
LC
363 (method url-fetch)
364 (uri (string-append "mirror://gnu/gcc/gcc-"
365 version "/gcc-" version ".tar.bz2"))
366 (sha256
367 (base32
b0847497 368 "14l06m7nvcvb0igkbip58x59w3nq6315k6jcz3wr9ch1rn9d44bc"))
e7e43727 369 (patches (search-patches "gcc-arm-bug-71399.patch"
72246dc0 370 "gcc-libvtv-runpath.patch"))))
721d7a69
EF
371 (native-inputs `(("texinfo" ,texinfo)))
372 (supported-systems %supported-systems)))
571aa6cd 373
629f4d2e 374(define-public gcc-5
7912677c
LC
375 ;; Note: GCC >= 5 ships with .info files but 'make install' fails to install
376 ;; them in a VPATH build.
7e35b9dd 377 (package (inherit gcc-4.9)
8c8b2bf3 378 (version "5.4.0")
60e2d5fe 379 (source (origin
7e35b9dd
LC
380 (method url-fetch)
381 (uri (string-append "mirror://gnu/gcc/gcc-"
382 version "/gcc-" version ".tar.bz2"))
383 (sha256
384 (base32
8c8b2bf3 385 "0fihlcy5hnksdxk0sn6bvgnyq8gfrgs8m794b1jxwd1dxinzg3b0"))
b810a850
LC
386 (patches (search-patches "gcc-arm-bug-71399.patch"
387 "gcc-strmov-store-file-names.patch"
d71d6fe8
MB
388 "gcc-5.0-libvtv-runpath.patch"
389 "gcc-5-source-date-epoch-1.patch"
390 "gcc-5-source-date-epoch-2.patch"))))))
60e2d5fe 391
e760ec41
LC
392(define-public gcc-6
393 (package
394 (inherit gcc-5)
0dd87919 395 (version "6.4.0")
e760ec41
LC
396 (source (origin
397 (method url-fetch)
398 (uri (string-append "mirror://gnu/gcc/gcc-"
0dd87919 399 version "/gcc-" version ".tar.xz"))
e760ec41
LC
400 (sha256
401 (base32
0dd87919 402 "1m0lr7938lw5d773dkvwld90hjlcq2282517d1gwvrfzmwgg42w5"))
80337723
LC
403 (patches (search-patches "gcc-strmov-store-file-names.patch"
404 "gcc-5.0-libvtv-runpath.patch"))))))
0c5658df
EF
405(define-public gcc-7
406 (package
407 (inherit gcc-6)
408 (version "7.1.0")
409 (source (origin
410 (method url-fetch)
411 (uri (string-append "mirror://gnu/gcc/gcc-"
412 version "/gcc-" version ".tar.bz2"))
413 (sha256
414 (base32
415 "05xwps0ci7wgxh50askpa2r9p8518qxdgh6ad7pnyk7n6p13d0ca"))
416 (patches (search-patches "gcc-strmov-store-file-names.patch"
417 "gcc-5.0-libvtv-runpath.patch"))))))
e760ec41 418
ce362de8 419;; Note: When changing the default gcc version, update
cb4805e3
RW
420;; the gcc-toolchain-* definitions and the gfortran definition
421;; accordingly.
b810a850 422(define-public gcc gcc-5)
eed67cbb 423
d0abf829
LC
424(define-public (make-libstdc++ gcc)
425 "Return a libstdc++ package based on GCC. The primary use case is when
426using compilers other than GCC."
427 (package
428 (inherit gcc)
429 (name "libstdc++")
430 (arguments
431 `(#:out-of-source? #t
432 #:phases (alist-cons-before
433 'configure 'chdir
434 (lambda _
435 (chdir "libstdc++-v3"))
436 %standard-phases)
437 #:configure-flags `("--disable-libstdcxx-pch"
438 ,(string-append "--with-gxx-include-dir="
439 (assoc-ref %outputs "out")
440 "/include"))))
441 (outputs '("out" "debug"))
442 (inputs '())
443 (native-inputs '())
444 (propagated-inputs '())
445 (synopsis "GNU C++ standard library")))
446
447(define-public libstdc++-4.9
448 (make-libstdc++ gcc-4.9))
449
2b6b6d13
RW
450(define (make-libiberty gcc)
451 "Return a libiberty package based on GCC."
452 (package
453 (inherit gcc)
454 (name "libiberty")
455 (arguments
456 `(#:out-of-source? #t
457 #:phases
458 (modify-phases %standard-phases
459 (add-before 'configure 'chdir
460 (lambda _
461 (chdir "libiberty")
462 #t))
463 (replace
464 'install
465 (lambda* (#:key outputs #:allow-other-keys)
466 (let* ((out (assoc-ref outputs "out"))
467 (lib (string-append out "/lib/"))
468 (include (string-append out "/include/")))
469 (mkdir-p lib)
470 (mkdir-p include)
471 (copy-file "libiberty.a"
472 (string-append lib "libiberty.a"))
473 (copy-file "../include/libiberty.h"
474 (string-append include "libiberty.h"))
475 #t))))))
476 (inputs '())
477 (outputs '("out"))
478 (native-inputs '())
479 (propagated-inputs '())
480 (synopsis "Collection of subroutines used by various GNU programs")))
481
482(define-public libiberty
483 (make-libiberty gcc))
484
009b53fd
LC
485(define* (custom-gcc gcc name languages
486 #:optional
487 (search-paths (package-native-search-paths gcc))
488 #:key (separate-lib-output? #t))
489 "Return a custom version of GCC that supports LANGUAGES. Use SEARCH-PATHS
490as the 'native-search-paths' field."
fdd6c726
NK
491 (package (inherit gcc)
492 (name name)
c4df90a5
MW
493 (outputs (if separate-lib-output?
494 (package-outputs gcc)
495 (delete "lib" (package-outputs gcc))))
009b53fd 496 (native-search-paths search-paths)
fdd6c726
NK
497 (arguments
498 (substitute-keyword-arguments `(#:modules ((guix build gnu-build-system)
499 (guix build utils)
500 (ice-9 regex)
501 (srfi srfi-1)
502 (srfi srfi-26))
503 ,@(package-arguments gcc))
504 ((#:configure-flags flags)
505 `(cons (string-append "--enable-languages="
506 ,(string-join languages ","))
507 (remove (cut string-match "--enable-languages.*" <>)
82f145ef
RW
508 ,flags)))
509 ((#:phases phases)
510 `(modify-phases ,phases
511 (add-after 'install 'remove-broken-or-conflicting-files
512 (lambda* (#:key outputs #:allow-other-keys)
513 (for-each delete-file
514 (find-files (string-append (assoc-ref outputs "out") "/bin")
515 ".*(c\\+\\+|cpp|g\\+\\+|gcov|gcc.*)"))
516 #t))))))))
fdd6c726 517
009b53fd
LC
518(define %generic-search-paths
519 ;; This is the language-neutral search path for GCC. Entries in $CPATH are
520 ;; not considered "system headers", which means GCC can raise warnings for
521 ;; issues in those headers. 'CPATH' is the only one that works for
522 ;; front-ends not in the C family.
523 (list (search-path-specification
524 (variable "CPATH")
525 (files '("include")))
526 (search-path-specification
527 (variable "LIBRARY_PATH")
528 (files '("lib" "lib64")))))
529
fdd6c726 530(define-public gfortran-4.8
009b53fd
LC
531 (custom-gcc gcc-4.8 "gfortran" '("fortran")
532 %generic-search-paths))
fdd6c726 533
c69a8b7b 534(define-public gfortran-4.9
009b53fd
LC
535 (custom-gcc gcc-4.9 "gfortran" '("fortran")
536 %generic-search-paths))
c69a8b7b 537
ce54f5db
RW
538(define-public gfortran-5
539 (custom-gcc gcc-5 "gfortran" '("fortran")
540 %generic-search-paths))
541
4b13e28a
EF
542(define-public gfortran-6
543 (custom-gcc gcc-6 "gfortran" '("fortran")
544 %generic-search-paths))
545
90027924
EF
546(define-public gfortran-7
547 (custom-gcc gcc-7 "gfortran" '("fortran")
548 %generic-search-paths))
549
eed67cbb 550(define-public gfortran
9af07624
LC
551 ;; Note: Update this when GCC changes! We cannot use
552 ;; (custom-gcc gcc "fortran" …) because that would lead to a package object
cb4805e3
RW
553 ;; that is not 'eq?' with GFORTRAN-5, and thus 'fold-packages' would
554 ;; report two gfortran@5 that are in fact identical.
555 gfortran-5)
eed67cbb 556
c8732e19
EF
557(define-public gccgo-4.9
558 (custom-gcc gcc-4.9 "gccgo" '("go")
009b53fd 559 %generic-search-paths
c4df90a5
MW
560 ;; Suppress the separate "lib" output, because otherwise the
561 ;; "lib" and "out" outputs would refer to each other, creating
562 ;; a cyclic dependency. <http://debbugs.gnu.org/18101>
563 #:separate-lib-output? #f))
fdd6c726
NK
564
565(define-public gcc-objc-4.8
009b53fd
LC
566 (custom-gcc gcc-4.8 "gcc-objc" '("objc")
567 (list (search-path-specification
568 (variable "OBJC_INCLUDE_PATH")
569 (files '("include")))
570 (search-path-specification
571 (variable "LIBRARY_PATH")
572 (files '("lib" "lib64"))))))
fdd6c726 573
2d69c161
RW
574(define-public gcc-objc-4.9
575 (custom-gcc gcc-4.9 "gcc-objc" '("objc")
576 (list (search-path-specification
577 (variable "OBJC_INCLUDE_PATH")
578 (files '("include")))
579 (search-path-specification
580 (variable "LIBRARY_PATH")
581 (files '("lib" "lib64"))))))
582
8b196ad2
RW
583(define-public gcc-objc gcc-objc-4.9)
584
fdd6c726 585(define-public gcc-objc++-4.8
009b53fd
LC
586 (custom-gcc gcc-4.8 "gcc-objc++" '("obj-c++")
587 (list (search-path-specification
588 (variable "OBJCPLUS_INCLUDE_PATH")
589 (files '("include")))
590 (search-path-specification
591 (variable "LIBRARY_PATH")
592 (files '("lib" "lib64"))))))
fdd6c726 593
a5948c0d
RW
594(define-public gcc-objc++-4.9
595 (custom-gcc gcc-4.9 "gcc-objc++" '("obj-c++")
596 (list (search-path-specification
597 (variable "OBJCPLUS_INCLUDE_PATH")
598 (files '("include")))
009b53fd
LC
599 (search-path-specification
600 (variable "LIBRARY_PATH")
601 (files '("lib" "lib64"))))))
fdd6c726 602
987a1183
RW
603(define-public gcc-objc++ gcc-objc++-4.9)
604
98b385d1
LC
605(define (make-libstdc++-doc gcc)
606 "Return a package with the libstdc++ documentation for GCC."
607 (package
608 (inherit gcc)
609 (name "libstdc++-doc")
610 (version (package-version gcc))
611 (synopsis "GNU libstdc++ documentation")
612 (outputs '("out"))
613 (native-inputs `(("doxygen" ,doxygen)
614 ("texinfo" ,texinfo)
615 ("libxml2" ,libxml2)
616 ("libxslt" ,libxslt)
617 ("docbook-xml" ,docbook-xml)
618 ("docbook-xsl" ,docbook-xsl)
619 ("graphviz" ,graphviz))) ;for 'dot', invoked by 'doxygen'
620 (inputs '())
621 (propagated-inputs '())
622 (arguments
623 '(#:out-of-source? #t
624 #:tests? #f ;it's just documentation
625 #:phases (modify-phases %standard-phases
626 (add-before 'configure 'chdir
627 (lambda _
628 (chdir "libstdc++-v3")))
629 (add-before 'configure 'set-xsl-directory
630 (lambda* (#:key inputs #:allow-other-keys)
631 (let ((docbook (assoc-ref inputs "docbook-xsl")))
632 (substitute* (find-files "doc"
633 "^Makefile\\.in$")
634 (("@XSL_STYLE_DIR@")
635 (string-append
636 docbook "/xml/xsl/"
b7c7c03e 637 (strip-store-file-name docbook)))))))
98b385d1
LC
638 (replace 'build
639 (lambda _
640 ;; XXX: There's also a 'doc-info' target, but it
641 ;; relies on docbook2X, which itself relies on
642 ;; DocBook 4.1.2, which is not really usable
643 ;; (lacks a catalog.xml.)
644 (zero? (system* "make"
645 "doc-html"
646 "doc-man"))))
647 (replace 'install
648 (lambda* (#:key outputs #:allow-other-keys)
649 (let ((out (assoc-ref outputs "out")))
650 (zero? (system* "make"
651 "doc-install-html"
652 "doc-install-man"))))))))))
653
654(define-public libstdc++-doc-4.9
655 (make-libstdc++-doc gcc-4.9))
656
629f4d2e
MW
657(define-public libstdc++-doc-5
658 (make-libstdc++-doc gcc-5))
98b385d1 659
832abc76
LC
660(define-public isl
661 (package
662 (name "isl")
663 (version "0.11.1")
664 (source (origin
665 (method url-fetch)
666 (uri (list (string-append
590a4904 667 "http://isl.gforge.inria.fr/isl-"
832abc76
LC
668 version
669 ".tar.bz2")
670 (string-append %gcc-infrastructure
671 name "-" version ".tar.gz")))
672 (sha256
673 (base32
2ff746dc
EF
674 "13d9cqa5rzhbjq0xf0b2dyxag7pqa72xj9dhsa03m8ccr1a4npq9"))
675 (patches (search-patches "isl-0.11.1-aarch64-support.patch"))))
832abc76
LC
676 (build-system gnu-build-system)
677 (inputs `(("gmp" ,gmp)))
590a4904 678 (home-page "http://isl.gforge.inria.fr/")
832abc76 679 (synopsis
9e771e3b
LC
680 "Manipulating sets and relations of integer points \
681bounded by linear constraints")
832abc76
LC
682 (description
683 "isl is a library for manipulating sets and relations of integer points
35b9e423 684bounded by linear constraints. Supported operations on sets include
832abc76
LC
685intersection, union, set difference, emptiness check, convex hull, (integer)
686affine hull, integer projection, computing the lexicographic minimum using
687parametric integer programming, coalescing and parametric vertex
35b9e423 688enumeration. It also includes an ILP solver based on generalized basis
832abc76
LC
689reduction, transitive closures on maps (which may encode infinite graphs),
690dependence analysis and bounds on piecewise step-polynomials.")
691 (license lgpl2.1+)))
692
693(define-public cloog
694 (package
695 (name "cloog")
696 (version "0.18.0")
697 (source
698 (origin
699 (method url-fetch)
700 (uri (list (string-append
701 "http://www.bastoul.net/cloog/pages/download/count.php3?url=cloog-"
702 version
703 ".tar.gz")
704 (string-append %gcc-infrastructure
705 name "-" version ".tar.gz")))
706 (sha256
707 (base32
708 "0a12rwfwp22zd0nlld0xyql11cj390rrq1prw35yjsw8wzfshjhw"))
709 (file-name (string-append name "-" version ".tar.gz"))))
710 (build-system gnu-build-system)
711 (inputs `(("gmp" ,gmp)
712 ("isl" ,isl)))
713 (arguments '(#:configure-flags '("--with-isl=system")))
714 (home-page "http://www.cloog.org/")
9e771e3b 715 (synopsis "Library to generate code for scanning Z-polyhedra")
832abc76
LC
716 (description
717 "CLooG is a free software library to generate code for scanning
718Z-polyhedra. That is, it finds a code (e.g., in C, FORTRAN...) that
719reaches each integral point of one or more parameterized polyhedra.
720CLooG has been originally written to solve the code generation problem
721for optimizing compilers based on the polytope model. Nevertheless it
722is used now in various area e.g., to build control automata for
723high-level synthesis or to find the best polynomial approximation of a
724function. CLooG may help in any situation where scanning polyhedra
725matters. While the user has full control on generated code quality,
726CLooG is designed to avoid control overhead and to produce a very
727effective code.")
728 (license gpl2+)))
5c126b64 729
50c7a1e2
LC
730(define-public gnu-c-manual
731 (package
732 (name "gnu-c-manual")
d35f8c7c 733 (version "0.2.5")
50c7a1e2
LC
734 (source (origin
735 (method url-fetch)
736 (uri (string-append "mirror://gnu/gnu-c-manual/gnu-c-manual-"
737 version ".tar.gz"))
738 (sha256
739 (base32
d35f8c7c 740 "1sfsj9256w18qzylgag2h5h377aq8in8929svblfnj9svfriqcys"))))
50c7a1e2
LC
741 (build-system gnu-build-system)
742 (native-inputs `(("texinfo" ,texinfo)))
743 (arguments
744 '(#:phases (modify-phases %standard-phases
745 (delete 'configure)
746 (delete 'check)
747 (replace 'build
748 (lambda _
749 (zero? (system* "make"
750 "gnu-c-manual.info"
751 "gnu-c-manual.html"))))
752 (replace 'install
753 (lambda* (#:key outputs #:allow-other-keys)
754 (let* ((out (assoc-ref outputs "out"))
755 (info (string-append out "/share/info"))
756 (html (string-append
757 out "/share/doc/gnu-c-manual")))
758 (mkdir-p info)
759 (mkdir-p html)
760
761 (for-each (lambda (file)
762 (copy-file file
763 (string-append info "/"
764 file)))
765 (find-files "." "\\.info(-[0-9])?$"))
766 (for-each (lambda (file)
767 (copy-file file
768 (string-append html "/"
769 file)))
770 (find-files "." "\\.html$"))
771 #t))))))
772 (synopsis "Reference manual for the C programming language")
773 (description
774 "This is a reference manual for the C programming language, as
775implemented by the GNU C Compiler (gcc). As a reference, it is not intended
776to be a tutorial of the language. Rather, it outlines all of the constructs
777of the language. Library functions are not included.")
6fd52309 778 (home-page "https://www.gnu.org/software/gnu-c-manual/")
50c7a1e2 779 (license fdl1.3+)))