gnu: deutex: Update to 5.2.1.
[jackhill/guix/guix.git] / gnu / packages / commencement.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
3 ;;; Copyright © 2014 Andreas Enge <andreas@enge.fr>
4 ;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org>
5 ;;; Copyright © 2014, 2015, 2017 Mark H Weaver <mhw@netris.org>
6 ;;; Copyright © 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
7 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
8 ;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
9 ;;; Copyright © 2019 Marius Bakke <mbakke@fastmail.com>
10 ;;;
11 ;;; This file is part of GNU Guix.
12 ;;;
13 ;;; GNU Guix is free software; you can redistribute it and/or modify it
14 ;;; under the terms of the GNU General Public License as published by
15 ;;; the Free Software Foundation; either version 3 of the License, or (at
16 ;;; your option) any later version.
17 ;;;
18 ;;; GNU Guix is distributed in the hope that it will be useful, but
19 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;;; GNU General Public License for more details.
22 ;;;
23 ;;; You should have received a copy of the GNU General Public License
24 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
25
26 (define-module (gnu packages commencement)
27 #:use-module ((guix licenses)
28 #:select (gpl3+ lgpl2.0+ public-domain))
29 #:use-module (gnu packages)
30 #:use-module (gnu packages bootstrap)
31 #:use-module (gnu packages base)
32 #:use-module (gnu packages bash)
33 #:use-module (gnu packages c)
34 #:use-module (gnu packages gcc)
35 #:use-module (gnu packages m4)
36 #:use-module (gnu packages file)
37 #:use-module (gnu packages gawk)
38 #:use-module (gnu packages bison)
39 #:use-module (gnu packages flex)
40 #:use-module (gnu packages guile)
41 #:use-module (gnu packages gettext)
42 #:use-module (gnu packages multiprecision)
43 #:use-module (gnu packages compression)
44 #:use-module (gnu packages mes)
45 #:use-module (gnu packages perl)
46 #:use-module (gnu packages python)
47 #:use-module (gnu packages linux)
48 #:use-module (gnu packages hurd)
49 #:use-module (gnu packages texinfo)
50 #:use-module (gnu packages pkg-config)
51 #:use-module (gnu packages xml)
52 #:use-module (guix packages)
53 #:use-module (guix download)
54 #:use-module (guix build-system gnu)
55 #:use-module (guix build-system trivial)
56 #:use-module (guix memoization)
57 #:use-module (guix utils)
58 #:use-module (srfi srfi-1)
59 #:use-module (srfi srfi-26)
60 #:use-module (ice-9 vlist)
61 #:use-module (ice-9 match)
62 #:use-module (ice-9 regex)
63 #:export (make-gcc-toolchain))
64
65 ;;; Commentary:
66 ;;;
67 ;;; This is the commencement, this is where things start. Before the
68 ;;; commencement, of course, there's the 'bootstrap' module, which provides us
69 ;;; with the initial binaries. This module uses those bootstrap binaries to
70 ;;; actually build up the whole tool chain that make up the implicit inputs of
71 ;;; 'gnu-build-system'.
72 ;;;
73 ;;; To avoid circular dependencies, this module should not be imported
74 ;;; directly from anywhere.
75 ;;;
76 ;;; Below, we frequently use "inherit" to create modified packages. The
77 ;;; reason why we use "inherit" instead of "package/inherit" is because we do
78 ;;; not want these commencement packages to inherit grafts. By definition,
79 ;;; these packages are not depended on at run time by any of the packages we
80 ;;; use. Thus it does not make sense to inherit grafts. Furthermore, those
81 ;;; grafts would often lead to extra overhead for users who would end up
82 ;;; downloading those "-boot0" packages just to build package replacements
83 ;;; that are in fact not going to be used.
84 ;;;
85 ;;; Code:
86
87 (define mes-boot
88 (package
89 (inherit mes)
90 (name "mes-boot")
91 (version "0.19")
92 (source (origin
93 (method url-fetch)
94 (uri (string-append "mirror://gnu/mes/"
95 "mes-" version ".tar.gz"))
96 (sha256
97 (base32
98 "15h4yhaywdc0djpjlin2jz1kzahpqxfki0r0aav1qm9nxxmnp1l0"))))
99 (inputs '())
100 (propagated-inputs '())
101 (native-inputs
102 `(("mescc-tools" ,%bootstrap-mescc-tools)
103 ("nyacc-source" ,(bootstrap-origin
104 (package-source nyacc-0.86)))
105
106 ("coreutils" , %bootstrap-coreutils&co)
107 ("bootstrap-mes" ,%bootstrap-mes)))
108 (arguments
109 `(#:implicit-inputs? #f
110 #:guile ,%bootstrap-guile
111 #:strip-binaries? #f ; binutil's strip b0rkes MesCC/M1/hex2 binaries
112 #:phases
113 (modify-phases %standard-phases
114 (add-after 'unpack 'unpack-seeds
115 (lambda _
116 (let ((nyacc-source (assoc-ref %build-inputs "nyacc-source"))
117 (bootstrap-mes (assoc-ref %build-inputs "bootstrap-mes")))
118 (with-directory-excursion ".."
119 (mkdir-p "nyacc-source")
120 (invoke "tar" "--strip=1" "-C" "nyacc-source" "-xvf" nyacc-source)
121 (symlink (string-append bootstrap-mes "/share/mes/lib") "mes-seed"))
122 #t)))
123 (replace 'configure
124 (lambda* (#:key outputs #:allow-other-keys)
125 (let ((out (assoc-ref %outputs "out")))
126 (setenv "GUILE" "mes")
127 (setenv "GUILE_EFFECTIVE_VERSION" "2.2")
128 (setenv "GUILE_LOAD_PATH" "nyacc")
129 (symlink (string-append "../nyacc-source/module") "nyacc")
130 (invoke "bash" "configure.sh"
131 (string-append "--prefix=" out)))))
132 (replace 'build
133 (lambda _
134 (let ((mes (assoc-ref %build-inputs "bootstrap-mes")))
135 (setenv "MES_PREFIX" (string-append mes "/share/mes"))
136 (setenv "MES_ARENA" "100000000")
137 (setenv "MES_MAX_ARENA" "100000000")
138 (setenv "MES_STACK" "10000000")
139 (invoke "sh" "bootstrap.sh"))))
140 (replace 'check
141 (lambda _
142 (setenv "DIFF" "sh scripts/diff.scm")
143 ;; fail fast tests
144 ;; (invoke "sh" "-x" "build-aux/test.sh" "scaffold/tests/t")
145 ;; (invoke "sh" "-x" "build-aux/test.sh" "scaffold/tests/63-struct-cell")
146 (invoke "sh" "check.sh")))
147 (replace 'install
148 (lambda _
149 (invoke "sh" "install.sh"))))))
150 (native-search-paths
151 ;; Use the language-specific variables rather than 'CPATH' because they
152 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
153 ;; The intent is to allow headers that are in the search path to be
154 ;; treated as "system headers" (headers exempt from warnings) just like
155 ;; the typical /usr/include headers on an FHS system.
156 (list (search-path-specification
157 (variable "C_INCLUDE_PATH")
158 (files '("share/mes/include")))
159 (search-path-specification
160 (variable "LIBRARY_PATH")
161 (files '("share/mes/lib")))))))
162
163 (define tcc-boot0
164 ;; Pristine tcc cannot be built by MesCC, we are keeping a delta of 11
165 ;; patches. In a very early and rough form they were presented to the
166 ;; TinyCC developers, who at the time showed no interest in supporting the
167 ;; bootstrappable effort; we will try again later. These patches have been
168 ;; ported to 0.9.27, alas the resulting tcc is buggy. Once MesCC is more
169 ;; mature, this package should use the 0.9.27 sources (or later).
170 (let ((version "0.9.26")
171 (revision "6")
172 (commit "c004e9a34fb026bb44d211ab98bb768e79900eef"))
173 (package
174 (inherit tcc)
175 (name "tcc-boot0")
176 (version (string-append version "-" revision "." (string-take commit 7)))
177 (source (origin
178 (method url-fetch)
179 (uri (list (string-append "mirror://gnu/guix/mirror"
180 "/tinycc-" commit ".tar.gz")
181 (string-append "https://gitlab.com/janneke/tinycc"
182 "/-/archive/" commit
183 "/tinycc-" commit ".tar.gz")))
184 (sha256
185 (base32
186 "1hmzn1pq0x22ppd80hyrn5qzqq94mxd0ychzj6vrr2vnj2frjv5b"))))
187 (build-system gnu-build-system)
188 (supported-systems '("i686-linux" "x86_64-linux"))
189 (inputs '())
190 (propagated-inputs '())
191 (native-inputs
192 `(("mes" ,mes-boot)
193 ("mescc-tools" ,%bootstrap-mescc-tools)
194 ("nyacc-source" ,(bootstrap-origin
195 (package-source nyacc-0.86)))
196
197 ("coreutils" , %bootstrap-coreutils&co)
198 ("bootstrap-mes" ,%bootstrap-mes)))
199 (arguments
200 `(#:implicit-inputs? #f
201 #:guile ,%bootstrap-guile
202 #:strip-binaries? #f ; binutil's strip b0rkes MesCC/M1/hex2 binaries
203 #:phases
204 (modify-phases %standard-phases
205 (add-after 'unpack 'unpack-seeds
206 (lambda* (#:key outputs #:allow-other-keys)
207 (let* ((coreutils (assoc-ref %build-inputs "coreutils"))
208 (nyacc-source (assoc-ref %build-inputs "nyacc-source"))
209 (bootstrap-mes (assoc-ref %build-inputs "bootstrap-mes")))
210 (setenv "PATH" (string-append
211 coreutils "/bin"))
212 (format (current-error-port) "PATH=~s\n" (getenv "PATH"))
213 (with-directory-excursion ".."
214 (mkdir-p "nyacc-source")
215 (invoke "tar" "--strip=1" "-C" "nyacc-source"
216 "-xvf" nyacc-source)
217 (symlink (string-append bootstrap-mes "/share/mes/lib") "mes-seed"))
218 #t)))
219 (replace 'configure
220 (lambda* (#:key outputs #:allow-other-keys)
221 (let* ((out (assoc-ref %outputs "out"))
222 (dir (with-directory-excursion ".." (getcwd)))
223 (coreutils (assoc-ref %build-inputs "coreutils"))
224 (mes (assoc-ref %build-inputs "mes"))
225 (mescc-tools (assoc-ref %build-inputs "mescc-tools"))
226 (libc (assoc-ref %build-inputs "libc"))
227 (interpreter (if libc
228 ;; also for x86_64-linux, we are still on i686-linux
229 (string-append libc ,(glibc-dynamic-linker "i686-linux"))
230 (string-append mes "/lib/mes-loader"))))
231 (setenv "PATH" (string-append
232 coreutils "/bin"
233 ":" mes "/bin"
234 ":" mescc-tools "/bin"))
235 (format (current-error-port) "PATH=~s\n" (getenv "PATH"))
236
237 (setenv "PREFIX" out)
238 (symlink (string-append mes "/share/mes") "mes")
239 (symlink (string-append "../nyacc-source/module") "nyacc")
240 (setenv "MES_PREFIX" "mes")
241 (setenv "MES_ARENA" "100000000")
242 (setenv "MES_MAX_ARENA" "100000000")
243 (setenv "MES_STACK" "10000000")
244 (setenv "MES" "mes")
245 (setenv "GUILE_LOAD_PATH" "nyacc")
246 (invoke "sh" "configure"
247 "--prefix=$PREFIX"
248 (string-append "--elfinterp=" interpreter)
249 "--crtprefix=."
250 "--tccdir=."))))
251 (replace 'build
252 (lambda _
253 (substitute* "bootstrap.sh"
254 (("^ cmp") "# cmp"))
255 (invoke "sh" "bootstrap.sh")))
256 (replace 'check
257 (lambda _
258 (setenv "DIFF" "diff.scm")
259 (setenv "OBJDUMP" "true")
260 ;; fail fast tests
261 ;; (invoke "sh" "test.sh" "mes/scaffold/tests/30-strlen")
262 ;; (invoke "sh" "-x" "test.sh" "mes/scaffold/tinycc/00_assignment")
263 (setenv "TCC" "./tcc")
264 (invoke "sh" "check.sh")))
265 (replace 'install
266 (lambda _
267 (invoke "sh" "install.sh"))))))
268 (native-search-paths
269 ;; Use the language-specific variables rather than 'CPATH' because they
270 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
271 ;; The intent is to allow headers that are in the search path to be
272 ;; treated as "system headers" (headers exempt from warnings) just like
273 ;; the typical /usr/include headers on an FHS system.
274 (list (search-path-specification
275 (variable "C_INCLUDE_PATH")
276 (files '("include")))
277 (search-path-specification
278 (variable "LIBRARY_PATH")
279 (files '("lib"))))))))
280
281 (define tcc-boot
282 (package
283 (inherit tcc-boot0)
284 (name "tcc-boot")
285 (version "0.9.27")
286 (source (bootstrap-origin
287 (origin
288 (inherit (package-source tcc))
289 (patches (search-patches "tcc-boot-0.9.27.patch")))))
290 (build-system gnu-build-system)
291 (inputs '())
292 (propagated-inputs '())
293 (native-inputs
294 `(("mes" ,mes-boot)
295 ("tcc" ,tcc-boot0)
296
297 ("coreutils" , %bootstrap-coreutils&co)))
298 (arguments
299 `(#:implicit-inputs? #f
300 #:guile ,%bootstrap-guile
301
302 ;; Binutils' 'strip' b0rkes MesCC/M1/hex2 binaries, tcc-boot also comes
303 ;; with MesCC/M1/hex2-built binaries.
304 #:strip-binaries? #f
305
306 #:phases
307 (modify-phases %standard-phases
308 (replace 'configure
309 (lambda* (#:key outputs #:allow-other-keys)
310 (let* ((out (assoc-ref %outputs "out"))
311 (coreutils (assoc-ref %build-inputs "coreutils"))
312 (mes (assoc-ref %build-inputs "mes"))
313 (tcc (assoc-ref %build-inputs "tcc"))
314 (libc (assoc-ref %build-inputs "libc"))
315 (interpreter (if libc
316 ;; also for x86_64-linux, we are still on i686-linux
317 (string-append libc ,(glibc-dynamic-linker "i686-linux"))
318 (string-append mes "/lib/mes-loader"))))
319 ;; unpack
320 (setenv "PATH" (string-append
321 coreutils "/bin"
322 ":" tcc "/bin"))
323 (format (current-error-port) "PATH=~s\n" (getenv "PATH"))
324 (invoke "sh" "configure"
325 (string-append "--cc=tcc")
326 (string-append "--cpu=i386")
327 (string-append "--prefix=" out)
328 (string-append "--elfinterp=" interpreter)
329 (string-append "--crtprefix=" tcc "/lib")
330 (string-append "--sysincludepaths=" tcc "/include")
331 (string-append "--libpaths=" tcc "/lib")))))
332 (replace 'build
333 (lambda* (#:key outputs #:allow-other-keys)
334 (let* ((out (assoc-ref %outputs "out"))
335 (mes (assoc-ref %build-inputs "mes"))
336 (tcc (assoc-ref %build-inputs "tcc"))
337 (libc (assoc-ref %build-inputs "libc"))
338 (interpreter (if libc
339 ;; also for x86_64-linux, we are still on i686-linux
340 (string-append libc ,(glibc-dynamic-linker "i686-linux"))
341 (string-append mes "/lib/mes-loader"))))
342 (invoke "tcc"
343 "-vvv"
344 "-D" "BOOTSTRAP=1"
345 "-D" "ONE_SOURCE=1"
346 "-D" "TCC_TARGET_I386=1"
347 "-D" "CONFIG_TCC_STATIC=1"
348 "-D" "CONFIG_USE_LIBGCC=1"
349 "-D" (string-append "CONFIG_TCCDIR=\"" out "/lib/tcc\"")
350 "-D" (string-append "CONFIG_TCC_CRTPREFIX=\"" out "/lib:{B}/lib:.\"")
351 "-D" (string-append "CONFIG_TCC_CRTPREFIX=\"" out
352 "/lib:{B}/lib:.\"")
353 "-D" (string-append "CONFIG_TCC_ELFINTERP=\"" interpreter "\"")
354 "-D" (string-append "CONFIG_TCC_LIBPATHS=\"" tcc "/lib:{B}/lib:.\"")
355 "-D" (string-append "CONFIG_TCC_SYSINCLUDEPATHS=\"" tcc "/include" ":/include:{B}/include\"")
356 "-D" (string-append "TCC_LIBGCC=\"" tcc "/lib/libc.a\"")
357 "-o" "tcc"
358 "tcc.c"))))
359 (replace 'check
360 (lambda _
361 ;; FIXME: add sensible check target (without depending on make)
362 ;; ./check.sh ?
363 (= 1 (status:exit-val (system* "./tcc" "--help")))))
364 (replace 'install
365 (lambda* (#:key outputs #:allow-other-keys)
366 (let ((out (assoc-ref %outputs "out"))
367 (tcc (assoc-ref %build-inputs "tcc")))
368 (mkdir-p (string-append out "/bin"))
369 (copy-file "tcc" (string-append out "/bin/tcc"))
370 (mkdir-p (string-append out "/lib/tcc"))
371 (copy-recursively (string-append tcc "/include")
372 (string-append out "/include"))
373 (copy-recursively (string-append tcc "/lib")
374 (string-append out "/lib"))
375 (invoke "tcc" "-D" "TCC_TARGET_I386=1" "-c" "-o" "libtcc1.o" "lib/libtcc1.c")
376 (invoke "tcc" "-ar" "rc" "libtcc1.a" "libtcc1.o")
377 (copy-file "libtcc1.a" (string-append out "/lib/libtcc1.a"))
378 (delete-file (string-append out "/lib/tcc/libtcc1.a"))
379 (copy-file "libtcc1.a" (string-append out "/lib/tcc/libtcc1.a"))
380 #t))))))))
381
382 (define make-mesboot0
383 (package
384 (inherit gnu-make)
385 (name "make-mesboot0")
386 (version "3.80")
387 (source (origin
388 (method url-fetch)
389 (uri (string-append "mirror://gnu/make/make-"
390 version ".tar.gz"))
391 (sha256
392 (base32
393 "1pb7fb7fqf9wz9najm85qdma1xhxzf1rhj5gwrlzdsz2zm0hpcv4"))))
394 (supported-systems '("i686-linux" "x86_64-linux"))
395 (inputs '())
396 (propagated-inputs '())
397 (native-inputs `(("tcc" ,tcc-boot)
398
399 ("bash" ,%bootstrap-coreutils&co)
400 ("coreutils" ,%bootstrap-coreutils&co)))
401 (arguments
402 `(#:implicit-inputs? #f
403 #:tests? #f ; check depends on perl
404 #:guile ,%bootstrap-guile
405 #:configure-flags `("CC=tcc -DO_RDONLY=0"
406 "LD=tcc"
407 "--disable-nls")
408 #:phases
409 (modify-phases %standard-phases
410 (add-after 'configure 'configure-fixup
411 (lambda _
412 (substitute* "build.sh"
413 (("^REMOTE=.*") "REMOTE=stub\n")
414 (("^extras=.*") "extras=getloadavg.c\n"))
415 (substitute* "make.h"
416 (("^extern long int lseek.*" all) (string-append "// " all)))
417 #t))
418 (delete 'patch-generated-file-shebangs) ; no perl
419 (replace 'build
420 (lambda _
421 (invoke "sh" "./build.sh")))
422 (replace 'install
423 (lambda* (#:key outputs #:allow-other-keys)
424 (let* ((out (assoc-ref outputs "out"))
425 (bin (string-append out "/bin")))
426 (install-file "make" bin)
427 #t))))))))
428
429 (define diffutils-mesboot
430 (package
431 (inherit diffutils)
432 (name "diffutils-mesboot")
433 (version "2.7")
434 (source (origin
435 (method url-fetch)
436 (uri (string-append "mirror://gnu/diffutils/diffutils-"
437 version ".tar.gz"))
438 (sha256
439 (base32
440 "1mirn5i825bn5w7rh6mgn0r8aj9xqanav95dwcl1b8sn82f4iwnm"))))
441 (supported-systems '("i686-linux" "x86_64-linux"))
442 (inputs '())
443 (propagated-inputs '())
444 (native-inputs `(("mes" ,mes-boot)
445 ("tcc" ,tcc-boot)
446
447 ("bash" ,%bootstrap-coreutils&co)
448 ("coreutils" ,%bootstrap-coreutils&co)
449 ("make" ,make-mesboot0)))
450 (arguments
451 `(#:implicit-inputs? #f
452 #:guile ,%bootstrap-guile
453 #:parallel-build? #f
454 #:tests? #f ; check is naive, also checks non-built PROGRAMS
455 #:strip-binaries? #f ; no strip yet
456 #:phases
457 (modify-phases %standard-phases
458 ;; diffutils-2.7 needs more traditional configure
459 (replace 'configure
460 (lambda* (#:key outputs #:allow-other-keys)
461 (let ((out (assoc-ref outputs "out"))
462 (bash (assoc-ref %build-inputs "bash")))
463 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
464 (setenv "CC" "tcc")
465 (setenv "LD" "tcc")
466 (invoke "./configure" (string-append "--prefix=" out)))))
467 (add-before 'configure 'remove-diff3-sdiff
468 (lambda* (#:key outputs #:allow-other-keys)
469 (substitute* "Makefile.in"
470 (("PROGRAMS = .*" all) "PROGRAMS = cmp diff"))
471 #t)))))))
472
473 (define binutils-mesboot0
474 (package
475 (inherit binutils)
476 (name "binutils-mesboot0")
477 (version "2.20.1a")
478 (source (bootstrap-origin
479 (origin
480 (method url-fetch)
481 (uri (string-append "mirror://gnu/binutils/binutils-"
482 version ".tar.bz2"))
483 (patches (search-patches "binutils-boot-2.20.1a.patch"))
484 (sha256
485 (base32
486 "0r7dr0brfpchh5ic0z9r4yxqn4ybzmlh25sbp30cacqk8nb7rlvi")))))
487 (inputs '())
488 (propagated-inputs '())
489 (native-inputs `(("tcc" ,tcc-boot)
490
491 ("bash" ,%bootstrap-coreutils&co)
492 ("coreutils" ,%bootstrap-coreutils&co)
493 ("diffutils" ,diffutils-mesboot)
494 ("make" ,make-mesboot0)))
495 (supported-systems '("i686-linux" "x86_64-linux"))
496 (arguments
497 `(#:implicit-inputs? #f
498 #:guile ,%bootstrap-guile
499 #:tests? #f ; runtest: command not found
500 #:parallel-build? #f
501 #:strip-binaries? #f ; no strip yet
502 #:configure-flags
503 (let ((cppflags (string-append " -D __GLIBC_MINOR__=6"
504 " -D MES_BOOTSTRAP=1"))
505 (bash (assoc-ref %build-inputs "bash")))
506 `(,(string-append "CONFIG_SHELL=" bash "/bin/sh")
507 ,(string-append "CPPFLAGS=" cppflags)
508 "AR=tcc -ar"
509 "CXX=false"
510 "RANLIB=true"
511 ,(string-append "CC=tcc" cppflags)
512 "--disable-nls"
513 "--disable-shared"
514 "--disable-werror"
515 "--build=i686-unknown-linux-gnu"
516 "--host=i686-unknown-linux-gnu"
517 "--with-sysroot=/"))))))
518
519 (define gcc-core-mesboot
520 ;; Gcc-2.95.3 is the most recent GCC that is supported by what the Mes C
521 ;; Library v0.16 offers. Gcc-3.x (and 4.x) place higher demands on a C
522 ;; library, such as dir.h/struct DIR/readdir, locales, signals... Also,
523 ;; with gcc-2.95.3, binutils-boot-2.20.1a and glibc-2.2.5 we found a GNU
524 ;; toolchain triplet "that works".
525 (package
526 (inherit gcc)
527 (name "gcc-core-mesboot")
528 (version "2.95.3")
529 (source (bootstrap-origin
530 (origin
531 (method url-fetch)
532 (uri (string-append "mirror://gnu/gcc/gcc-2.95.3/gcc-core-"
533 version
534 ".tar.gz"))
535 (patches (search-patches "gcc-boot-2.95.3.patch"))
536 (sha256
537 (base32
538 "1xvfy4pqhrd5v2cv8lzf63iqg92k09g6z9n2ah6ndd4h17k1x0an")))))
539 (supported-systems '("i686-linux" "x86_64-linux"))
540 (inputs '())
541 (propagated-inputs '())
542 (native-inputs `(("binutils" ,binutils-mesboot0)
543 ("tcc" ,tcc-boot)
544
545 ("bash" ,%bootstrap-coreutils&co)
546 ("coreutils" ,%bootstrap-coreutils&co)
547 ("diffutils" ,diffutils-mesboot)
548 ("make" ,make-mesboot0)))
549 (outputs '("out"))
550 (arguments
551 `(#:implicit-inputs? #f
552 #:guile ,%bootstrap-guile
553 #:tests? #f
554 #:parallel-build? #f
555 #:strip-binaries? #f
556 #:configure-flags
557 (let ((out (assoc-ref %outputs "out")))
558 `("--enable-static"
559 "--disable-shared"
560 "--disable-werror"
561 "--build=i686-unknown-linux-gnu"
562 "--host=i686-unknown-linux-gnu"
563 ,(string-append "--prefix=" out)))
564 #:make-flags (list
565 "CC=tcc -static -D __GLIBC_MINOR__=6"
566 "OLDCC=tcc -static -D __GLIBC_MINOR__=6"
567 "CC_FOR_BUILD=tcc -static -D __GLIBC_MINOR__=6"
568 "AR=ar"
569 "RANLIB=ranlib"
570 (string-append "LIBGCC2_INCLUDES=-I "
571 (assoc-ref %build-inputs "tcc")
572 "/include")
573 "LANGUAGES=c"
574 (string-append "BOOT_LDFLAGS="
575 " -B" (assoc-ref %build-inputs "tcc")
576 "/lib/"))
577 #:modules ((guix build gnu-build-system)
578 (guix build utils)
579 (srfi srfi-1))
580 #:phases
581 (modify-phases %standard-phases
582 ;; gcc-2.95.3 needs more traditional configure
583 (add-before 'configure 'setenv
584 (lambda* (#:key outputs #:allow-other-keys)
585 (let ((out (assoc-ref outputs "out"))
586 (bash (assoc-ref %build-inputs "bash"))
587 (tcc (assoc-ref %build-inputs "tcc"))
588 (cppflags " -D __GLIBC_MINOR__=6"))
589 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
590 (setenv "CPPFLAGS" cppflags)
591 (setenv "CC" (string-append "tcc" cppflags))
592 (setenv "CC_FOR_BUILD" (string-append "tcc" cppflags))
593 (setenv "CPP" (string-append "tcc -E" cppflags))
594 (with-output-to-file "config.cache"
595 (lambda _
596 (display "
597 ac_cv_c_float_format='IEEE (little-endian)'
598 ")))
599 #t)))
600 (replace 'configure
601 (lambda* (#:key configure-flags #:allow-other-keys)
602 (format (current-error-port)
603 "running ./configure ~a\n" (string-join configure-flags))
604 (apply invoke "./configure" configure-flags)))
605 (add-after 'configure 'remove-info
606 (lambda _
607 ;; no info at this stage
608 (delete-file-recursively "texinfo")
609 (invoke "touch" "gcc/cpp.info" "gcc/gcc.info")))
610 (add-after 'install 'install2
611 (lambda* (#:key outputs #:allow-other-keys)
612 (let* ((tcc (assoc-ref %build-inputs "tcc"))
613 (tcc-lib (string-append tcc "/lib/x86-mes-gcc"))
614 (out (assoc-ref outputs "out"))
615 (gcc-dir (string-append
616 out "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3")))
617 (mkdir-p "tmp")
618 (zero? (system (string-append "set -x; cd tmp && ar x ../gcc/libgcc2.a")))
619 (zero? (system (string-append "set -x; cd tmp && ar r " gcc-dir "/libgcc.a *.o")))
620 (copy-file "gcc/libgcc2.a" (string-append out "/lib/libgcc2.a"))
621 (copy-file (string-append tcc "/lib/libtcc1.a")
622 (string-append out "/lib/libtcc1.a"))
623 (invoke "ar" "r" (string-append gcc-dir "/libc.a")
624 (string-append tcc-lib "/libc+gnu.o")
625 (string-append tcc-lib "/libtcc1.o"))
626 (invoke "ar" "r" (string-append out "/lib/libc.a")
627 (string-append tcc-lib "/libc+gnu.o")
628 (string-append tcc-lib "/libtcc1.o"))
629 (invoke "ls" "-ltrF" gcc-dir)
630 (copy-recursively (string-append tcc "/include")
631 (string-append out "/include"))
632 #t))))))
633 (native-search-paths
634 ;; Use the language-specific variables rather than 'CPATH' because they
635 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
636 ;; The intent is to allow headers that are in the search path to be
637 ;; treated as "system headers" (headers exempt from warnings) just like
638 ;; the typical /usr/include headers on an FHS system.
639 (list (search-path-specification
640 (variable "C_INCLUDE_PATH")
641 (files '("include" "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include")))
642 (search-path-specification
643 (variable "LIBRARY_PATH")
644 (files '("lib")))))))
645
646 (define mesboot-headers
647 (package
648 (inherit mes-boot)
649 (name "mesboot-headers")
650 (supported-systems '("i686-linux" "x86_64-linux"))
651 (inputs '())
652 (propagated-inputs '())
653 (native-inputs `(("coreutils" ,%bootstrap-coreutils&co)
654 ("headers" ,%bootstrap-linux-libre-headers)))
655 (arguments
656 `(#:implicit-inputs? #f
657 #:guile ,%bootstrap-guile
658 #:tests? #f
659 #:strip-binaries? #f
660 #:phases
661 (modify-phases %standard-phases
662 (delete 'configure)
663 (delete 'build)
664 (replace 'install
665 (lambda* (#:key outputs #:allow-other-keys)
666 (let* ((out (assoc-ref outputs "out"))
667 (include (string-append out "/include"))
668 (headers (assoc-ref %build-inputs "headers" )))
669 (mkdir-p include)
670 (copy-recursively "include" out)
671 (copy-recursively headers out)
672 #t))))))
673 (native-search-paths
674 ;; Use the language-specific variables rather than 'CPATH' because they
675 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
676 ;; The intent is to allow headers that are in the search path to be
677 ;; treated as "system headers" (headers exempt from warnings) just like
678 ;; the typical /usr/include headers on an FHS system.
679 (list (search-path-specification
680 (variable "C_INCLUDE_PATH")
681 (files '("include")))))))
682
683 (define glibc-mesboot0
684 ;; GNU C Library 2.2.5 is the most recent glibc that we managed to build
685 ;; using gcc-2.95.3. Newer versions (2.3.x, 2.6, 2.1x) seem to need a newer
686 ;; gcc.
687 (package
688 (inherit glibc)
689 (name "glibc-mesboot0")
690 (version "2.2.5")
691 (source (bootstrap-origin
692 (origin
693 (method url-fetch)
694 (uri (string-append "mirror://gnu/glibc/glibc-"
695 version
696 ".tar.gz"))
697 (patches (search-patches "glibc-boot-2.2.5.patch"))
698 (sha256
699 (base32
700 "1vl48i16gx6h68whjyhgnn1s57vqq32f9ygfa2fls7pdkbsqvp2q")))))
701 (supported-systems '("i686-linux" "x86_64-linux"))
702 (inputs '())
703 (propagated-inputs '())
704 (native-inputs `(("binutils" ,binutils-mesboot0)
705 ("gcc" ,gcc-core-mesboot)
706
707 ("bash" ,%bootstrap-coreutils&co)
708 ("coreutils" ,%bootstrap-coreutils&co)
709 ("diffutils" ,diffutils-mesboot)
710 ("headers" ,mesboot-headers)
711 ("make" ,make-mesboot0)))
712 (outputs '("out"))
713 (arguments
714 `(#:implicit-inputs? #f
715 #:guile ,%bootstrap-guile
716 #:tests? #f
717 #:strip-binaries? #f
718 #:parallel-build? #f ; gcc-2.95.3 ICEs on massively parallel builds
719 #:make-flags (list (string-append
720 "SHELL="
721 (assoc-ref %build-inputs "bash")
722 "/bin/sh"))
723 #:configure-flags
724 (let ((out (assoc-ref %outputs "out"))
725 (headers (assoc-ref %build-inputs "headers")))
726 (list
727 "--disable-shared"
728 "--enable-static"
729 "--disable-sanity-checks"
730 "--build=i686-unknown-linux-gnu"
731 "--host=i686-unknown-linux-gnu"
732 (string-append "--with-headers=" headers "/include")
733 "--enable-static-nss"
734 "--without-__thread"
735 "--without-cvs"
736 "--without-gd"
737 "--without-tls"
738 (string-append "--prefix=" out)))
739 #:phases
740 (modify-phases %standard-phases
741 (add-before 'configure 'setenv
742 (lambda* (#:key outputs #:allow-other-keys)
743 (let* ((out (assoc-ref outputs "out"))
744 (bash (assoc-ref %build-inputs "bash"))
745 (gcc (assoc-ref %build-inputs "gcc"))
746 (headers (assoc-ref %build-inputs "headers"))
747 (cppflags (string-append
748 ;;" -D __STDC__=1"
749 " -D MES_BOOTSTRAP=1"
750 " -D BOOTSTRAP_GLIBC=1"))
751 (cflags (string-append " -L " (getcwd))))
752 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
753 (setenv "SHELL" (getenv "CONFIG_SHELL"))
754 (setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
755 (setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags))
756 #t)))
757 ;; glibc-2.2.5 needs a more classic invocation of configure
758 ;; configure: warning: CONFIG_SHELL=/gnu/store/…-bash-minimal-4.4.12/bin/bash: invalid host type
759 (replace 'configure
760 (lambda* (#:key configure-flags #:allow-other-keys)
761 (format (current-error-port)
762 "running ./configure ~a\n" (string-join configure-flags))
763 (apply invoke "./configure" configure-flags))))))
764 (native-search-paths
765 ;; Use the language-specific variables rather than 'CPATH' because they
766 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
767 ;; The intent is to allow headers that are in the search path to be
768 ;; treated as "system headers" (headers exempt from warnings) just like
769 ;; the typical /usr/include headers on an FHS system.
770 (list (search-path-specification
771 (variable "C_INCLUDE_PATH")
772 (files '("include")))
773 (search-path-specification
774 (variable "CPLUS_INCLUDE_PATH")
775 (files '("include")))
776 (search-path-specification
777 (variable "LIBRARY_PATH")
778 (files '("lib")))))))
779
780 (define gcc-mesboot0
781 (package
782 (inherit gcc-core-mesboot)
783 (name "gcc-mesboot0")
784 (native-inputs `(("binutils" ,binutils-mesboot0)
785 ("gcc" ,gcc-core-mesboot)
786 ("libc" ,glibc-mesboot0)
787
788 ("bash" ,%bootstrap-coreutils&co)
789 ("coreutils" ,%bootstrap-coreutils&co)
790 ("diffutils" ,diffutils-mesboot)
791 ("kernel-headers" ,%bootstrap-linux-libre-headers)
792 ("make" ,make-mesboot0)))
793 (arguments
794 (substitute-keyword-arguments (package-arguments gcc-core-mesboot)
795 ((#:phases phases)
796 `(modify-phases ,phases
797 (replace 'setenv
798 (lambda* (#:key outputs #:allow-other-keys)
799 (let ((out (assoc-ref outputs "out"))
800 (bash (assoc-ref %build-inputs "bash"))
801 (gcc (assoc-ref %build-inputs "gcc"))
802 (glibc (assoc-ref %build-inputs "libc"))
803 (kernel-headers (assoc-ref %build-inputs "kernel-headers")))
804 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
805 (format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
806 (setenv "C_INCLUDE_PATH" (string-append
807 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include"
808 ":" kernel-headers "/include"
809 ":" glibc "/include"))
810 (format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
811 (format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
812 ;; FIXME: add glibc dirs to paths manually
813 (setenv "LIBRARY_PATH" (string-join
814 (list (string-append glibc "/lib")
815 (getenv "LIBRARY_PATH"))
816 ":"))
817 (format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
818 (with-output-to-file "config.cache"
819 (lambda _
820 (display "
821 ac_cv_c_float_format='IEEE (little-endian)'
822 ")))
823 #t)))
824 (replace 'install2
825 (lambda* (#:key outputs #:allow-other-keys)
826 (let* ((out (assoc-ref outputs "out"))
827 (gcc-dir (string-append
828 out "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3")))
829 (mkdir-p "tmp")
830 (zero? (system (string-append "set -x; cd tmp && ar x ../gcc/libgcc2.a")))
831 (zero? (system (string-append "set -x; cd tmp && ar r " gcc-dir "/libgcc.a *.o")))
832 (copy-file "gcc/libgcc2.a" (string-append out "/lib/libgcc2.a"))
833 #t)))))
834 ((#:configure-flags configure-flags)
835 `(let ((out (assoc-ref %outputs "out")))
836 `("--disable-shared"
837 "--disable-werror"
838 "--build=i686-unknown-linux-gnu"
839 "--host=i686-unknown-linux-gnu"
840 ,(string-append "--prefix=" out))))
841 ((#:make-flags make-flags)
842 `(let ((gcc (assoc-ref %build-inputs "gcc")))
843 `("RANLIB=true"
844 ,(string-append "LIBGCC2_INCLUDES=-I " gcc "/include")
845 "LANGUAGES=c")))))))
846
847 (define binutils-mesboot
848 (package
849 (inherit binutils-mesboot0)
850 (name "binutils-mesboot")
851 (native-inputs `(("binutils" ,binutils-mesboot0)
852 ("libc" ,glibc-mesboot0)
853 ("gcc" ,gcc-mesboot0)
854
855 ("bash" ,%bootstrap-coreutils&co)
856 ("coreutils" ,%bootstrap-coreutils&co)
857 ("diffutils" ,diffutils-mesboot)
858 ("kernel-headers" ,%bootstrap-linux-libre-headers)
859 ("make" ,make-mesboot0)))
860 (arguments
861 (substitute-keyword-arguments (package-arguments binutils-mesboot0)
862 ((#:configure-flags configure-flags)
863 '(list "--disable-nls"
864 "--disable-shared"
865 "--disable-werror"
866 "--build=i686-unknown-linux-gnu"
867 "--host=i686-unknown-linux-gnu"
868 "--with-sysroot=/"))))))
869
870 (define make-mesboot
871 (package
872 (inherit make-mesboot0)
873 (name "make-mesboot")
874 (version "3.82")
875 (source (origin
876 (method url-fetch)
877 (uri (string-append "mirror://gnu/make/make-"
878 version ".tar.gz"))
879 (sha256
880 (base32
881 "1rs2f9hmvy3q6zkl15jnlmnpgffm0bhw5ax0h5c7q604wqrip69x"))))
882 (native-inputs `(("binutils" ,binutils-mesboot0)
883 ("libc" ,glibc-mesboot0)
884 ("gcc" ,gcc-mesboot0)
885 ("make" ,make-mesboot0)
886
887 ("bash" ,%bootstrap-coreutils&co)
888 ("coreutils" ,%bootstrap-coreutils&co)
889 ("kernel-headers" ,%bootstrap-linux-libre-headers)))
890 (arguments
891 (substitute-keyword-arguments (package-arguments make-mesboot0)
892 ((#:configure-flags configure-flags)
893 `(let ((out (assoc-ref %outputs "out")))
894 `(,(string-append "--prefix=" out))))
895 ((#:phases phases)
896 `(modify-phases ,phases
897 (delete 'configure-fixup)
898 (add-before 'configure 'setenv
899 (lambda _
900 (setenv "LIBS" "-lc -lnss_files -lnss_dns -lresolv")
901 #t))))))))
902
903 (define gmp-boot
904 (package
905 (inherit gmp)
906 (version "4.3.2")
907 (source (origin
908 (method url-fetch)
909 (uri (string-append "mirror://gnu/gmp/gmp-" version
910 ".tar.gz"))
911 (sha256 (base32
912 "15rwq54fi3s11izas6g985y9jklm3xprfsmym3v1g6xr84bavqvv"))))))
913
914 (define mpfr-boot
915 (package
916 (inherit mpfr)
917 (version "2.4.2")
918 (source (origin
919 (method url-fetch)
920 (uri (string-append "mirror://gnu/mpfr/mpfr-" version
921 ".tar.gz"))
922 (sha256 (base32
923 "0dxn4904dra50xa22hi047lj8kkpr41d6vb9sd4grca880c7wv94"))))))
924
925 (define mpc-boot
926 (package
927 (inherit mpc)
928 (version "1.0.3")
929 (source (origin
930 (method url-fetch)
931 (uri (string-append
932 "mirror://gnu/mpc/mpc-" version ".tar.gz"))
933 (sha256
934 (base32
935 "1hzci2zrrd7v3g1jk35qindq05hbl0bhjcyyisq9z209xb3fqzb1"))))))
936
937 (define gcc-mesboot1
938 (package
939 (inherit gcc-mesboot0)
940 (name "gcc-mesboot1")
941 (version "4.7.4")
942 (source (bootstrap-origin
943 (origin (inherit (package-source gcc-4.7))
944 (patches (search-patches "gcc-boot-4.7.4.patch")))))
945 (inputs `(("gmp-source" ,(package-source gmp-boot))
946 ("mpfr-source" ,(package-source mpfr-boot))
947 ("mpc-source" ,(package-source mpc-boot))))
948 (native-inputs `(("binutils" ,binutils-mesboot)
949 ("gcc" ,gcc-mesboot0)
950 ("libc" ,glibc-mesboot0)
951
952 ("bash" ,%bootstrap-coreutils&co)
953 ("coreutils" ,%bootstrap-coreutils&co)
954 ("diffutils" ,diffutils-mesboot)
955 ("kernel-headers" ,%bootstrap-linux-libre-headers)
956 ("make" ,make-mesboot)))
957 (arguments
958 (substitute-keyword-arguments (package-arguments gcc-core-mesboot)
959 ((#:make-flags make-flags)
960 `(let* ((libc (assoc-ref %build-inputs "libc"))
961 (ldflags (string-append
962 "-B" libc "/lib "
963 "-Wl,-dynamic-linker "
964 "-Wl," libc
965 ,(glibc-dynamic-linker "i686-linux"))))
966 (list (string-append "LDFLAGS=" ldflags)
967 (string-append "LDFLAGS_FOR_TARGET=" ldflags))))
968 ((#:phases phases)
969 `(modify-phases ,phases
970 ;; c&p from commencement.scm:gcc-boot0
971 (add-after 'unpack 'unpack-gmp&co
972 (lambda* (#:key inputs #:allow-other-keys)
973 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
974 (mpfr (assoc-ref %build-inputs "mpfr-source"))
975 (mpc (assoc-ref %build-inputs "mpc-source")))
976
977 ;; To reduce the set of pre-built bootstrap inputs, build
978 ;; GMP & co. from GCC.
979 (for-each (lambda (source)
980 (or (invoke "tar" "xvf" source)
981 (error "failed to unpack tarball"
982 source)))
983 (list gmp mpfr mpc))
984
985 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
986 ,@(map (lambda (lib)
987 ;; Drop trailing letters, as gmp-6.0.0a unpacks
988 ;; into gmp-6.0.0.
989 `(symlink ,(string-trim-right
990 (package-full-name lib "-")
991 char-set:letter)
992 ,(package-name lib)))
993 (list gmp-boot mpfr-boot mpc-boot))
994 #t)))
995 (delete 'remove-info)
996 (replace 'setenv
997 (lambda* (#:key outputs #:allow-other-keys)
998 (let* ((out (assoc-ref outputs "out"))
999 (binutils (assoc-ref %build-inputs "binutils"))
1000 (bash (assoc-ref %build-inputs "bash"))
1001 (gcc (assoc-ref %build-inputs "gcc"))
1002 (glibc (assoc-ref %build-inputs "libc"))
1003 (kernel-headers (assoc-ref %build-inputs "kernel-headers")))
1004 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
1005 (setenv "C_INCLUDE_PATH" (string-append
1006 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include"
1007 ":" kernel-headers "/include"
1008 ":" glibc "/include"
1009 ":" (getcwd) "/mpfr/src"))
1010 (setenv "LIBRARY_PATH" (string-append glibc "/lib"
1011 ":" gcc "/lib"))
1012 (format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
1013 (format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
1014 #t)))
1015 (delete 'install2)))
1016 ((#:configure-flags configure-flags)
1017 `(let ((out (assoc-ref %outputs "out"))
1018 (glibc (assoc-ref %build-inputs "libc")))
1019 (list (string-append "--prefix=" out)
1020 "--build=i686-unknown-linux-gnu"
1021 "--host=i686-unknown-linux-gnu"
1022
1023 (string-append "--with-native-system-header-dir=" glibc "/include")
1024 (string-append "--with-build-sysroot=" glibc "/include")
1025
1026 "--disable-bootstrap"
1027 "--disable-decimal-float"
1028 "--disable-libatomic"
1029 "--disable-libcilkrts"
1030 "--disable-libgomp"
1031 "--disable-libitm"
1032 "--disable-libmudflap"
1033 "--disable-libquadmath"
1034 "--disable-libsanitizer"
1035 "--disable-libssp"
1036 "--disable-libvtv"
1037 "--disable-lto"
1038 "--disable-lto-plugin"
1039 "--disable-multilib"
1040 "--disable-plugin"
1041 "--disable-threads"
1042 "--enable-languages=c,c++"
1043
1044 "--enable-static"
1045 ;; libstdc++.so: error: depends on 'libgcc_s.so.1', which cannot be found in RUNPATH ()
1046 "--disable-shared"
1047 "--enable-threads=single"
1048
1049 ;; No pre-compiled libstdc++ headers, to save space.
1050 "--disable-libstdcxx-pch"
1051
1052 ;; for libcpp ...
1053 "--disable-build-with-cxx")))))))
1054
1055 (define gcc-mesboot1-wrapper
1056 ;; We need this so gcc-mesboot1 can be used to create shared binaries that
1057 ;; have the correct interpreter, otherwise configuring gcc-mesboot using
1058 ;; --enable-shared will fail.
1059 (package
1060 (inherit gcc-mesboot1)
1061 (name "gcc-mesboot1-wrapper")
1062 (source #f)
1063 (inputs '())
1064 (native-inputs `(("bash" ,%bootstrap-coreutils&co)
1065 ("libc" ,glibc-mesboot)
1066 ("gcc" ,gcc-mesboot1)))
1067 (arguments
1068 `(#:implicit-inputs? #f
1069 #:guile ,%bootstrap-guile
1070 #:phases
1071 (modify-phases %standard-phases
1072 (delete 'unpack)
1073 (delete 'configure)
1074 (delete 'install)
1075 (replace 'build
1076 (lambda* (#:key outputs #:allow-other-keys)
1077 (let* ((out (assoc-ref outputs "out"))
1078 (bash (assoc-ref %build-inputs "bash"))
1079 (libc (assoc-ref %build-inputs "libc"))
1080 (gcc (assoc-ref %build-inputs "gcc"))
1081 (bin (string-append out "/bin")))
1082 (mkdir-p bin)
1083 (for-each
1084 (lambda (program)
1085 (let ((wrapper (string-append bin "/" program)))
1086 (with-output-to-file wrapper
1087 (lambda _
1088 (display (string-append "#! " bash "/bin/bash
1089 exec " gcc "/bin/" program
1090 " -Wl,--dynamic-linker"
1091 ;; also for x86_64-linux, we are still on i686-linux
1092 " -Wl," libc ,(glibc-dynamic-linker "i686-linux")
1093 " -Wl,--rpath"
1094 " -Wl," libc "/lib"
1095 " \"$@\"
1096 "))
1097 (chmod wrapper #o555)))))
1098 '(
1099 "gcc"
1100 "g++"
1101 "i686-unknown-linux-gnu-gcc"
1102 "i686-unknown-linux-gnu-g++"
1103 ))
1104 #t)))
1105 (replace 'check
1106 (lambda* (#:key outputs #:allow-other-keys)
1107 (let* ((out (assoc-ref outputs "out"))
1108 (bin (string-append out "/bin"))
1109 (program (string-append bin "/gcc")))
1110 (invoke program "--help")))))))))
1111
1112 (define glibc-headers-mesboot
1113 (package
1114 (inherit glibc-mesboot0)
1115 (name "glibc-headers-mesboot")
1116 (version "2.16.0")
1117 (source (bootstrap-origin
1118 (origin
1119 (method url-fetch)
1120 (uri (string-append "mirror://gnu/glibc/glibc-"
1121 version
1122 ".tar.gz"))
1123 (patches (search-patches "glibc-boot-2.16.0.patch"
1124 "glibc-bootstrap-system-2.16.0.patch"))
1125 (sha256
1126 (base32
1127 "0vlz4x6cgz7h54qq4528q526qlhnsjzbsvgc4iizn76cb0bfanx7")))))
1128 (native-inputs `(("binutils" ,binutils-mesboot)
1129 ("libc" ,glibc-mesboot0)
1130 ("gcc" ,gcc-mesboot1)
1131 ("headers" ,mesboot-headers)
1132
1133 ("bash" ,%bootstrap-coreutils&co)
1134 ("coreutils" ,%bootstrap-coreutils&co)
1135 ("diffutils" ,diffutils-mesboot)
1136 ("kernel-headers" ,%bootstrap-linux-libre-headers)
1137 ("make" ,make-mesboot)))
1138
1139 (arguments
1140 (substitute-keyword-arguments (package-arguments glibc-mesboot0)
1141 ((#:configure-flags configure-flags)
1142 `(let ((out (assoc-ref %outputs "out"))
1143 (headers (assoc-ref %build-inputs "headers")))
1144 (list
1145 (string-append "--prefix=" out)
1146 "--disable-obsolete-rpc"
1147 "--host=i686-unknown-linux-gnu"
1148 (string-append "--with-headers=" headers "/include")
1149 "--enable-static-nss"
1150 "--with-pthread"
1151 "--without-cvs"
1152 "--without-gd"
1153 "--enable-add-ons=nptl")))
1154 ((#:make-flags make-flags)
1155 `(let ((bash (assoc-ref %build-inputs "bash")))
1156 (list (string-append "SHELL=" bash "/bin/sh")
1157 "install-bootstrap-headers=yes" "install-headers")))
1158 ((#:phases phases)
1159 `(modify-phases ,phases
1160 (replace 'setenv
1161 (lambda* (#:key outputs #:allow-other-keys)
1162 (let* ((out (assoc-ref outputs "out"))
1163 (headers (assoc-ref %build-inputs "headers"))
1164 (bash (assoc-ref %build-inputs "bash"))
1165 (coreutils (assoc-ref %build-inputs "coreutils"))
1166 (libc (assoc-ref %build-inputs "libc"))
1167 (gcc (assoc-ref %build-inputs "gcc"))
1168 (cppflags (string-append
1169 " -I " (getcwd) "/nptl/sysdeps/pthread/bits"
1170 " -D BOOTSTRAP_GLIBC=1"))
1171 (cflags (string-append " -L " (getcwd)
1172 " -L " libc "/lib")))
1173 (setenv "libc_cv_friendly_stddef" "yes")
1174 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
1175 (setenv "SHELL" (getenv "CONFIG_SHELL"))
1176 (format (current-error-port) "CONFIG_SHELL=~s\n" (getenv "CONFIG_SHELL"))
1177
1178 (setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
1179 (setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags))
1180
1181 ;; avoid -fstack-protector
1182 (setenv "libc_cv_ssp" "false")
1183 (substitute* "configure"
1184 (("/bin/pwd") (string-append coreutils "/bin/pwd")))
1185 (setenv "C_INCLUDE_PATH" (string-append libc "/include"
1186 headers "/include"))
1187 (setenv "LIBRARY_PATH" (string-append libc "/lib"))
1188 #t)))
1189 (replace 'install
1190 (lambda* (#:key outputs make-flags #:allow-other-keys)
1191 (let ((kernel-headers (assoc-ref %build-inputs "kernel-headers"))
1192 (out (assoc-ref outputs "out")))
1193 (apply invoke "make" make-flags)
1194 (copy-recursively kernel-headers out)
1195 #t)))
1196 (replace 'configure
1197 (lambda* (#:key configure-flags #:allow-other-keys)
1198 (format (current-error-port) "running ../configure ~a\n" (string-join configure-flags))
1199 (mkdir-p "build")
1200 (chdir "build")
1201 (apply invoke "../configure" configure-flags)))
1202 (add-after 'configure 'remove-sunrpc
1203 (lambda _
1204 (invoke "make" (string-append (getcwd) "/sysd-sorted" )
1205 (string-append "SHELL=" (getenv "CONFIG_SHELL")))
1206 (substitute* "sysd-sorted"
1207 ((" sunrpc") " ")
1208 ((" nis") " "))
1209 ;; 'rpcgen' needs native libc headers to be built.
1210 (substitute* "../Makefile"
1211 (("^SHELL := /bin/sh") (string-append "SHELL := " (getenv "CONFIG_SHELL"))))
1212 (substitute* "../Makeconfig"
1213 (("^SHELL := /bin/sh") (string-append "SHELL := " (getenv "CONFIG_SHELL"))))
1214 (substitute* "../elf/Makefile"
1215 (("^SHELL := /bin/sh") (string-append "SHELL := " (getenv "CONFIG_SHELL"))))))))))))
1216
1217 (define glibc-mesboot
1218 (package
1219 (inherit glibc-headers-mesboot)
1220 (name "glibc-mesboot")
1221 (native-inputs `(("binutils" ,binutils-mesboot)
1222 ("libc" ,glibc-mesboot0)
1223 ("headers" ,glibc-headers-mesboot)
1224 ("gcc" ,gcc-mesboot1)
1225
1226 ("bash" ,%bootstrap-coreutils&co)
1227 ("coreutils" ,%bootstrap-coreutils&co)
1228 ("diffutils" ,diffutils-mesboot)
1229 ("kernel-headers" ,%bootstrap-linux-libre-headers)
1230 ("make" ,make-mesboot)))
1231
1232 (arguments
1233 `(#:validate-runpath? #f ; fails when using --enable-shared
1234 ,@(substitute-keyword-arguments (package-arguments glibc-headers-mesboot)
1235 ((#:make-flags make-flags)
1236 `(let ((bash (assoc-ref %build-inputs "bash")))
1237 (list (string-append "SHELL=" bash "/bin/sh"))))
1238 ((#:phases phases)
1239 `(modify-phases ,phases
1240 (replace 'install
1241 (lambda* (#:key outputs make-flags #:allow-other-keys)
1242 (let* ((kernel-headers (assoc-ref %build-inputs "kernel-headers"))
1243 (out (assoc-ref outputs "out"))
1244 (install-flags (cons "install" make-flags)))
1245 (apply invoke "make" install-flags)
1246 (copy-recursively kernel-headers out)
1247 #t))))))))
1248 (native-search-paths ;; FIXME: move to glibc-mesboot0
1249 ;; Use the language-specific variables rather than 'CPATH' because they
1250 ;; are equivalent to '-isystem' whereas 'CPATH' is equivalent to '-I'.
1251 ;; The intent is to allow headers that are in the search path to be
1252 ;; treated as "system headers" (headers exempt from warnings) just like
1253 ;; the typical /usr/include headers on an FHS system.
1254 (list (search-path-specification
1255 (variable "C_INCLUDE_PATH")
1256 (files '("include")))
1257 (search-path-specification
1258 (variable "CPLUS_INCLUDE_PATH")
1259 (files '("include")))
1260 (search-path-specification
1261 (variable "LIBRARY_PATH")
1262 (files '("lib")))))))
1263
1264 (define gcc-mesboot
1265 (package
1266 (inherit gcc-mesboot1)
1267 (name "gcc-mesboot")
1268 (version "4.9.4")
1269 (source (bootstrap-origin (package-source gcc-4.9)))
1270 (native-inputs `(("binutils" ,binutils-mesboot)
1271 ("gcc-wrapper" ,gcc-mesboot1-wrapper)
1272 ("gcc" ,gcc-mesboot1)
1273 ("libc" ,glibc-mesboot)
1274
1275 ("bash" ,%bootstrap-coreutils&co)
1276 ("coreutils" ,%bootstrap-coreutils&co)
1277 ("diffutils" ,diffutils-mesboot)
1278 ("kernel-headers" ,%bootstrap-linux-libre-headers)
1279 ("make" ,make-mesboot)))
1280 (arguments
1281 `(#:validate-runpath? #f
1282 ,@(substitute-keyword-arguments (package-arguments gcc-mesboot1)
1283 ((#:configure-flags configure-flags)
1284 `(let ((out (assoc-ref %outputs "out"))
1285 (glibc (assoc-ref %build-inputs "libc")))
1286 (list (string-append "--prefix=" out)
1287 "--build=i686-unknown-linux-gnu"
1288 "--host=i686-unknown-linux-gnu"
1289
1290 "--with-host-libstdcxx=-lsupc++"
1291
1292 (string-append "--with-native-system-header-dir=" glibc "/include")
1293 (string-append "--with-build-sysroot=" glibc "/include")
1294
1295 "--disable-bootstrap"
1296 "--disable-decimal-float"
1297 "--disable-libatomic"
1298 "--disable-libcilkrts"
1299 "--disable-libgomp"
1300 "--disable-libitm"
1301 "--disable-libmudflap"
1302 "--disable-libquadmath"
1303 "--disable-libsanitizer"
1304 "--disable-libssp"
1305 "--disable-libvtv"
1306 "--disable-lto"
1307 "--disable-lto-plugin"
1308 "--disable-multilib"
1309 "--disable-plugin"
1310 "--disable-threads"
1311 "--enable-languages=c,c++"
1312
1313 "--enable-static"
1314 "--enable-shared"
1315 "--enable-threads=single"
1316
1317 ;; No pre-compiled libstdc++ headers, to save space.
1318 "--disable-libstdcxx-pch"
1319
1320 ;; for libcpp ...
1321 "--disable-build-with-cxx")))
1322 ((#:phases phases)
1323 `(modify-phases ,phases
1324 (replace 'setenv
1325 (lambda* (#:key outputs #:allow-other-keys)
1326 (let* ((out (assoc-ref outputs "out"))
1327 (binutils (assoc-ref %build-inputs "binutils"))
1328 (bash (assoc-ref %build-inputs "bash"))
1329 (gcc (assoc-ref %build-inputs "gcc"))
1330 (glibc (assoc-ref %build-inputs "libc"))
1331 (kernel-headers (assoc-ref %build-inputs "kernel-headers")))
1332 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
1333 (setenv "C_INCLUDE_PATH" (string-append
1334 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/4.7.4/include"
1335 ":" kernel-headers "/include"
1336 ":" glibc "/include"
1337 ":" (getcwd) "/mpfr/src"))
1338 (setenv "CPLUS_INCLUDE_PATH" (string-append
1339 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/4.7.4/include"
1340 ":" kernel-headers "/include"
1341 ":" glibc "/include"
1342 ":" (getcwd) "/mpfr/src"))
1343 (setenv "LIBRARY_PATH" (string-append glibc "/lib"
1344 ":" gcc "/lib"))
1345 (format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
1346 (format (current-error-port) "CPLUS_INCLUDE_PATH=~a\n" (getenv "CPLUS_INCLUDE_PATH"))
1347 (format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
1348 #t))))))))))
1349
1350 (define gcc-mesboot-wrapper
1351 ;; We need this so gcc-mesboot can be used to create shared binaries that
1352 ;; have the correct interpreter and runpath to libc.
1353 (package
1354 (inherit gcc-mesboot1-wrapper)
1355 (name "gcc-mesboot-wrapper")
1356 (version (package-version gcc-mesboot))
1357 (source #f)
1358 (inputs '())
1359 (native-inputs `(("bash" ,%bootstrap-coreutils&co)
1360 ("libc" ,glibc-mesboot)
1361 ("gcc" ,gcc-mesboot)))))
1362
1363 (define m4-mesboot
1364 (package
1365 (inherit m4)
1366 (name "m4-mesboot")
1367 (version "1.4")
1368 (source (origin
1369 (method url-fetch)
1370 (uri (string-append "mirror://gnu/m4/m4-"
1371 version ".tar.gz"))
1372 (sha256
1373 (base32
1374 "1f9bxj176kf3pvs350w2dfs8jgwhminywri5pyn01b11yc4yhsjw"))))
1375 (supported-systems '("i686-linux" "x86_64-linux"))
1376 (native-inputs `(("mes" ,mes-boot)
1377 ("tcc" ,tcc-boot)))
1378 (arguments
1379 `(#:phases
1380 (modify-phases %standard-phases
1381 (replace 'configure
1382 (lambda* (#:key outputs #:allow-other-keys)
1383 (let ((out (assoc-ref outputs "out")))
1384 (setenv "CONFIG_SHELL" (string-append
1385 (assoc-ref %build-inputs "bash")
1386 "/bin/sh"))
1387 (setenv "CC" "tcc -static")
1388 (setenv "CPP" "tcc -E")
1389 (invoke "./configure" (string-append "--prefix=" out))))))))))
1390
1391 (define (%bootstrap-inputs+toolchain)
1392 ;; The traditional bootstrap-inputs. For the i686-linux Reduced Binary Seed
1393 ;; the actual reduced set with bootstrapped toolchain.
1394 (match (%current-system)
1395 ((or "i686-linux" "x86_64-linux")
1396 `(("libc" ,glibc-mesboot)
1397 ("binutils" ,binutils-mesboot)
1398 ("gcc-wrapper" ,gcc-mesboot-wrapper)
1399 ("gcc" ,gcc-mesboot)
1400 ,@(fold alist-delete (%bootstrap-inputs)
1401 '("bootstrap-mescc-tools" "mes"))))
1402 (_
1403 (%bootstrap-inputs))))
1404
1405 (define gnu-make-boot0
1406 (package
1407 (inherit gnu-make)
1408 (source (bootstrap-origin (package-source gnu-make)))
1409 (name "make-boot0")
1410 (arguments
1411 `(#:guile ,%bootstrap-guile
1412 #:implicit-inputs? #f
1413 #:tests? #f ; cannot run "make check"
1414 ,@(substitute-keyword-arguments (package-arguments gnu-make)
1415 ((#:phases phases)
1416 `(modify-phases ,phases
1417 (replace 'build
1418 (lambda _
1419 (invoke "./build.sh")))
1420 (replace 'install
1421 (lambda* (#:key outputs #:allow-other-keys)
1422 (let* ((out (assoc-ref outputs "out"))
1423 (bin (string-append out "/bin")))
1424 (install-file "make" bin)
1425 #t))))))))
1426 (native-inputs '()) ; no need for 'pkg-config'
1427 (inputs (%bootstrap-inputs+toolchain))))
1428
1429 (define diffutils-boot0
1430 (package
1431 (inherit diffutils)
1432 (name "diffutils-boot0")
1433 (native-inputs `())
1434 (inputs
1435 `(("make" ,gnu-make-boot0)
1436 ,@(%bootstrap-inputs+toolchain)))
1437 (arguments
1438 `(#:tests? #f ; the test suite needs diffutils
1439 #:guile ,%bootstrap-guile
1440 #:implicit-inputs? #f
1441 ,@(package-arguments diffutils)))))
1442
1443 (define findutils-boot0
1444 (package
1445 (inherit findutils)
1446 (name "findutils-boot0")
1447 (source (bootstrap-origin (package-source findutils)))
1448 (inputs
1449 `(("make" ,gnu-make-boot0)
1450 ("diffutils" ,diffutils-boot0) ; for tests
1451 ,@(%bootstrap-inputs+toolchain)))
1452 (arguments
1453 `(#:implicit-inputs? #f
1454 #:guile ,%bootstrap-guile
1455 ,@(package-arguments findutils)))))
1456
1457 (define file-boot0
1458 (package
1459 (inherit file)
1460 (source (bootstrap-origin (package-source file)))
1461 (name "file-boot0")
1462 (inputs
1463 `(("make" ,gnu-make-boot0)
1464 ,@(%bootstrap-inputs+toolchain)))
1465 (arguments
1466 `(#:implicit-inputs? #f
1467 #:guile ,%bootstrap-guile
1468 #:strip-binaries? #f
1469 #:validate-runpath? #f))))
1470
1471 (define (%boot0-inputs)
1472 `(("make" ,gnu-make-boot0)
1473 ("diffutils" ,diffutils-boot0)
1474 ("findutils" ,findutils-boot0)
1475 ("file" ,file-boot0)
1476 ,@(%bootstrap-inputs+toolchain)))
1477
1478 (define* (boot-triplet #:optional (system (%current-system)))
1479 ;; Return the triplet used to create the cross toolchain needed in the
1480 ;; first bootstrapping stage.
1481 (nix-system->gnu-triplet system "guix"))
1482
1483 ;; Following Linux From Scratch, build a cross-toolchain in stage 0. That
1484 ;; toolchain actually targets the same OS and arch, but it has the advantage
1485 ;; of being independent of the libc and tools in
1486 ;; (%BOOTSTRAP-INPUTS+TOOLCHAIN), since GCC-BOOT0 (below) is built without any
1487 ;; reference to the target libc.
1488
1489 (define binutils-boot0
1490 (package
1491 (inherit binutils)
1492 (source (bootstrap-origin (package-source binutils)))
1493 (name "binutils-cross-boot0")
1494 (arguments
1495 `(#:guile ,%bootstrap-guile
1496 #:implicit-inputs? #f
1497
1498 #:modules ((guix build gnu-build-system)
1499 (guix build utils)
1500 (ice-9 ftw)) ; for 'scandir'
1501 #:phases (modify-phases %standard-phases
1502 (add-after 'install 'add-symlinks
1503 (lambda* (#:key outputs #:allow-other-keys)
1504 ;; The cross-gcc invokes 'as', 'ld', etc, without the
1505 ;; triplet prefix, so add symlinks.
1506 (let ((out (assoc-ref outputs "out"))
1507 (triplet-prefix (string-append ,(boot-triplet) "-")))
1508 (define (has-triplet-prefix? name)
1509 (string-prefix? triplet-prefix name))
1510 (define (remove-triplet-prefix name)
1511 (substring name (string-length triplet-prefix)))
1512 (with-directory-excursion (string-append out "/bin")
1513 (for-each (lambda (name)
1514 (symlink name (remove-triplet-prefix name)))
1515 (scandir "." has-triplet-prefix?)))
1516 #t))))
1517
1518 ,@(substitute-keyword-arguments (package-arguments binutils)
1519 ((#:configure-flags cf)
1520 `(cons ,(string-append "--target=" (boot-triplet))
1521 ,cf)))))
1522 (inputs (%boot0-inputs))))
1523
1524 (define libstdc++-boot0
1525 ;; GCC's libcc1 is always built as a shared library (the top-level
1526 ;; 'Makefile.def' forcefully adds --enable-shared) and thus needs to refer
1527 ;; to libstdc++.so. We cannot build libstdc++-5.3 because it relies on
1528 ;; C++14 features missing in some of our bootstrap compilers.
1529 (let ((lib (make-libstdc++ gcc-4.9)))
1530 (package
1531 (inherit lib)
1532 (source (bootstrap-origin (package-source lib)))
1533 (name "libstdc++-boot0")
1534 (arguments
1535 `(#:guile ,%bootstrap-guile
1536 #:implicit-inputs? #f
1537
1538 ;; XXX: libstdc++.so NEEDs ld.so for some reason.
1539 #:validate-runpath? #f
1540
1541 ,@(match (%current-system)
1542 ((or "i686-linux" "x86_64-linux")
1543 (substitute-keyword-arguments (package-arguments lib)
1544 ((#:phases phases)
1545 `(modify-phases ,phases
1546 (add-after 'unpack 'workaround-wrapper-bug
1547 ;; XXX: The crude gcc-cross-wrapper causes "g++ -v" to
1548 ;; fail, which in turn confuses the configure script.
1549 (lambda _
1550 (substitute* "libstdc++-v3/configure"
1551 (("g\\+\\+ -v") "true"))
1552 #t))))))
1553 (_ (package-arguments lib)))))
1554 (inputs (%boot0-inputs))
1555 (native-inputs '()))))
1556
1557 (define gcc-boot0
1558 (package
1559 (inherit gcc)
1560 (name "gcc-cross-boot0")
1561 (source (bootstrap-origin (package-source gcc)))
1562 (arguments
1563 `(#:guile ,%bootstrap-guile
1564 #:implicit-inputs? #f
1565 #:modules ((guix build gnu-build-system)
1566 (guix build utils)
1567 (ice-9 regex)
1568 (srfi srfi-1)
1569 (srfi srfi-26))
1570 ,@(substitute-keyword-arguments (package-arguments gcc)
1571 ((#:configure-flags flags)
1572 `(append (list ,(string-append "--target=" (boot-triplet))
1573
1574 ;; No libc yet.
1575 "--without-headers"
1576
1577 ;; Disable features not needed at this stage.
1578 "--disable-shared"
1579 "--enable-languages=c,c++"
1580
1581 ;; libstdc++ cannot be built at this stage
1582 ;; ("Link tests are not allowed after
1583 ;; GCC_NO_EXECUTABLES.").
1584 "--disable-libstdc++-v3"
1585
1586 "--disable-threads"
1587 "--disable-libmudflap"
1588 "--disable-libatomic"
1589 "--disable-libsanitizer"
1590 "--disable-libitm"
1591 "--disable-libgomp"
1592 "--disable-libmpx"
1593 "--disable-libcilkrts"
1594 "--disable-libvtv"
1595 "--disable-libssp"
1596 "--disable-libquadmath"
1597 "--disable-decimal-float")
1598 (remove (cut string-match
1599 "--(with-system-zlib|enable-languages.*)" <>)
1600 ,flags)))
1601 ((#:make-flags flags)
1602 `(let* ((libc (assoc-ref %build-inputs "libc"))
1603 (libc-native (or (assoc-ref %build-inputs "libc-native")
1604 libc)))
1605 `(,(string-append "LDFLAGS="
1606 "-Wl,-rpath=" libc-native "/lib "
1607 "-Wl,-dynamic-linker "
1608 "-Wl," libc-native ,(glibc-dynamic-linker
1609 (match (%current-system)
1610 ("x86_64-linux" "i686-linux")
1611 (_ (%current-system))))))))
1612 ((#:phases phases)
1613 `(modify-phases ,phases
1614 (add-after 'unpack 'unpack-gmp&co
1615 (lambda* (#:key inputs #:allow-other-keys)
1616 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
1617 (mpfr (assoc-ref %build-inputs "mpfr-source"))
1618 (mpc (assoc-ref %build-inputs "mpc-source")))
1619
1620 ;; To reduce the set of pre-built bootstrap inputs, build
1621 ;; GMP & co. from GCC.
1622 (for-each (lambda (source)
1623 (invoke "tar" "xvf" source))
1624 (list gmp mpfr mpc))
1625
1626 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
1627 ,@(map (lambda (lib)
1628 ;; Drop trailing letters, as gmp-6.0.0a unpacks
1629 ;; into gmp-6.0.0.
1630 `(symlink ,(string-trim-right
1631 (package-full-name lib "-")
1632 char-set:letter)
1633 ,(package-name lib)))
1634 (list gmp-6.0 mpfr mpc))
1635 #t)))
1636 ,(match (%current-system)
1637 ((or "i686-linux" "x86_64-linux")
1638 '(add-before 'configure 'fix-libcc1
1639 (lambda* (#:key inputs #:allow-other-keys)
1640 ;; libcc1.so NEEDs libgcc_s.so, so provide one here
1641 ;; to placate the 'validate-runpath' phase.
1642 (substitute* "libcc1/Makefile.in"
1643 (("la_LDFLAGS =")
1644 (string-append "la_LDFLAGS = -Wl,-rpath="
1645 (assoc-ref inputs "gcc") "/lib")))
1646 ;; XXX: "g++ -v" is broken (see also libstdc++ above).
1647 (substitute* "libcc1/configure"
1648 (("g\\+\\+ -v") "true"))
1649 #t)))
1650 (_ '(add-before 'configure 'return-true
1651 (lambda _ #t))))
1652 (add-after 'install 'symlink-libgcc_eh
1653 (lambda* (#:key outputs #:allow-other-keys)
1654 (let ((out (assoc-ref outputs "lib")))
1655 ;; Glibc wants to link against libgcc_eh, so provide
1656 ;; it.
1657 (with-directory-excursion
1658 (string-append out "/lib/gcc/"
1659 ,(boot-triplet)
1660 "/" ,(package-version gcc))
1661 (symlink "libgcc.a" "libgcc_eh.a"))
1662 #t))))))))
1663
1664 (inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp-6.0)))
1665 ("mpfr-source" ,(bootstrap-origin (package-source mpfr)))
1666 ("mpc-source" ,(bootstrap-origin (package-source mpc)))
1667 ("binutils-cross" ,binutils-boot0)
1668
1669 ;; The libstdc++ that libcc1 links against.
1670 ("libstdc++" ,libstdc++-boot0)
1671
1672 ;; Call it differently so that the builder can check whether
1673 ;; the "libc" input is #f.
1674 ("libc-native" ,@(assoc-ref (%boot0-inputs) "libc"))
1675 ,@(alist-delete "libc" (%boot0-inputs))))
1676
1677 ;; No need for the native-inputs to build the documentation at this stage.
1678 (native-inputs `())))
1679
1680 (define perl-boot0
1681 (package
1682 (inherit perl)
1683 (name "perl-boot0")
1684 (source (bootstrap-origin (package-source perl)))
1685 (inputs (%boot0-inputs))
1686 (arguments
1687 `(#:implicit-inputs? #f
1688 #:guile ,%bootstrap-guile
1689 #:validate-runpath? #f
1690
1691 ;; At the very least, this must not depend on GCC & co.
1692 #:disallowed-references ,(list %bootstrap-binutils)
1693
1694 ,@(substitute-keyword-arguments (package-arguments perl)
1695 ((#:phases phases)
1696 `(modify-phases ,phases
1697 ;; Pthread support is missing in the bootstrap compiler
1698 ;; (broken spec file), so disable it.
1699 (add-before 'configure 'disable-pthreads
1700 (lambda _
1701 (substitute* "Configure"
1702 (("^libswanted=(.*)pthread" _ before)
1703 (string-append "libswanted=" before)))
1704 #t))))
1705 ;; Do not configure with '-Dusethreads' since pthread
1706 ;; support is missing.
1707 ((#:configure-flags configure-flags)
1708 `(delete "-Dusethreads" ,configure-flags)))))))
1709
1710 (define m4-boot0
1711 (package
1712 (inherit m4)
1713 (name "m4-boot0")
1714 (source (bootstrap-origin (package-source m4)))
1715 (inputs (%boot0-inputs))
1716 (arguments
1717 `(#:guile ,%bootstrap-guile
1718 #:implicit-inputs? #f
1719 ,@(package-arguments m4)))))
1720
1721 (define m4-boot0*
1722 (package
1723 ;; TODO: On the next rebuild cycle, use M4-BOOT0 as is.
1724 (inherit m4-boot0)
1725 (name "m4")))
1726
1727 (define bison-boot0
1728 ;; This Bison is needed to build MiG so we need it early in the process.
1729 ;; Recent versions of Linux-Libre headers also depend on this.
1730 (package
1731 (inherit bison)
1732 ;; TODO: On the next build cycle, do:
1733 ;;(name "bison-boot0")
1734 (propagated-inputs `(("m4" ,m4-boot0*)))
1735 (native-inputs `(("perl" ,perl-boot0)))
1736 (inputs (%boot0-inputs)) ;remove Flex...
1737 (arguments
1738 `(#:tests? #f ;... and thus disable tests
1739 #:implicit-inputs? #f
1740 #:guile ,%bootstrap-guile
1741
1742 ;; XXX: These flags should be unconditional, but for now
1743 ;; we just add them on x86 to avoid a full rebuild.
1744 ;; TODO: On the next core-updates, use
1745 ;; 'substitute-keyword-arguments' to inherit them from
1746 ;; BISON.
1747 ,@(if (member (%current-system)
1748 '("x86_64-linux" "i686-linux"))
1749 '(#:parallel-build? #f
1750 #:parallel-tests? #f)
1751 '())
1752
1753 ;; Zero timestamps in liby.a; this must be done
1754 ;; explicitly here because the bootstrap Binutils don't
1755 ;; do that (default is "cru".)
1756 #:make-flags `("ARFLAGS=crD"
1757 ,,(match (%current-system)
1758 ;; ranlib: '-D': No such file
1759 ((or "i686-linux" "x86_64-linux")
1760 "RANLIB=ranlib")
1761 (_
1762 "RANLIB=ranlib -D"))
1763 "V=1")))))
1764
1765 (define flex-boot0
1766 ;; This Flex is needed to build MiG as well as Linux-Libre headers.
1767 (package
1768 (inherit flex)
1769 (native-inputs `(("bison" ,bison-boot0)))
1770 (propagated-inputs
1771 ;; XXX: Here we use an 'm4-boot0' package that's not eq? so that it
1772 ;; appears twice in '%build-inputs', like when we were using
1773 ;; 'package-with-explicit-inputs'.
1774 ;; TODO: Remove this hack on the next rebuild cycle.
1775 `(("m4" ,(package (inherit m4-boot0*)))))
1776 (inputs (%boot0-inputs))
1777 (arguments
1778 `(#:implicit-inputs? #f
1779 #:guile ,%bootstrap-guile
1780 #:tests? #f))))
1781
1782 (define linux-libre-headers-boot0
1783 (mlambda ()
1784 "Return Linux-Libre header files for the bootstrap environment."
1785 ;; Note: this is wrapped in a thunk to nicely handle circular dependencies
1786 ;; between (gnu packages linux) and this module. Additionally, memoize
1787 ;; the result to play well with further memoization and code that relies
1788 ;; on pointer identity; see <https://bugs.gnu.org/30155>.
1789 (package
1790 (inherit linux-libre-headers)
1791 (arguments
1792 `(#:guile ,%bootstrap-guile
1793 #:implicit-inputs? #f
1794 ,@(package-arguments linux-libre-headers)))
1795 (native-inputs
1796 `(("perl" ,perl-boot0)
1797
1798 ;; Flex and Bison are required since version 4.16.
1799 ("flex" ,flex-boot0)
1800 ("bison" ,bison-boot0)
1801 ,@(%boot0-inputs))))))
1802
1803 (define with-boot0
1804 (package-with-explicit-inputs %boot0-inputs
1805 %bootstrap-guile))
1806
1807 (define gnumach-headers-boot0
1808 (with-boot0 (package-with-bootstrap-guile gnumach-headers)))
1809
1810 (define mig-boot0
1811 (let* ((mig (package
1812 (inherit (package-with-bootstrap-guile mig))
1813 (native-inputs `(("bison" ,bison-boot0)
1814 ("flex" ,flex-boot0)))
1815 (inputs `(("flex" ,flex-boot0)))
1816 (arguments
1817 `(#:configure-flags
1818 `(,(string-append "LDFLAGS=-Wl,-rpath="
1819 (assoc-ref %build-inputs "flex") "/lib/")))))))
1820 (with-boot0 mig)))
1821
1822 (define hurd-headers-boot0
1823 (let ((hurd-headers (package (inherit hurd-headers)
1824 (native-inputs `(("mig" ,mig-boot0)))
1825 (inputs '()))))
1826 (with-boot0 (package-with-bootstrap-guile hurd-headers))))
1827
1828 (define hurd-minimal-boot0
1829 (let ((hurd-minimal (package (inherit hurd-minimal)
1830 (native-inputs `(("mig" ,mig-boot0)))
1831 (inputs '()))))
1832 (with-boot0 (package-with-bootstrap-guile hurd-minimal))))
1833
1834 (define hurd-core-headers-boot0
1835 (mlambda ()
1836 "Return the Hurd and Mach headers as well as initial Hurd libraries for
1837 the bootstrap environment."
1838 (package (inherit (package-with-bootstrap-guile hurd-core-headers))
1839 (arguments `(#:guile ,%bootstrap-guile
1840 ,@(package-arguments hurd-core-headers)))
1841 (inputs
1842 `(("gnumach-headers" ,gnumach-headers-boot0)
1843 ("hurd-headers" ,hurd-headers-boot0)
1844 ("hurd-minimal" ,hurd-minimal-boot0)
1845 ,@(%boot0-inputs))))))
1846
1847 (define* (kernel-headers-boot0 #:optional (system (%current-system)))
1848 (match system
1849 ("i586-gnu" (hurd-core-headers-boot0))
1850 (_ (linux-libre-headers-boot0))))
1851
1852 (define texinfo-boot0
1853 ;; Texinfo used to build libc's manual.
1854 ;; We build without ncurses because it fails to build at this stage, and
1855 ;; because we don't need the stand-alone Info reader.
1856 ;; Also, use (%BOOT0-INPUTS) to avoid building Perl once more.
1857 (package
1858 (inherit texinfo)
1859 (native-inputs '())
1860 (inputs `(,@(%boot0-inputs)
1861 ("perl" ,perl-boot0)))
1862 (arguments
1863 `(#:implicit-inputs? #f
1864 #:guile ,%bootstrap-guile
1865
1866 ;; Some of Texinfo 6.1's tests would fail with "Couldn't set UTF-8
1867 ;; character type in locale" but we don't have a UTF-8 locale at this
1868 ;; stage, so skip them.
1869 #:tests? #f))))
1870
1871 (define expat-sans-tests
1872 (package
1873 (inherit expat)
1874 (inputs (%boot0-inputs))
1875 (arguments
1876 ;; XXX: Linking 'runtestscpp' fails with things like:
1877 ;;
1878 ;; ld: Dwarf Error: found dwarf version '3789', this reader only handles version 2 and 3 information.
1879 ;;
1880 ;; Skip tests altogether.
1881 `(#:implicit-inputs? #f
1882 #:guile ,%bootstrap-guile
1883
1884 ,@(substitute-keyword-arguments (package-arguments expat)
1885 ((#:configure-flags flags ''())
1886 ;; Since we're not passing the right -Wl,-rpath flags, build the
1887 ;; static library to avoid RUNPATH validation failure.
1888 `(cons "--disable-shared" ,flags))
1889 ((#:tests? _ #f) #f))))))
1890
1891 (define python-boot0
1892 (package
1893 (inherit python-minimal)
1894 ;; We cannot use Python 3.7 and later here, because they require
1895 ;; pthreads, which is missing on non-x86 platforms at this stage.
1896 ;; Python 3.6 technically supports being built without threading
1897 ;; support, but requires additional patches.
1898 (version "3.5.7")
1899 (source (bootstrap-origin
1900 (origin
1901 (inherit (package-source python))
1902 (uri (string-append "https://www.python.org/ftp/python/"
1903 version "/Python-" version ".tar.xz"))
1904 (patches '())
1905 (sha256
1906 (base32
1907 "1p67pnp2ca5przx2s45r8m55dcn6f5hsm0l4s1zp7mglkf4r4n18")))))
1908 (inputs
1909 `(,@(%boot0-inputs)
1910 ("expat" ,expat-sans-tests))) ;remove OpenSSL, zlib, etc.
1911 (native-inputs '()) ;and pkg-config
1912 (arguments
1913 `(#:implicit-inputs? #f
1914 #:guile ,%bootstrap-guile
1915
1916 ,@(substitute-keyword-arguments (package-arguments python-minimal)
1917 ;; Disable features that cannot be built at this stage.
1918 ((#:configure-flags _ ''())
1919 `(list "--without-ensurepip"
1920 "--without-threads"))
1921 ;; Clear #:make-flags, such that changes to the regular
1922 ;; Python package won't interfere with this one.
1923 ((#:make-flags _ ''()) ''())
1924 ((#:phases phases)
1925 `(modify-phases ,phases
1926 (add-before 'configure 'disable-modules
1927 (lambda _
1928 (substitute* "setup.py"
1929 ;; Disable ctypes, since it requires libffi.
1930 (("extensions\\.append\\(ctypes\\)") "")
1931 ;; Prevent the 'ossaudiodev' extension from being
1932 ;; built, since it requires Linux headers.
1933 (("'linux', ") ""))
1934 #t))
1935 (delete 'set-TZDIR)))
1936 ((#:tests? _ #f) #f))))))
1937
1938 (define ld-wrapper-boot0
1939 (mlambda ()
1940 ;; We need this so binaries on Hurd will have libmachuser and libhurduser
1941 ;; in their RUNPATH, otherwise validate-runpath will fail.
1942 (make-ld-wrapper "ld-wrapper-boot0"
1943 #:target boot-triplet
1944 #:binutils binutils-boot0
1945 #:guile %bootstrap-guile
1946 #:bash (car (assoc-ref (%boot0-inputs) "bash"))
1947 #:guile-for-build %bootstrap-guile)))
1948
1949 (define (%boot1-inputs)
1950 ;; 2nd stage inputs.
1951 `(("gcc" ,gcc-boot0)
1952 ("ld-wrapper-cross" ,(ld-wrapper-boot0))
1953 ("binutils-cross" ,binutils-boot0)
1954 ,@(alist-delete "binutils" (%boot0-inputs))))
1955
1956 (define glibc-final-with-bootstrap-bash
1957 ;; The final libc, "cross-built". If everything went well, the resulting
1958 ;; store path has no dependencies. Actually, the really-final libc is
1959 ;; built just below; the only difference is that this one uses the
1960 ;; bootstrap Bash.
1961 (package
1962 (inherit glibc)
1963 (name "glibc-intermediate")
1964 (source (bootstrap-origin (package-source glibc)))
1965 (arguments
1966 `(#:guile ,%bootstrap-guile
1967 #:implicit-inputs? #f
1968
1969 ,@(substitute-keyword-arguments (package-arguments glibc)
1970 ((#:configure-flags flags)
1971 `(append (list ,(string-append "--host=" (boot-triplet))
1972 ,(string-append "--build="
1973 (nix-system->gnu-triplet)))
1974 ,flags))
1975 ((#:phases phases)
1976 `(modify-phases ,phases
1977 (add-before 'configure 'pre-configure
1978 (lambda* (#:key inputs #:allow-other-keys)
1979 ;; Don't clobber CPATH with the bootstrap libc.
1980 (setenv "NATIVE_CPATH" (getenv "CPATH"))
1981 (unsetenv "CPATH")
1982
1983 ;; Tell 'libpthread' where to find 'libihash' on Hurd systems.
1984 ,@(if (hurd-triplet? (%current-system))
1985 `((substitute* "libpthread/Makefile"
1986 (("LDLIBS-pthread.so =.*")
1987 (string-append "LDLIBS-pthread.so = "
1988 (assoc-ref %build-inputs "kernel-headers")
1989 "/lib/libihash.a\n"))))
1990 '())
1991
1992 ;; 'rpcgen' needs native libc headers to be built.
1993 (substitute* "sunrpc/Makefile"
1994 (("sunrpc-CPPFLAGS =.*" all)
1995 (string-append "CPATH = $(NATIVE_CPATH)\n"
1996 "export CPATH\n"
1997 all "\n")))
1998 #t)))))))
1999 (propagated-inputs `(("kernel-headers" ,(kernel-headers-boot0))))
2000 (native-inputs
2001 `(("bison" ,bison-boot0)
2002 ("texinfo" ,texinfo-boot0)
2003 ("perl" ,perl-boot0)
2004 ("python" ,python-boot0)))
2005 (inputs
2006 `( ;; The boot inputs. That includes the bootstrap libc. We don't want
2007 ;; it in $CPATH, hence the 'pre-configure' phase above.
2008 ,@(%boot1-inputs)
2009
2010 ;; A native MiG is needed to build Glibc on Hurd.
2011 ,@(if (hurd-triplet? (%current-system))
2012 `(("mig" ,mig-boot0))
2013 '())
2014
2015 ;; A native GCC is needed to build `cross-rpcgen'.
2016 ("native-gcc" ,@(assoc-ref (%boot0-inputs) "gcc"))
2017
2018 ;; Here, we use the bootstrap Bash, which is not satisfactory
2019 ;; because we don't want to depend on bootstrap tools.
2020 ("static-bash" ,@(assoc-ref (%boot0-inputs) "bash"))))))
2021
2022 (define (cross-gcc-wrapper gcc binutils glibc bash)
2023 "Return a wrapper for the pseudo-cross toolchain GCC/BINUTILS/GLIBC
2024 that makes it available under the native tool names."
2025 (package (inherit gcc)
2026 (name (string-append (package-name gcc) "-wrapped"))
2027 (source #f)
2028 (build-system trivial-build-system)
2029 (outputs '("out"))
2030 (arguments
2031 `(#:guile ,%bootstrap-guile
2032 #:modules ((guix build utils))
2033 #:builder (begin
2034 (use-modules (guix build utils))
2035
2036 (let* ((binutils (assoc-ref %build-inputs "binutils"))
2037 (gcc (assoc-ref %build-inputs "gcc"))
2038 (libc (assoc-ref %build-inputs "libc"))
2039 (bash (assoc-ref %build-inputs "bash"))
2040 (out (assoc-ref %outputs "out"))
2041 (bindir (string-append out "/bin"))
2042 (triplet ,(boot-triplet)))
2043 (define (wrap-program program)
2044 ;; GCC-BOOT0 is a libc-less cross-compiler, so it
2045 ;; needs to be told where to find the crt files and
2046 ;; the dynamic linker.
2047 (call-with-output-file program
2048 (lambda (p)
2049 (format p "#!~a/bin/bash
2050 exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
2051 bash
2052 gcc triplet program
2053 libc libc
2054 ,(glibc-dynamic-linker))))
2055
2056 (chmod program #o555))
2057
2058 (mkdir-p bindir)
2059 (with-directory-excursion bindir
2060 (for-each (lambda (tool)
2061 (symlink (string-append binutils "/bin/"
2062 triplet "-" tool)
2063 tool))
2064 '("ar" "ranlib"))
2065 (for-each wrap-program '("gcc" "g++")))
2066
2067 #t))))
2068 (native-inputs
2069 `(("binutils" ,binutils)
2070 ("gcc" ,gcc)
2071 ("libc" ,glibc)
2072 ("bash" ,bash)))
2073 (inputs '())))
2074
2075 (define gcc-boot0-intermediate-wrapped
2076 (mlambda ()
2077 ;; Make the cross-tools GCC-BOOT0 and BINUTILS-BOOT0 available under the
2078 ;; non-cross names.
2079 (cross-gcc-wrapper gcc-boot0 binutils-boot0
2080 glibc-final-with-bootstrap-bash
2081 (car (assoc-ref (%boot1-inputs) "bash")))))
2082
2083 (define static-bash-for-glibc
2084 ;; A statically-linked Bash to be used by GLIBC-FINAL in system(3) & co.
2085 (package
2086 (inherit static-bash)
2087 (source (bootstrap-origin (package-source static-bash)))
2088 (inputs `(("gcc" ,(gcc-boot0-intermediate-wrapped))
2089 ("libc" ,glibc-final-with-bootstrap-bash)
2090 ("libc:static" ,glibc-final-with-bootstrap-bash "static")
2091 ,@(fold alist-delete (%boot1-inputs)
2092 '("gcc" "libc"))))
2093 (arguments
2094 `(#:implicit-inputs? #f
2095 #:guile ,%bootstrap-guile
2096
2097 ,@(substitute-keyword-arguments (package-arguments static-bash)
2098 ((#:configure-flags flags '())
2099 ;; Add a '-L' flag so that the pseudo-cross-ld of
2100 ;; BINUTILS-BOOT0 can find libc.a.
2101 `(append ,flags
2102 (list (string-append "LDFLAGS=-static -L"
2103 (assoc-ref %build-inputs
2104 "libc:static")
2105 "/lib")))))))))
2106
2107 (define gettext-boot0
2108 ;; A minimal gettext used during bootstrap.
2109 (package
2110 (inherit gettext-minimal)
2111 (name "gettext-boot0")
2112 ;; Newer versions of GNU gettext depends on libxml2 and ncurses. To
2113 ;; simplify the dependency chain, we stick to this version here.
2114 (version "0.19.8.1")
2115 (source (origin
2116 (method url-fetch)
2117 (uri (string-append "mirror://gnu/gettext/gettext-"
2118 version ".tar.gz"))
2119 (sha256
2120 (base32
2121 "0hsw28f9q9xaggjlsdp2qmbp2rbd1mp0njzan2ld9kiqwkq2m57z"))))
2122 (inputs (%boot1-inputs)) ;zero dependencies
2123 (arguments
2124 `(#:implicit-inputs? #f
2125 #:guile ,%bootstrap-guile
2126 #:tests? #f
2127 #:phases (modify-phases %standard-phases
2128 ;; Build only the tools.
2129 (add-after 'unpack 'chdir
2130 (lambda _
2131 (chdir "gettext-tools")
2132 #t))
2133
2134 ;; Some test programs require pthreads, which we don't have.
2135 (add-before 'configure 'no-test-programs
2136 (lambda _
2137 (substitute* "tests/Makefile.in"
2138 (("^PROGRAMS =.*$")
2139 "PROGRAMS =\n"))
2140 #t)))))))
2141
2142 (define glibc-final
2143 ;; The final glibc, which embeds the statically-linked Bash built above.
2144 ;; Use 'package/inherit' so we get the 'replacement' of 'glibc', if any.
2145 (package/inherit
2146 glibc
2147 (name "glibc")
2148 (source (bootstrap-origin (package-source glibc)))
2149 (inputs `(("static-bash" ,static-bash-for-glibc)
2150 ,@(alist-delete
2151 "static-bash"
2152 (package-inputs glibc-final-with-bootstrap-bash))))
2153
2154 ;; This time we need 'msgfmt' to install all the libc.mo files.
2155 (native-inputs `(,@(package-native-inputs glibc-final-with-bootstrap-bash)
2156 ("gettext" ,gettext-boot0)))
2157
2158 (propagated-inputs
2159 (package-propagated-inputs glibc-final-with-bootstrap-bash))
2160
2161 ;; The final libc only refers to itself, but the 'debug' output contains
2162 ;; references to GCC-BOOT0 and to the Linux headers. XXX: Would be great
2163 ;; if 'allowed-references' were per-output.
2164 (arguments
2165 `(#:allowed-references
2166 ,(cons* `(,gcc-boot0 "lib") (kernel-headers-boot0)
2167 static-bash-for-glibc
2168 (package-outputs glibc-final-with-bootstrap-bash))
2169
2170 ,@(package-arguments glibc-final-with-bootstrap-bash)))))
2171
2172 (define gcc-boot0-wrapped
2173 (mlambda ()
2174 ;; Make the cross-tools GCC-BOOT0 and BINUTILS-BOOT0 available under the
2175 ;; non-cross names.
2176 (cross-gcc-wrapper gcc-boot0 binutils-boot0 glibc-final
2177 (car (assoc-ref (%boot1-inputs) "bash")))))
2178
2179 (define (%boot2-inputs)
2180 ;; 3rd stage inputs.
2181 `(("libc" ,glibc-final)
2182 ("libc:static" ,glibc-final "static")
2183 ("gcc" ,(gcc-boot0-wrapped))
2184 ,@(fold alist-delete (%boot1-inputs) '("libc" "gcc" "linux-libre-headers"))))
2185
2186 (define binutils-final
2187 (package
2188 (inherit binutils)
2189 (source (bootstrap-origin (package-source binutils)))
2190 (arguments
2191 `(#:guile ,%bootstrap-guile
2192 #:implicit-inputs? #f
2193 #:allowed-references ("out" ,glibc-final)
2194 ,@(package-arguments binutils)))
2195 (inputs (%boot2-inputs))))
2196
2197 (define libstdc++
2198 ;; Intermediate libstdc++ that will allow us to build the final GCC
2199 ;; (remember that GCC-BOOT0 cannot build libstdc++.)
2200 (let ((lib (make-libstdc++ gcc)))
2201 (package
2202 (inherit lib)
2203 (source (bootstrap-origin (package-source lib)))
2204 (arguments
2205 `(#:guile ,%bootstrap-guile
2206 #:implicit-inputs? #f
2207 #:allowed-references ("out")
2208
2209 ;; XXX: libstdc++.so NEEDs ld.so for some reason.
2210 #:validate-runpath? #f
2211
2212 ;; All of the package arguments from 'make-libstdc++
2213 ;; except for the configure-flags.
2214 ,@(package-arguments lib)
2215 #:configure-flags `("--disable-shared"
2216 "--disable-libstdcxx-dual-abi"
2217 "--disable-libstdcxx-threads"
2218 "--disable-libstdcxx-pch"
2219 ,(string-append "--with-gxx-include-dir="
2220 (assoc-ref %outputs "out")
2221 "/include"))))
2222 (outputs '("out"))
2223 (inputs (%boot2-inputs))
2224 (synopsis "GNU C++ standard library (intermediate)"))))
2225
2226 (define zlib-final
2227 ;; Zlib used by GCC-FINAL.
2228 (package
2229 (inherit zlib)
2230 (arguments
2231 `(#:guile ,%bootstrap-guile
2232 #:implicit-inputs? #f
2233 #:allowed-references ("out" ,glibc-final)
2234 ,@(package-arguments zlib)))
2235 (inputs (%boot2-inputs))))
2236
2237 (define ld-wrapper-boot3
2238 (mlambda ()
2239 ;; A linker wrapper that uses the bootstrap Guile.
2240 (make-ld-wrapper "ld-wrapper-boot3"
2241 #:binutils binutils-final
2242 #:guile %bootstrap-guile
2243 #:bash (car (assoc-ref (%boot2-inputs) "bash"))
2244 #:guile-for-build %bootstrap-guile)))
2245
2246 (define gcc-final
2247 ;; The final GCC.
2248 (package (inherit gcc-boot0)
2249 (name "gcc")
2250
2251 ;; XXX: Currently #:allowed-references applies to all the outputs but the
2252 ;; "debug" output contains disallowed references, notably
2253 ;; linux-libre-headers. Disable the debugging output to work around that.
2254 (outputs (delete "debug" (package-outputs gcc-boot0)))
2255
2256 (arguments
2257 `(#:guile ,%bootstrap-guile
2258 #:implicit-inputs? #f
2259
2260 #:allowed-references ("out" "lib" ,zlib-final
2261 ,glibc-final ,static-bash-for-glibc)
2262
2263 ;; Things like libasan.so and libstdc++.so NEED ld.so for some
2264 ;; reason, but it is not in their RUNPATH. This is a false
2265 ;; positive, so turn it off.
2266 #:validate-runpath? #f
2267
2268 ,@(substitute-keyword-arguments (package-arguments gcc)
2269 ((#:make-flags flags)
2270 ;; Since $LIBRARY_PATH is not honored, add the relevant flags.
2271 `(let ((zlib (assoc-ref %build-inputs "zlib")))
2272 (map (lambda (flag)
2273 (if (string-prefix? "LDFLAGS=" flag)
2274 (string-append flag " -L"
2275 (assoc-ref %build-inputs "libstdc++")
2276 "/lib -L" zlib "/lib -Wl,-rpath="
2277 zlib "/lib")
2278 flag))
2279 ,flags)))
2280 ;; Build again GMP & co. within GCC's build process, because it's hard
2281 ;; to do outside (because GCC-BOOT0 is a cross-compiler, and thus
2282 ;; doesn't honor $LIBRARY_PATH, which breaks `gnu-build-system'.)
2283 ((#:phases phases)
2284 `(modify-phases ,phases
2285 (add-after 'unpack 'unpack-gmp&co
2286 (lambda* (#:key inputs #:allow-other-keys)
2287 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
2288 (mpfr (assoc-ref %build-inputs "mpfr-source"))
2289 (mpc (assoc-ref %build-inputs "mpc-source")))
2290
2291 ;; To reduce the set of pre-built bootstrap inputs, build
2292 ;; GMP & co. from GCC.
2293 (for-each (lambda (source)
2294 (invoke "tar" "xvf" source))
2295 (list gmp mpfr mpc))
2296
2297 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
2298 ,@(map (lambda (lib)
2299 ;; Drop trailing letters, as gmp-6.0.0a unpacks
2300 ;; into gmp-6.0.0.
2301 `(symlink ,(string-trim-right
2302 (package-full-name lib "-")
2303 char-set:letter)
2304 ,(package-name lib)))
2305 (list gmp-6.0 mpfr mpc))
2306 #t)))
2307 (add-before 'configure 'treat-glibc-as-system-header
2308 (lambda* (#:key inputs #:allow-other-keys)
2309 (let ((libc (assoc-ref inputs "libc")))
2310 ;; Make sure Glibc is treated as a "system header" so
2311 ;; #include_next does the right thing.
2312 (for-each (lambda (var)
2313 (setenv var (string-append libc "/include")))
2314 '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"))
2315 #t))))))))
2316
2317 ;; This time we want Texinfo, so we get the manual. Add
2318 ;; STATIC-BASH-FOR-GLIBC so that it's used in the final shebangs of
2319 ;; scripts such as 'mkheaders' and 'fixinc.sh' (XXX: who cares about these
2320 ;; scripts?).
2321 (native-inputs `(("texinfo" ,texinfo-boot0)
2322 ("perl" ,perl-boot0) ;for manpages
2323 ("static-bash" ,static-bash-for-glibc)
2324 ,@(package-native-inputs gcc-boot0)))
2325
2326 (inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp-6.0)))
2327 ("mpfr-source" ,(package-source mpfr))
2328 ("mpc-source" ,(package-source mpc))
2329 ("ld-wrapper" ,(ld-wrapper-boot3))
2330 ("binutils" ,binutils-final)
2331 ("libstdc++" ,libstdc++)
2332 ("zlib" ,zlib-final)
2333 ,@(%boot2-inputs)))))
2334
2335 (define (%boot3-inputs)
2336 ;; 4th stage inputs.
2337 `(("gcc" ,gcc-final)
2338 ("ld-wrapper" ,(ld-wrapper-boot3))
2339 ,@(alist-delete "gcc" (%boot2-inputs))))
2340
2341 (define bash-final
2342 ;; Link with `-static-libgcc' to make sure we don't retain a reference
2343 ;; to the bootstrap GCC. Use "bash-minimal" to avoid an extra dependency
2344 ;; on Readline and ncurses.
2345 (let ((bash (static-libgcc-package bash-minimal)))
2346 (package
2347 (inherit bash)
2348 (source (bootstrap-origin (package-source bash)))
2349 (inputs (%boot3-inputs))
2350 (arguments
2351 `(#:implicit-inputs? #f
2352 #:guile ,%bootstrap-guile
2353
2354 #:disallowed-references ,(assoc-ref (%boot3-inputs) "coreutils&co")
2355
2356 ,@(package-arguments bash))))))
2357
2358 (define (%boot4-inputs)
2359 ;; Now use the final Bash.
2360 `(("bash" ,bash-final)
2361 ,@(alist-delete "bash" (%boot3-inputs))))
2362
2363 (define with-boot4
2364 (package-with-explicit-inputs %boot4-inputs %bootstrap-guile))
2365
2366 (define-public guile-final
2367 ;; This package must be public because other modules refer to it. However,
2368 ;; mark it as hidden so that 'fold-packages' ignores it.
2369 (with-boot4 (hidden-package
2370 (package-with-bootstrap-guile guile-2.2/fixed))))
2371
2372 (define glibc-utf8-locales-final
2373 ;; Now that we have GUILE-FINAL, build the UTF-8 locales. They are needed
2374 ;; by the build processes afterwards so their 'scm_to_locale_string' works
2375 ;; with the full range of Unicode codepoints (remember
2376 ;; 'scm_to_locale_string' is called every time a string is passed to a C
2377 ;; function.)
2378 (package
2379 (inherit glibc-utf8-locales)
2380 (native-inputs
2381 `(("glibc" ,glibc-final)
2382 ("gzip" ,(with-boot4 gzip))))))
2383
2384 (define-public ld-wrapper
2385 ;; The final 'ld' wrapper, which uses the final Guile and Binutils.
2386 (make-ld-wrapper "ld-wrapper"
2387 #:binutils binutils-final
2388 #:guile guile-final
2389 #:bash bash-final))
2390
2391 (define (%boot5-inputs)
2392 ;; Now with UTF-8 locales. Remember that the bootstrap binaries were built
2393 ;; with an older libc, which cannot load the new locale format. See
2394 ;; <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
2395 `(("locales" ,glibc-utf8-locales-final)
2396 ,@(%boot4-inputs)))
2397
2398 (define with-boot5
2399 (package-with-explicit-inputs %boot5-inputs))
2400
2401 (define gnu-make-final
2402 ;; The final GNU Make, which uses the final Guile.
2403 ;; FIXME: This is a mistake: we shouldn't be propagating GUILE-FINAL to
2404 ;; PKG-CONFIG.
2405 ;; TODO: Fix that on the next rebuild cycle.
2406 (let ((pkg-config (package
2407 (inherit %pkg-config) ;the native pkg-config
2408 (inputs `(("guile" ,guile-final)
2409 ,@(%boot5-inputs)))
2410 (arguments
2411 `(#:implicit-inputs? #f
2412 ,@(package-arguments pkg-config))))))
2413 (package
2414 (inherit (package-with-bootstrap-guile gnu-make))
2415 (inputs `(("guile" ,guile-final)
2416 ,@(%boot5-inputs)))
2417 (native-inputs `(("pkg-config" ,pkg-config)))
2418 (arguments
2419 `(#:implicit-inputs? #f
2420 ,@(package-arguments gnu-make))))))
2421
2422
2423 (define coreutils-final
2424 ;; The final Coreutils. Treat them specially because some packages, such as
2425 ;; Findutils, keep a reference to the Coreutils they were built with.
2426 (with-boot5 (package-with-bootstrap-guile coreutils)
2427 ;; Use the final Guile, linked against the
2428 ;; final libc with working iconv, so that
2429 ;; 'substitute*' works well when touching
2430 ;; test files in Gettext.
2431 ))
2432
2433 (define grep-final
2434 ;; The final grep. Gzip holds a reference to it (via zgrep), so it must be
2435 ;; built before gzip.
2436 (let ((grep (with-boot5 (package-with-bootstrap-guile grep))))
2437 (package/inherit grep
2438 (inputs (alist-delete "pcre" (package-inputs grep)))
2439 (native-inputs `(("perl" ,perl-boot0))))))
2440
2441 (define (%boot6-inputs)
2442 ;; Now use the final Coreutils.
2443 `(("coreutils" ,coreutils-final)
2444 ("grep" ,grep-final)
2445 ,@(%boot5-inputs)))
2446
2447 (define with-boot6
2448 (package-with-explicit-inputs %boot6-inputs))
2449
2450 (define sed-final
2451 ;; The final sed.
2452 (let ((sed (with-boot6 (package-with-bootstrap-guile sed))))
2453 (package/inherit sed (native-inputs `(("perl" ,perl-boot0))))))
2454
2455 (define-public %final-inputs
2456 ;; Final derivations used as implicit inputs by 'gnu-build-system'. We
2457 ;; still use 'package-with-bootstrap-guile' so that the bootstrap tools are
2458 ;; used for origins that have patches, thereby avoiding circular
2459 ;; dependencies.
2460 (let ((finalize (compose with-boot6
2461 package-with-bootstrap-guile)))
2462 `(,@(map (match-lambda
2463 ((name package)
2464 (list name (finalize package))))
2465 `(("tar" ,tar)
2466 ("gzip" ,gzip)
2467 ("bzip2" ,bzip2)
2468 ("xz" ,xz)
2469 ("file" ,file)
2470 ("diffutils" ,diffutils)
2471 ("patch" ,patch)
2472 ("findutils" ,findutils)
2473 ("gawk" ,gawk)))
2474 ("sed" ,sed-final)
2475 ("grep" ,grep-final)
2476 ("coreutils" ,coreutils-final)
2477 ("make" ,gnu-make-final)
2478 ("bash" ,bash-final)
2479 ("ld-wrapper" ,ld-wrapper)
2480 ("binutils" ,binutils-final)
2481 ("gcc" ,gcc-final)
2482 ("libc" ,glibc-final)
2483 ("libc:static" ,glibc-final "static")
2484 ("locales" ,glibc-utf8-locales-final))))
2485
2486 (define-public canonical-package
2487 (let ((name->package (fold (lambda (input result)
2488 (match input
2489 ((_ package . outputs)
2490 (vhash-cons (package-full-name package)
2491 package result))))
2492 vlist-null
2493 `(("guile" ,guile-final)
2494 ,@%final-inputs))))
2495 (lambda (package)
2496 "Return the 'canonical' variant of PACKAGE---i.e., if PACKAGE is one of
2497 the implicit inputs of 'gnu-build-system', return that one, otherwise return
2498 PACKAGE.
2499
2500 The goal is to avoid duplication in cases like GUILE-FINAL vs. GUILE-2.2,
2501 COREUTILS-FINAL vs. COREUTILS, etc."
2502 ;; XXX: This doesn't handle dependencies of the final inputs, such as
2503 ;; libunistring, GMP, etc.
2504 (match (vhash-assoc (package-full-name package) name->package)
2505 ((_ . canon)
2506 ;; In general we want CANON, except if we're cross-compiling: CANON
2507 ;; uses explicit inputs, so it is "anchored" in the bootstrapped
2508 ;; process, with dependencies on things that cannot be
2509 ;; cross-compiled.
2510 (if (%current-target-system)
2511 package
2512 canon))
2513 (_ package)))))
2514
2515 \f
2516 ;;;
2517 ;;; GCC toolchain.
2518 ;;;
2519
2520 ;; Using the following procedure, a gcc toolchain targeting glibc-2.27 can be
2521 ;; instantiated like this:
2522 ;;
2523 ;; (define-public gcc-glibc-2.27-toolchain
2524 ;; (make-gcc-toolchain gcc glibc-2.27))
2525
2526 (define* (make-gcc-toolchain gcc
2527 #:optional
2528 (libc #f))
2529 "Return a complete toolchain for GCC. If LIBC is specified, target that libc."
2530 (let ((gcc (if libc (make-gcc-libc gcc libc) gcc))
2531 (libc (if libc libc glibc-final)))
2532 (package
2533 (name (string-append (package-name gcc) "-toolchain"))
2534 (version (package-version gcc))
2535 (source #f)
2536 (build-system trivial-build-system)
2537 (arguments
2538 '(#:modules ((guix build union))
2539 #:builder (begin
2540 (use-modules (ice-9 match)
2541 (srfi srfi-26)
2542 (guix build union))
2543
2544 (let ((out (assoc-ref %outputs "out")))
2545
2546 (match %build-inputs
2547 (((names . directories) ...)
2548 (union-build out directories)))
2549
2550 (union-build (assoc-ref %outputs "debug")
2551 (list (assoc-ref %build-inputs
2552 "libc-debug")))
2553 (union-build (assoc-ref %outputs "static")
2554 (list (assoc-ref %build-inputs
2555 "libc-static")))
2556 #t))))
2557
2558 (native-search-paths (package-native-search-paths gcc))
2559 (search-paths (package-search-paths gcc))
2560
2561 (license (package-license gcc))
2562 (synopsis "Complete GCC tool chain for C/C++ development")
2563 (description
2564 "This package provides a complete GCC tool chain for C/C++ development to
2565 be installed in user profiles. This includes GCC, as well as libc (headers
2566 an d binaries, plus debugging symbols in the @code{debug} output), and Binutils.")
2567 (home-page "https://gcc.gnu.org/")
2568 (outputs '("out" "debug" "static"))
2569
2570 ;; The main raison d'être of this "meta-package" is (1) to conveniently
2571 ;; install everything that we need, and (2) to make sure ld-wrapper comes
2572 ;; before Binutils' ld in the user's profile.
2573 (inputs `(("gcc" ,gcc)
2574 ("ld-wrapper" ,(car (assoc-ref %final-inputs "ld-wrapper")))
2575 ("binutils" ,binutils-final)
2576 ("libc" ,libc)
2577 ("libc-debug" ,libc "debug")
2578 ("libc-static" ,libc "static"))))))
2579
2580 (define-public gcc-toolchain
2581 (make-gcc-toolchain gcc-final))
2582
2583 (define-public gcc-toolchain-4.8
2584 (make-gcc-toolchain gcc-4.8))
2585
2586 (define-public gcc-toolchain-4.9
2587 (make-gcc-toolchain gcc-4.9))
2588
2589 (define-public gcc-toolchain-5
2590 (make-gcc-toolchain gcc-5))
2591
2592 (define-public gcc-toolchain-6
2593 (make-gcc-toolchain gcc-6))
2594
2595 (define-public gcc-toolchain-7
2596 gcc-toolchain)
2597
2598 (define-public gcc-toolchain-8
2599 (make-gcc-toolchain gcc-8))
2600
2601 (define-public gcc-toolchain-9
2602 (make-gcc-toolchain gcc-9))
2603
2604 ;; Provide the Fortran toolchain package only for the version of gfortran that
2605 ;; is used by Guix internally to build Fortran libraries, because combining
2606 ;; code compiled with different versions can cause problems.
2607
2608 (define-public gfortran-toolchain
2609 (package (inherit (make-gcc-toolchain gfortran))
2610 (synopsis "Complete GCC tool chain for Fortran development")
2611 (description "This package provides a complete GCC tool chain for
2612 Fortran development to be installed in user profiles. This includes
2613 gfortran, as well as libc (headers and binaries, plus debugging symbols
2614 in the @code{debug} output), and binutils.")))
2615
2616
2617 ;;; commencement.scm ends here