1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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, 2019, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
9 ;;; Copyright © 2019, 2020 Marius Bakke <mbakke@fastmail.com>
10 ;;; Copyright © 2020 Timothy Sample <samplet@ngyro.com>
11 ;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
13 ;;; This file is part of GNU Guix.
15 ;;; GNU Guix is free software; you can redistribute it and/or modify it
16 ;;; under the terms of the GNU General Public License as published by
17 ;;; the Free Software Foundation; either version 3 of the License, or (at
18 ;;; your option) any later version.
20 ;;; GNU Guix is distributed in the hope that it will be useful, but
21 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;;; GNU General Public License for more details.
25 ;;; You should have received a copy of the GNU General Public License
26 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
28 (define-module (gnu packages commencement)
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 gawk)
37 #:use-module (gnu packages bison)
38 #:use-module (gnu packages flex)
39 #:use-module (gnu packages guile)
40 #:use-module (gnu packages gettext)
41 #:use-module (gnu packages multiprecision)
42 #:use-module (gnu packages compression)
43 #:use-module (gnu packages mes)
44 #:use-module (gnu packages perl)
45 #:use-module (gnu packages python)
46 #:use-module (gnu packages linux)
47 #:use-module (gnu packages hurd)
48 #:use-module (gnu packages shells)
49 #:use-module (gnu packages texinfo)
50 #:use-module (gnu packages pkg-config)
51 #:use-module (gnu packages rsync)
52 #:use-module (gnu packages xml)
53 #:use-module (guix packages)
54 #:use-module (guix download)
55 #:use-module (guix build-system gnu)
56 #:use-module (guix build-system trivial)
57 #:use-module ((guix licenses) #:prefix license:)
58 #:use-module (guix memoization)
59 #:use-module (guix utils)
60 #:use-module (srfi srfi-1)
61 #:use-module (ice-9 vlist)
62 #:use-module (ice-9 match)
63 #:export (make-gcc-toolchain))
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'.
73 ;;; To avoid circular dependencies, this module should not be imported
74 ;;; directly from anywhere.
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.
93 (uri (list (string-append
94 "mirror://gnu/guix/mirror/bootar-" version ".ses")
96 "https://files.ngyro.com/bootar/bootar-"
100 "0mvp6vgx0q316fvy3z2lddlc5xgq5np3bm1fypgvj6dnayibg9np"))))
101 (build-system gnu-build-system)
103 `(#:implicit-inputs? #f
105 #:guile ,%bootstrap-guile
106 #:imported-modules ((guix build gnu-bootstrap)
107 ,@%gnu-build-system-modules)
110 (use-modules (guix build gnu-bootstrap))
111 (modify-phases %standard-phases
113 (lambda* (#:key inputs #:allow-other-keys)
114 (let* ((source (assoc-ref inputs "source"))
115 (guile-dir (assoc-ref inputs "guile"))
116 (guile (string-append guile-dir "/bin/guile")))
117 (invoke guile "--no-auto-compile" source)
120 (replace 'configure (bootstrap-configure ,version "." "scripts"))
121 (replace 'build (bootstrap-build "."))
122 (replace 'install (bootstrap-install "." "scripts"))))))
123 (inputs `(("guile" ,%bootstrap-guile)))
124 (home-page "https://git.ngyro.com/bootar")
125 (synopsis "Tar decompression and extraction in Guile Scheme")
126 (description "Bootar is a simple Tar extractor written in Guile
127 Scheme. It supports running 'tar xvf' on uncompressed tarballs or
128 tarballs that are compressed with BZip2, GZip, or XZ. It also provides
129 standalone scripts for 'bzip2', 'gzip', and 'xz' that each support
130 decompression to standard output.
132 What makes this special is that Bootar is distributed as a
133 self-extracting Scheme (SES) program. That is, a little script that
134 outputs the source code of Bootar. This makes it possible to go from
135 pure Scheme to Tar and decompression in one easy step.")
136 (license license:gpl3+)))
143 (inherit (package-source gash))
144 (snippet #f))) ;discard snippet for Guile 3.0 support
146 `(#:implicit-inputs? #f
148 #:guile ,%bootstrap-guile
149 #:imported-modules ((guix build gnu-bootstrap)
150 ,@%gnu-build-system-modules)
153 (use-modules (guix build gnu-bootstrap))
154 (modify-phases %standard-phases
156 (bootstrap-configure ,(package-version gash) "gash" "scripts"))
157 (replace 'build (bootstrap-build "gash"))
158 (replace 'install (bootstrap-install "gash" "scripts"))
159 (add-after 'install 'install-symlinks
160 (lambda* (#:key outputs #:allow-other-keys)
161 (let ((out (assoc-ref outputs "out")))
162 (symlink (string-append out "/bin/gash")
163 (string-append out "/bin/sh"))
164 (symlink (string-append out "/bin/gash")
165 (string-append out "/bin/bash"))
167 (inputs `(("guile" ,%bootstrap-guile)))
168 (native-inputs `(("bootar" ,bootar)))))
170 (define gash-utils-boot
173 (name "gash-utils-boot")
175 (inherit (package-source gash-utils))
177 (snippet #f))) ;discard snippet for Guile 3.0 support
179 `(#:implicit-inputs? #f
181 #:guile ,%bootstrap-guile
182 #:imported-modules ((guix build gnu-bootstrap)
183 ,@%gnu-build-system-modules)
186 (use-modules (guix build gnu-bootstrap))
187 (modify-phases %standard-phases
188 (add-after 'unpack 'set-load-path
189 (lambda* (#:key inputs #:allow-other-keys)
190 (let ((gash (assoc-ref inputs "gash")))
191 (add-to-load-path (string-append gash "/share/guile/site/"
192 (effective-version))))
194 (add-before 'configure 'pre-configure
196 (format #t "Creating gash/commands/testb.scm~%")
197 (copy-file "gash/commands/test.scm"
198 "gash/commands/testb.scm")
199 (substitute* "gash/commands/testb.scm"
200 (("gash commands test") "gash commands testb")
201 (("apply test [(]cdr") "apply test/bracket (cdr"))
202 (for-each (lambda (script)
203 (let ((target (string-append "scripts/"
205 (format #t "Creating scripts/~a~%" target)
206 (copy-file "scripts/template.in" target)
208 (("@UTILITY@") script))))
209 '("awk" "basename" "cat" "chmod" "cmp" "command"
210 "compress" "cp" "cut" "diff" "dirname" "expr"
211 "false" "find" "grep" "head" "ln" "ls" "mkdir"
212 "mv" "printf" "pwd" "reboot" "rm" "rmdir"
213 "sed" "sleep" "sort" "tar" "test" "touch" "tr"
214 "true" "uname" "uniq" "wc" "which"))
215 (format #t "Creating scripts/[.in~%")
216 (copy-file "scripts/template.in" "scripts/[.in")
217 (substitute* "scripts/[.in"
218 (("@UTILITY@") "testb"))
219 (delete-file "scripts/template.in")
222 (bootstrap-configure ,(package-version gash-utils)
224 (replace 'build (bootstrap-build "gash"))
225 (replace 'install (bootstrap-install "gash" "scripts"))
226 ;; XXX: The scripts should add Gash to their load paths and
227 ;; this phase should not exist.
228 (add-after 'install 'copy-gash
229 (lambda* (#:key inputs outputs #:allow-other-keys)
230 (let* ((out (assoc-ref outputs "out"))
231 (moddir (string-append out "/share/guile/site/"
232 (effective-version)))
233 (godir (string-append out "/lib/guile/"
236 (gash (assoc-ref inputs "gash"))
237 (gash-moddir (string-append gash "/share/guile/site/"
238 (effective-version)))
239 (gash-godir (string-append gash "/lib/guile/"
242 (copy-file (string-append gash-moddir "/gash/compat.scm")
243 (string-append moddir "/gash/compat.scm"))
244 (copy-recursively (string-append gash-moddir "/gash/compat")
245 (string-append moddir "/gash/compat"))
246 (copy-file (string-append gash-godir "/gash/compat.go")
247 (string-append godir "/gash/compat.go"))
248 (copy-recursively (string-append gash-godir "/gash/compat")
249 (string-append godir "/gash/compat"))
251 (inputs `(("gash" ,gash-boot)
252 ("guile" ,%bootstrap-guile)))
253 (native-inputs `(("bootar" ,bootar)))))
255 (define (%boot-gash-inputs)
256 `(("bash" , gash-boot) ; gnu-build-system wants "bash"
257 ("coreutils" , gash-utils-boot)
259 ("guile" ,%bootstrap-guile)))
261 (define %bootstrap-mes-rewired
264 (name "bootstrap-mes-rewired")
267 (native-inputs `(("mes" ,%bootstrap-mes)
268 ("gash" ,gash-boot)))
270 (propagated-inputs '())
272 (build-system trivial-build-system)
274 `(#:guile ,%bootstrap-guile
275 #:modules ((guix build utils))
278 (use-modules (guix build utils)
281 (let* ((mes (assoc-ref %build-inputs "mes"))
282 (gash (assoc-ref %build-inputs "gash"))
283 (mes-bin (string-append mes "/bin"))
284 (guile (string-append mes-bin "/mes"))
285 (mes-module (string-append mes "/share/mes/module"))
286 (out (assoc-ref %outputs "out"))
287 (bin (string-append out "/bin"))
288 (mescc (string-append bin "/mescc"))
289 (module (string-append out "/share/mes/module")))
290 (define (rewire file)
293 (("/gnu/store[^ ]+mes-minimal-[^/)}\"]*") out)
294 (("/gnu/store[^ ]+guile-[^/]*/bin/guile") guile)
295 (("/gnu/store[^ ]+bash-[^/)}\"]*") gash)))
298 (for-each (lambda (file) (install-file file bin))
299 (find-files mes-bin))
301 (copy-recursively (string-append mes-module "/mes")
302 (string-append module "/mes"))
303 (copy-recursively (string-append mes-module "/srfi")
304 (string-append module "/srfi"))
306 ;; Cannot easily rewire "mes" because it
307 ;; contains NUL characters; would require
308 ;; remove-store-references alike trick
309 (filter (negate (cut string-suffix? "/mes" <>))
311 (rewire (string-append module "/mes/boot-0.scm"))
314 (with-output-to-file mescc
316 (display (string-append
323 MES_PREFIX=${MES_REWIRED_PREFIX-" out "/share/mes}
325 export MES MES_PREFIX
327 MES_ARENA=${MES_REWIRED_ARENA-10000000}
328 MES_MAX_ARENA=${MES_REWIRED_ARENA-10000000}
329 MES_STACK=${MES_REWIRED_STACK-1000000}
330 export MES_ARENA MES_MAX_ARENA MES_STACK
332 $MES -e '(mescc)' module/mescc.scm -- \"$@\"
336 (with-directory-excursion module
337 (chmod "mes/base.mes" #o644)
338 (copy-file "mes/base.mes" "mes/base.mes.orig")
339 (let ((base.mes (open-file "mes/base.mes" "a")))
341 ;; A fixed map, from Mes 0.21, required to bootstrap Mes 0.21
342 (define (map f h . t)
344 (and (pair? t) (null? (car t)))
345 (and (pair? t) (pair? (cdr t)) (null? (cadr t)))) '()
346 (if (null? t) (cons (f (car h)) (map f (cdr h)))
348 (cons (f (car h) (caar t)) (map f (cdr h) (cdar t)))
350 (cons (f (car h) (caar t) (caadr t)) (map f (cdr h) (cdar t) (cdadr t)))
351 (error 'unsupported (cons* 'map-4: f h t))b )))))
355 (chmod "mes/guile.mes" #o644)
356 (copy-file "mes/guile.mes" "mes/guile.mes.orig")
357 (let ((guile.mes (open-file "mes/guile.mes" "a")))
359 ;; After booting guile.scm; use Mes 0.21; especially: MesCC 0.21
360 (let* ((self (car (command-line)))
361 (prefix (dirname (dirname self))))
362 (set! %moduledir (string-append prefix \"/mes/module/\"))
363 (setenv \"%numbered_arch\" \"true\"))
376 (uri (string-append "mirror://gnu/mes/"
377 "mes-" version ".tar.gz"))
380 "0p1jsrrmcbc0zrvbvnjbb6iyxr0in71km293q8qj6gnar6bw09av"))))
382 (propagated-inputs '())
384 `(("nyacc-source" ,(origin (inherit (package-source nyacc-0.99))
386 ("mes" ,%bootstrap-mes-rewired)
387 ("mescc-tools" ,%bootstrap-mescc-tools)
388 ,@(%boot-gash-inputs)))
390 `(#:implicit-inputs? #f
392 #:guile ,%bootstrap-guile
393 #:strip-binaries? #f ; binutil's strip b0rkes MesCC/M1/hex2 binaries
395 (modify-phases %standard-phases
396 (add-after 'unpack 'unpack-seeds
398 (let ((nyacc-source (assoc-ref %build-inputs "nyacc-source")))
399 (with-directory-excursion ".."
400 (invoke "tar" "-xvf" nyacc-source)))))
402 (lambda* (#:key outputs #:allow-other-keys)
403 (let ((out (assoc-ref %outputs "out"))
404 (gash (assoc-ref %build-inputs "bash"))
405 (mes (assoc-ref %build-inputs "mes"))
406 (dir (with-directory-excursion ".." (getcwd))))
407 (setenv "AR" (string-append "gash " (getcwd) "/scripts/mesar"))
408 (setenv "BASH" (string-append gash "/bin/bash"))
409 (setenv "CC" (string-append mes "/bin/mescc"))
410 (setenv "GUILE_LOAD_PATH"
412 mes "/share/mes/module"
413 ":" dir "/nyacc-0.99.0/module"))
414 (invoke "gash" "configure.sh"
415 (string-append "--prefix=" out)
416 (string-append "--host=i686-linux-gnu")))))
419 (invoke "sh" "bootstrap.sh")))
423 (substitute* "install.sh" ; show some progress
425 (("^( *)((cp|mkdir|tar) [^']*[^\\])\n" all space cmd)
426 (string-append space "echo '" cmd "'\n"
428 (invoke "sh" "install.sh")
429 ;; Keep ASCII output, for friendlier comparison and bisection
430 (let* ((out (assoc-ref %outputs "out"))
431 (cache (string-append out "/lib/cache")))
432 (define (objects-in-dir dir)
435 (and (equal? (dirname name) dir)
436 (or (string-suffix? ".o" name)
437 (string-suffix? ".s" name))))))
438 (for-each (lambda (x) (install-file x cache))
439 (append (objects-in-dir ".")
440 (objects-in-dir "mescc-lib"))))
443 (list (search-path-specification
444 (variable "C_INCLUDE_PATH")
445 (files '("include")))
446 (search-path-specification
447 (variable "LIBRARY_PATH")
449 (search-path-specification
450 (variable "MES_PREFIX")
456 ;; Pristine tcc cannot be built by MesCC, we are keeping a delta of 11
457 ;; patches. In a very early and rough form they were presented to the
458 ;; TinyCC developers, who at the time showed no interest in supporting the
459 ;; bootstrappable effort; we will try again later. These patches have been
460 ;; ported to 0.9.27, alas the resulting tcc is buggy. Once MesCC is more
461 ;; mature, this package should use the 0.9.27 sources (or later).
465 (version "0.9.26-1103-g6e62e0e")
469 "http://lilypond.org/janneke/mes/20191117/"
470 "/tcc-" version ".tar.gz"))
473 "1qbybw7mxbgkv3sazvz1v7c8byq998vk8f1h25ik8w3d2l63lxng"))))
474 (build-system gnu-build-system)
475 (supported-systems '("i686-linux" "x86_64-linux"))
477 (propagated-inputs '())
480 ("nyacc-source" ,(origin (inherit (package-source nyacc-0.99))
482 ("mescc-tools" ,%bootstrap-mescc-tools)
483 ,@(%boot-gash-inputs)))
485 `(#:implicit-inputs? #f
486 #:guile ,%bootstrap-guile
487 #:validate-runpath? #f ; no dynamic executables
488 #:strip-binaries? #f ; no strip yet
490 (modify-phases %standard-phases
491 (add-after 'unpack 'unpack-seeds
492 (lambda* (#:key outputs #:allow-other-keys)
493 (let ((nyacc-source (assoc-ref %build-inputs "nyacc-source")))
494 (with-directory-excursion ".."
495 (invoke "tar" "-xvf" nyacc-source)))))
497 (lambda* (#:key outputs #:allow-other-keys)
498 (let* ((out (assoc-ref %outputs "out"))
499 (dir (with-directory-excursion ".." (getcwd)))
500 (interpreter "/lib/mes-loader"))
502 (setenv "prefix" out)
503 (setenv "GUILE_LOAD_PATH"
504 (string-append dir "/nyacc-0.99.0/module"))
506 (substitute* "conftest.c"
509 (invoke "sh" "configure"
511 (string-append "--prefix=" out)
512 (string-append "--elfinterp=" interpreter)
517 (substitute* "bootstrap.sh" ; Show some progress
518 (("^( *)((cp|ls|mkdir|rm|[.]/tcc|[.]/[$][{PROGRAM_PREFIX[}]tcc) [^\"]*[^\\])\n" all space cmd)
519 (string-append space "echo \"" cmd "\"\n"
521 (invoke "sh" "bootstrap.sh")))
525 (system* "./tcc" "--help") ; --help exits 1
526 ;; (invoke "sh" "test.sh" "mes/scaffold/tests/30-strlen")
527 ;; (invoke "sh" "-x" "test.sh" "mes/scaffold/tinycc/00_assignment")
528 ;; TODO: add sensible check target (without depending on make)
529 ;; (invoke "sh" "check.sh")
533 (substitute* "install.sh" ; Show some progress
534 (("^( *)((cp|ls|mkdir|rm|tar|./[$][{PROGRAM_PREFIX[}]tcc) [^\"]*[^\\])\n" all space cmd)
535 (string-append space "echo \"" cmd "\"\n"
538 (invoke "sh" "install.sh"))))))
540 (list (search-path-specification
541 (variable "C_INCLUDE_PATH")
542 (files '("include")))
543 (search-path-specification
544 (variable "LIBRARY_PATH")
545 (files '("lib")))))))
548 ;; The initial gzip. We keep this scripted gzip build before building make
549 ;; to soften the dependency on Gash Core Utils gzip.
553 (name "gzip-mesboot")
556 (uri (string-append "mirror://gnu/gzip/gzip-" version ".tar"))
559 "1rhgk2vvmdvnn6vygf0dja92ryyng00knl0kz5srb77k2kryjb2d"))))
560 (supported-systems '("i686-linux" "x86_64-linux"))
562 (propagated-inputs '())
563 (native-inputs `(("tcc" ,tcc-boot0)
564 ,@(%boot-gash-inputs)))
566 `(#:implicit-inputs? #f
567 #:guile ,%bootstrap-guile
568 #:strip-binaries? #f ; no strip yet
570 (modify-phases %standard-phases
572 (add-after 'unpack 'scripted-patch
574 (substitute* "util.c"
575 (("^char [*]strlwr" all) (string-append all "_tcc_cannot_handle_dupe")))
579 (let ((files '("bits" "crypt" "deflate" "getopt" "gzip"
580 "inflate" "lzw" "trees" "unlzh" "unlzw"
581 "unpack" "unzip" "util" "zip")))
583 (invoke "tcc" "-c" "-D NO_UTIME=1" "-D HAVE_UNISTD_H=1"
584 (string-append x ".c")))
585 (for-each compile files)
587 (cons* "tcc" "-o" "gzip"
588 (map (lambda (x) (string-append x ".o")) files)))
589 (link "gzip" "gunzip"))))
592 (let* ((out (assoc-ref %outputs "out"))
593 (bin (string-append out "/bin")))
594 (install-file "gzip" bin)
595 (install-file "gunzip" bin))))
598 (invoke "./gzip" "--version")))
600 (delete 'compress-documentation))))))
602 (define gnu-make-mesboot0
606 (name "make-mesboot0")
610 (uri (string-append "mirror://gnu/make/make-" version ".tar.gz"))
613 "1pb7fb7fqf9wz9najm85qdma1xhxzf1rhj5gwrlzdsz2zm0hpcv4"))))
614 (supported-systems '("i686-linux" "x86_64-linux"))
616 (propagated-inputs '())
617 (native-inputs `(("tcc" ,tcc-boot0)
618 ,@(%boot-gash-inputs)))
620 `(#:implicit-inputs? #f
621 #:guile ,%bootstrap-guile
622 #:configure-flags '("CC=tcc"
625 "--build=i686-unknown-linux-gnu"
626 "--host=i686-unknown-linux-gnu"
628 #:modules ((guix build gnu-build-system)
631 #:strip-binaries? #f ; no strip yet
633 (modify-phases %standard-phases
634 (add-after 'unpack 'scripted-patch
636 (substitute* "build.sh.in"
637 (("@LIBOBJS@") "getloadavg.o")
638 (("@REMOTE@") "stub"))
640 (add-after 'configure 'configure-fixup
642 (substitute* "make.h"
643 (("^extern long int lseek.*" all) (string-append "// " all)))
647 (invoke "sh" "./build.sh")))
648 (replace 'check ; proper check needs awk
650 (invoke "./make" "--version")))
653 (let* ((out (assoc-ref %outputs "out"))
654 (bin (string-append out "/bin")))
655 (install-file "make" bin)))))))))
657 (define (%boot-tcc0-inputs)
658 `(("make" ,gnu-make-mesboot0)
660 ,@(%boot-gash-inputs)))
662 (define bzip2-mesboot
666 (name "bzip2-mesboot")
667 (version (package-version bzip2))
668 (source (bootstrap-origin (package-source bzip2)))
669 (supported-systems '("i686-linux" "x86_64-linux"))
671 (propagated-inputs '())
672 (native-inputs (%boot-tcc0-inputs))
675 `(#:implicit-inputs? #f
676 #:guile ,%bootstrap-guile
678 #:tests? #f ; check is naive, also checks non-built PROGRAMS
679 #:strip-binaries? #f ; no strip yet
680 #:make-flags (list "CC=tcc -I ." "AR=tcc -ar" "bzip2"
681 (string-append "PREFIX="
682 (assoc-ref %outputs "out")))
684 (modify-phases %standard-phases
685 (add-after 'unpack 'scripted-patch
687 (substitute* "Makefile"
689 (string-append "\t#" all)))
690 (substitute* "bzip2.c"
691 (("struct utimbuf uTimBuf;" all)
692 (string-append "// " all))
694 (string-append "// " all))
695 (("retVal = utime [(] dstName, &uTimBuf [)];" all)
696 (string-append "retVal = 0; // " all)))
700 (with-output-to-file "utime.h"
702 #define fchown(filedes, owner, group) 0
703 #define fchmod(filedes, mode) 0
708 (invoke "./bzip2" "--help")))
709 ;; FIXME: no compressing gzip yet
710 (delete 'compress-documentation))))))
712 (define bash-mesboot0
715 (inherit static-bash)
716 (name "bash-mesboot0")
720 (uri (string-append "mirror://gnu/bash/bash-"
724 "1r1z2qdw3rz668nxrzwa14vk2zcn00hw7mpjn384picck49d80xs"))))
726 (propagated-inputs '())
727 (native-inputs (%boot-tcc0-inputs))
730 `(#:implicit-inputs? #f
731 #:guile ,%bootstrap-guile
733 #:strip-binaries? #f ; no strip yet
735 (list "--build=i686-unknown-linux-gnu"
736 "--host=i686-unknown-linux-gnu"
738 "--without-bash-malloc"
741 "--disable-help-builtin"
743 "--disable-net-redirections"
746 ;; Pretend 'dlopen' is missing so we don't build loadable
747 ;; modules and related code.
748 "ac_cv_func_dlopen=no")
749 #:make-flags '("bash")
751 (modify-phases %standard-phases
752 (add-before 'configure 'setenv
754 (let* ((gash (assoc-ref %build-inputs "bash"))
755 (shell (string-append gash "/bin/gash")))
756 (setenv "CONFIG_SHELL" shell)
757 (setenv "SHELL" shell)
760 (setenv "AR" "tcc -ar")
761 (setenv "CFLAGS" "-D _POSIX_VERSION=1")
763 (add-after 'unpack 'scripted-patch
765 (substitute* "Makefile.in"
766 (("mksyntax\\.c\n") "mksyntax.c -lgetopt\n")
767 (("buildversion[.]o\n") "buildversion.o -lgetopt\n")
769 (("\tsize ") "#\tsize"))
770 (substitute* "lib/sh/oslib.c"
771 (("int name, namelen;") "char *name; int namelen;"))
772 (substitute* "lib/sh/snprintf.c"
773 (("^#if (defined [(]HAVE_LOCALE_H[)])" all define) (string-append "#if 0 //" define)))
774 (substitute* "configure"
775 ((" egrep") " grep"))
778 (lambda* (#:key configure-flags #:allow-other-keys)
779 (let ((configure-flags (filter (lambda (x)
780 (and (not (string-prefix? "CONFIG_SHELL=" x))
781 (not (string-prefix? "SHELL=" x))))
783 (format (current-error-port)
784 "running ./configure ~a\n" (string-join configure-flags)))
785 (apply invoke (cons "./configure" configure-flags))))
786 (add-after 'configure 'configure-fixups
788 (substitute* "config.h"
789 (("#define GETCWD_BROKEN 1") "#undef GETCWD_BROKEN"))
790 (let ((config.h (open-file "config.h" "a")))
791 (display (string-append
792 ;; XXX TODO: remove nested ,(string-append ...) and
793 ;; store file name on next rebuild cycle
795 // tcc: error: undefined symbol 'enable_hostname_completion'
796 #define enable_hostname_completion(on_or_off) 0
798 // /gnu/store/" "cq0cmv35s9dhilx14zaghlc08gpc0hwr-tcc-boot0-0.9.26-6.c004e9a/lib/libc.a: error: 'sigprocmask' defined twice
799 #define HAVE_POSIX_SIGNALS 1
800 #define endpwent(x) 0
807 (invoke "./bash" "--version")))
810 (let* ((out (assoc-ref %outputs "out"))
811 (bin (string-append out "/bin")))
813 (copy-file "bash" (string-append bin "/bash"))
814 (copy-file "bash" (string-append bin "/sh"))
824 (inherit (package-source tcc))
825 ;; `patches' needs XZ
826 ;; (patches (search-patches "tcc-boot-0.9.27.patch"))
828 (build-system gnu-build-system)
830 (propagated-inputs '())
831 (native-inputs `(;;("boot-patch" ,(search-patch "tcc-boot-0.9.27.patch"))
832 ("bzip2" ,bzip2-mesboot)
833 ,@(%boot-tcc0-inputs)))
835 `(#:implicit-inputs? #f
836 #:guile ,%bootstrap-guile
837 #:validate-runpath? #f ; no dynamic executables
838 #:strip-binaries? #f ; no strip yet
840 (modify-phases %standard-phases
841 ;; tar xvf ..bz2 gives
842 ;; bzip2: PANIC -- internal consistency error
844 (lambda* (#:key source #:allow-other-keys)
845 (copy-file source "tarball.tar.bz2")
846 (invoke "bzip2" "-d" "tarball.tar.bz2")
847 (invoke "tar" "xvf" "tarball.tar")
848 (chdir (string-append "tcc-" ,version))
851 ;; (add-after 'unpack 'apply-boot-patch
852 ;; (lambda* (#:key inputs #:allow-other-keys)
853 ;; (let ((patch-file (assoc-ref inputs "boot-patch")))
854 ;; (invoke "patch" "-p1" "-i" patch-file))))
855 (add-after 'unpack 'scripted-patch
856 (lambda* (#:key inputs #:allow-other-keys)
857 (substitute* "libtcc.c"
858 (("s->alacarte_link = 1;" all)
860 s->static_link = 1;")))
863 (lambda* (#:key outputs #:allow-other-keys)
864 (let* ((out (assoc-ref %outputs "out"))
865 (tcc (assoc-ref %build-inputs "tcc"))
866 (libc (assoc-ref %build-inputs "libc"))
867 (interpreter "/mes/loader"))
868 (invoke "sh" "configure"
869 (string-append "--cc=tcc")
870 (string-append "--cpu=i386")
871 (string-append "--prefix=" out)
872 (string-append "--elfinterp=" interpreter)
873 (string-append "--crtprefix=" tcc "/lib")
874 (string-append "--sysincludepaths=" tcc "/include")
875 (string-append "--libpaths=" tcc "/lib")))))
877 (lambda* (#:key outputs #:allow-other-keys)
878 (let* ((out (assoc-ref %outputs "out"))
879 (tcc (assoc-ref %build-inputs "tcc"))
880 (libc (assoc-ref %build-inputs "libc"))
881 (interpreter "/mes/loader"))
887 "-D" "TCC_TARGET_I386=1"
888 "-D" "CONFIG_TCC_STATIC=1"
889 "-D" "CONFIG_USE_LIBGCC=1"
890 "-D" (string-append "CONFIG_TCCDIR=\"" out "/lib/tcc\"")
891 "-D" (string-append "CONFIG_TCC_CRTPREFIX=\"" out "/lib:{B}/lib:.\"")
892 "-D" (string-append "CONFIG_TCC_CRTPREFIX=\"" out "/lib:{B}/lib:.\"")
893 "-D" (string-append "CONFIG_TCC_ELFINTERP=\"" interpreter "\"")
894 "-D" (string-append "CONFIG_TCC_LIBPATHS=\"" tcc "/lib:{B}/lib:.\"")
895 "-D" (string-append "CONFIG_TCC_SYSINCLUDEPATHS=\""
896 tcc "/include" ":/include:{B}/include\"")
897 "-D" (string-append "TCC_LIBGCC=\"" tcc "/lib/libc.a\"")
902 ;; FIXME: add sensible check target (without depending on make)
904 (= 1 (status:exit-val (system* "./tcc" "--help")))))
906 (lambda* (#:key outputs #:allow-other-keys)
907 (let ((out (assoc-ref %outputs "out"))
908 (tcc (assoc-ref %build-inputs "tcc")))
910 (mkdir-p (string-append out "/bin"))
911 (copy-file "tcc" (string-append out "/bin/tcc"))
912 (mkdir-p (string-append out "/lib/tcc"))
913 (copy-recursively (string-append tcc "/include")
914 (string-append out "/include"))
915 (copy-recursively (string-append tcc "/lib")
916 (string-append out "/lib"))
917 (invoke "tcc" "-D" "TCC_TARGET_I386=1" "-c" "-o" "libtcc1.o" "lib/libtcc1.c")
918 (invoke "tcc" "-ar" "rc" "libtcc1.a" "libtcc1.o")
919 (copy-file "libtcc1.a" (string-append out "/lib/libtcc1.a"))
920 (delete-file (string-append out "/lib/tcc/libtcc1.a"))
921 (copy-file "libtcc1.a" (string-append out "/lib/tcc/libtcc1.a"))
924 (define diffutils-mesboot
925 ;; The initial diffutils.
928 (name "diffutils-mesboot")
932 (uri (string-append "mirror://gnu/diffutils/diffutils-"
936 "1mirn5i825bn5w7rh6mgn0r8aj9xqanav95dwcl1b8sn82f4iwnm"))))
937 (supported-systems '("i686-linux" "x86_64-linux"))
939 (propagated-inputs '())
940 (native-inputs (%boot-tcc0-inputs))
942 `(#:implicit-inputs? #f
943 #:guile ,%bootstrap-guile
945 #:tests? #f ; check is naive, also checks non-built PROGRAMS
946 #:strip-binaries? #f ; no strip yet
948 (modify-phases %standard-phases
949 (add-before 'configure 'remove-diff3-sdiff
950 (lambda* (#:key outputs #:allow-other-keys)
951 (substitute* "Makefile.in"
952 (("PROGRAMS = .*" all) "PROGRAMS = cmp diff"))))
953 (replace 'configure ; needs classic invocation of configure
954 (lambda* (#:key configure-flags #:allow-other-keys)
955 (let* ((out (assoc-ref %outputs "out"))
956 (bash (assoc-ref %build-inputs "bash"))
957 (shell (string-append bash "/bin/bash")))
958 (setenv "CONFIG_SHELL" shell)
961 (format (current-error-port)
962 "running ./configure ~a\n" (string-join configure-flags))
963 (apply invoke (cons "./configure" configure-flags)))))
966 (let* ((out (assoc-ref %outputs "out"))
967 (bin (string-append out "/bin")))
969 (install-file "cmp" bin)
970 (install-file "diff" bin)
973 (define patch-mesboot
974 ;; The initial patch.
977 (name "patch-mesboot")
981 (uri (string-append "mirror://gnu/patch/patch-"
985 "12nv7jx3gxfp50y11nxzlnmqqrpicjggw6pcsq0wyavkkm3cddgc"))))
986 (supported-systems '("i686-linux" "x86_64-linux"))
988 (propagated-inputs '())
989 (native-inputs (%boot-tcc0-inputs))
991 `(#:implicit-inputs? #f
992 #:guile ,%bootstrap-guile
994 #:tests? #f ; check is naive, also checks non-built PROGRAMS
995 #:strip-binaries? #f ; no strip yet
996 #:configure-flags '("AR=tcc -ar" "CC=tcc" "LD-tcc")
998 (modify-phases %standard-phases
999 (add-after 'unpack 'scripted-patch
1001 ;; avoid another segfault
1002 (substitute* "pch.c"
1003 (("while [(]p_end >= 0[)]" all)
1004 "p_end = -1;\nwhile (0)"))
1006 ;; FIXME: no compressing gzip yet
1007 (delete 'compress-documentation))))))
1009 (define sed-mesboot0
1013 (name "sed-mesboot0")
1017 (uri (string-append "mirror://gnu/sed/sed-"
1021 "1hyv7i82jd0q18xcql51ylc8jwadp3gb3irgcqlis3v61p35jsv2"))))
1022 (supported-systems '("i686-linux" "x86_64-linux"))
1024 (propagated-inputs '())
1025 (native-inputs (%boot-tcc0-inputs))
1027 `(#:implicit-inputs? #f
1028 #:guile ,%bootstrap-guile
1029 #:parallel-build? #f
1030 #:configure-flags '("CC=tcc")
1031 #:make-flags '("CC=tcc" "extra_objs=" "DEFS=-D HAVE_BCOPY")
1032 #:strip-binaries? #f ; no strip yet
1034 (modify-phases %standard-phases
1035 (add-after 'unpack 'scripted-patch
1037 (let* ((out (assoc-ref %outputs "out"))
1038 (bash (assoc-ref %build-inputs "bash"))
1039 (shell (string-append bash "/bin/bash")))
1040 (substitute* "configure"
1041 (("/bin/sh") shell))
1045 (invoke "./sed" "--version")))
1048 (let* ((out (assoc-ref %outputs "out"))
1049 (bin (string-append out "/bin")))
1050 (install-file "sed" bin)
1053 (define (%boot-tcc-inputs)
1054 `(("bash" ,bash-mesboot0)
1055 ("bzip2" ,bzip2-mesboot)
1056 ("diffutils" ,diffutils-mesboot)
1057 ("gzip" ,gzip-mesboot)
1058 ("patch" ,patch-mesboot)
1059 ("sed" ,sed-mesboot0)
1061 ,@(alist-delete "tcc" (%boot-tcc0-inputs))))
1063 (define binutils-mesboot0
1064 ;; The initial Binutils
1067 (name "binutils-mesboot0")
1071 (uri (string-append "mirror://gnu/binutils/binutils-"
1075 "1w8xp7k44bkijr974x9918i4p1sw4g2fcd5mxvspkjpg38m214ds"))))
1077 (propagated-inputs '())
1078 (native-inputs (%boot-tcc-inputs))
1079 (supported-systems '("i686-linux" "x86_64-linux"))
1081 `(#:implicit-inputs? #f
1082 #:guile ,%bootstrap-guile
1083 #:tests? #f ; runtest: command not found
1084 #:parallel-build? #f
1085 #:strip-binaries? #f ; no strip yet
1087 (let ((out (assoc-ref %outputs "out")))
1091 "--build=i386-unknown-linux"
1092 "--host=i386-unknown-linux"
1093 "--target=i386-unknown-linux"
1095 ,(string-append "--prefix=" out)))
1097 (modify-phases %standard-phases
1098 (add-before 'configure 'setenv
1100 (let* ((out (assoc-ref %outputs "out"))
1101 (bash (assoc-ref %build-inputs "bash"))
1102 (shell (string-append bash "/bin/bash")))
1103 (setenv "CONFIG_SHELL" shell)
1104 (setenv "SHELL" shell)
1105 (setenv "AR" "tcc -ar")
1106 (setenv "RANLIB" "true")
1107 (setenv "CC" "tcc -D __GLIBC_MINOR__=6")
1109 (add-after 'unpack 'scripted-patch
1110 (lambda* (#:key inputs #:allow-other-keys)
1111 (substitute* "bfd/configure"
1112 (("^sed -e '/SRC-POTFILES.*" all)
1113 "echo -e 'all:\\n\\ttrue\\n\\ninstall:\\n\\ttrue\\n' > po/Makefile\n"))
1115 (replace 'configure ; needs classic invocation of configure
1116 (lambda* (#:key configure-flags #:allow-other-keys)
1117 (format (current-error-port)
1118 "running ./configure ~a\n" (string-join configure-flags))
1119 (apply system* "./configure" configure-flags)
1120 (substitute* "config.status"
1121 (("[.]//dev/null") "/dev/null"))
1122 (invoke "sh" "./config.status"))))))))
1124 (define gcc-core-mesboot0
1125 ;; Gcc-2.95.3 is the most recent GCC that is supported by what the Mes C
1126 ;; Library v0.16 offers. Gcc-3.x (and 4.x) place higher demands on a C
1127 ;; library, such as dir.h/struct DIR/readdir, locales, signals... Also,
1128 ;; with gcc-2.95.3, binutils (2.14.0, 2.20.1a) and glibc-2.2.5 we found a
1129 ;; GNU toolchain triplet "that works".
1132 (name "gcc-core-mesboot0")
1136 (uri (string-append "mirror://gnu/gcc/gcc-2.95.3/gcc-core-"
1139 ;; `patches' needs XZ
1140 ;; (patches (search-patches "gcc-boot-2.95.3.patch"))
1143 "1xvfy4pqhrd5v2cv8lzf63iqg92k09g6z9n2ah6ndd4h17k1x0an"))))
1144 (supported-systems '("i686-linux" "x86_64-linux"))
1146 (propagated-inputs '())
1147 (native-inputs `(("boot-patch" ,(search-patch "gcc-boot-2.95.3.patch"))
1148 ("binutils" ,binutils-mesboot0)
1149 ,@(%boot-tcc-inputs)))
1152 `(#:implicit-inputs? #f
1153 #:guile ,%bootstrap-guile
1155 #:parallel-build? #f
1156 #:strip-binaries? #f
1158 (let ((out (assoc-ref %outputs "out")))
1162 "--build=i686-unknown-linux-gnu"
1163 "--host=i686-unknown-linux-gnu"
1164 ,(string-append "--prefix=" out)))
1166 `("CC=tcc -static -D __GLIBC_MINOR__=6"
1167 "OLDCC=tcc -static -D __GLIBC_MINOR__=6"
1168 "CC_FOR_BUILD=tcc -static -D __GLIBC_MINOR__=6"
1171 ,(string-append "LIBGCC2_INCLUDES=-I "
1172 (assoc-ref %build-inputs "tcc")
1175 ,(string-append "BOOT_LDFLAGS="
1176 " -B" (assoc-ref %build-inputs "tcc")
1178 #:modules ((guix build gnu-build-system)
1182 (modify-phases %standard-phases
1183 (add-after 'unpack 'apply-boot-patch
1184 (lambda* (#:key inputs #:allow-other-keys)
1185 (let ((patch-file (assoc-ref inputs "boot-patch")))
1186 (system* "patch" "--force" "-p1" "-i" patch-file)
1188 (add-before 'configure 'setenv
1189 (lambda* (#:key outputs #:allow-other-keys)
1190 (let* ((out (assoc-ref outputs "out"))
1191 (bash (assoc-ref %build-inputs "bash"))
1192 (shell (string-append bash "/bin/bash"))
1193 (tcc (assoc-ref %build-inputs "tcc"))
1194 (cppflags " -D __GLIBC_MINOR__=6"))
1195 (setenv "CONFIG_SHELL" shell)
1196 (setenv "CPPFLAGS" cppflags)
1197 (setenv "CC" (string-append "tcc" cppflags))
1198 (setenv "CC_FOR_BUILD" (string-append "tcc" cppflags))
1199 (setenv "CPP" (string-append "tcc -E" cppflags))
1200 (with-output-to-file "config.cache"
1203 ac_cv_c_float_format='IEEE (little-endian)'
1206 (replace 'configure ; needs classic invocation of configure
1207 (lambda* (#:key configure-flags #:allow-other-keys)
1208 (format (current-error-port)
1209 "running ./configure ~a\n" (string-join configure-flags))
1210 (apply invoke "./configure" configure-flags)))
1211 (add-after 'configure 'remove-info
1213 ;; no info at this stage
1214 (delete-file-recursively "texinfo")
1215 (invoke "touch" "gcc/cpp.info" "gcc/gcc.info")))
1216 (add-after 'install 'install2
1217 (lambda* (#:key outputs #:allow-other-keys)
1218 (let* ((tcc (assoc-ref %build-inputs "tcc"))
1219 (tcc-lib (string-append tcc "/lib/x86-mes-gcc"))
1220 (out (assoc-ref outputs "out"))
1221 (gcc-dir (string-append
1222 out "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3")))
1224 (with-directory-excursion "tmp"
1225 (invoke "ar" "x" (string-append "../gcc/libgcc2.a"))
1226 (invoke "ar" "x" (string-append tcc "/lib/libtcc1.a"))
1227 (apply invoke "ar" "r" (string-append gcc-dir "/libgcc.a")
1228 (find-files "." "\\.o")))
1229 (copy-file "gcc/libgcc2.a" (string-append out "/lib/libgcc2.a"))
1230 (copy-file (string-append tcc "/lib/libtcc1.a")
1231 (string-append out "/lib/libtcc1.a"))
1232 (invoke "ar" "x" (string-append tcc "/lib/libtcc1.a"))
1233 (invoke "ar" "x" (string-append tcc "/lib/libc.a"))
1234 (invoke "ar" "r" (string-append gcc-dir "/libc.a")
1235 "libc.o" "libtcc1.o")
1237 (native-search-paths
1238 (list (search-path-specification
1239 (variable "C_INCLUDE_PATH")
1242 ;; Needed to get things like GCC's <stddef.h>.
1243 "lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include")))
1244 (search-path-specification
1245 (variable "LIBRARY_PATH")
1246 (files '("lib")))))))
1248 (define (%boot-mesboot-core-inputs)
1249 `(("binutils" ,binutils-mesboot0)
1250 ("gawk" ,gawk-mesboot0)
1251 ("gcc" ,gcc-core-mesboot0)
1252 ,@(alist-delete "tcc" (%boot-tcc-inputs))))
1254 (define mesboot-headers
1257 (name "mesboot-headers")
1258 (supported-systems '("i686-linux" "x86_64-linux"))
1260 (propagated-inputs '())
1261 (native-inputs `(("kernel-headers" ,%bootstrap-linux-libre-headers)
1262 ,@(%boot-tcc-inputs)))
1264 `(#:implicit-inputs? #f
1265 #:guile ,%bootstrap-guile
1267 #:strip-binaries? #f
1269 (modify-phases %standard-phases
1273 (lambda* (#:key outputs #:allow-other-keys)
1274 (let* ((out (assoc-ref outputs "out"))
1275 (include (string-append out "/include"))
1276 (headers (assoc-ref %build-inputs "kernel-headers")))
1278 (copy-recursively "include" out)
1279 (copy-recursively headers out)
1282 (define gawk-mesboot0
1283 ;; The initial Gawk.
1286 (name "gawk-mesboot0")
1290 (uri (string-append "mirror://gnu/gawk/gawk-"
1294 "087s7vpc8zawn3l7bwv9f44bf59rc398hvaiid63klw6fkbvabr3"))))
1295 (supported-systems '("i686-linux" "x86_64-linux"))
1297 (propagated-inputs '())
1298 (native-inputs (%boot-tcc-inputs))
1300 `(#:implicit-inputs? #f
1301 #:guile ,%bootstrap-guile
1302 #:configure-flags '("--build=i686-unknown-linux-gnu"
1303 "--host=i686-unknown-linux-gnu"
1305 #:make-flags '("gawk")
1306 #:parallel-build? #f
1307 #:parallel-tests? #f
1308 #:strip-binaries? #f ; no strip yet
1310 (modify-phases %standard-phases
1311 (add-after 'unpack 'scripted-patch
1313 (substitute* "Makefile.in"
1314 (("date ") "echo today ")
1315 ((" autoheader") "true")
1317 (substitute* "test/Makefile.in"
1318 (("^bigtest:.*") "bigtest: basic\n")
1319 (("( |\t)(childin|convfmt|fflush|longwrds|math|negexp)" all sep) sep))))
1320 (add-before 'configure 'setenv
1322 (let* ((out (assoc-ref %outputs "out"))
1323 (bash (assoc-ref %build-inputs "bash"))
1324 (shell (string-append bash "/bin/bash")))
1325 (setenv "CONFIG_SHELL" shell)
1326 (setenv "SHELL" shell)
1328 (setenv "CPP" "tcc -E")
1330 (setenv "ac_cv_func_getpgrp_void" "yes")
1331 (setenv "ac_cv_func_tzset" "yes"))
1333 (replace 'configure ; needs classic invocation of configure
1334 (lambda* (#:key configure-flags #:allow-other-keys)
1335 (let* ((out (assoc-ref %outputs "out"))
1338 ,(string-append "--prefix=" out))))
1339 (format (current-error-port) "running ./configure ~a\n" (string-join configure-flags))
1340 (system* "touch" "configure") ; aclocal.m4 is newer than configure
1341 (apply invoke (cons "./configure" configure-flags)))))
1343 (lambda* (#:key outputs #:allow-other-keys)
1344 (let* ((out (assoc-ref outputs "out"))
1345 (bin (string-append out "/bin")))
1346 (install-file "gawk" bin)
1347 (symlink "gawk" (string-append bin "/awk"))
1350 (define glibc-mesboot0
1351 ;; GNU C Library 2.2.5 is the most recent glibc that we managed to build
1352 ;; using gcc-2.95.3. Newer versions (2.3.x, 2.6, 2.1x) seem to need a newer
1356 (name "glibc-mesboot0")
1360 (uri (string-append "mirror://gnu/glibc/glibc-"
1364 ;; (patches (search-patches "glibc-boot-2.2.5.patch"))
1367 "1vl48i16gx6h68whjyhgnn1s57vqq32f9ygfa2fls7pdkbsqvp2q"))))
1368 (supported-systems '("i686-linux" "x86_64-linux"))
1370 (propagated-inputs '())
1371 (native-inputs `(("boot-patch" ,(search-patch "glibc-boot-2.2.5.patch"))
1372 ("system-patch" ,(search-patch "glibc-bootstrap-system-2.2.5.patch"))
1373 ("headers" ,mesboot-headers)
1374 ,@(%boot-mesboot-core-inputs)))
1377 `(#:implicit-inputs? #f
1378 #:guile ,%bootstrap-guile
1380 #:strip-binaries? #f
1381 #:validate-runpath? #f ; no dynamic executables
1382 #:parallel-build? #f ; gcc-2.95.3 ICEs on massively parallel builds
1383 #:make-flags (list (string-append
1385 (assoc-ref %build-inputs "bash")
1388 (let ((out (assoc-ref %outputs "out"))
1389 (headers (assoc-ref %build-inputs "headers")))
1390 `("--disable-shared"
1392 "--disable-sanity-checks"
1393 "--build=i686-unknown-linux-gnu"
1394 "--host=i686-unknown-linux-gnu"
1395 ,(string-append "--with-headers=" headers "/include")
1396 "--enable-static-nss"
1397 "--without-__thread"
1401 ,(string-append "--prefix=" out)))
1403 (modify-phases %standard-phases
1404 (add-after 'unpack 'apply-boot-patch
1405 (lambda* (#:key inputs #:allow-other-keys)
1406 (and (let ((patch (assoc-ref inputs "boot-patch")))
1407 (invoke "patch" "--force" "-p1" "-i" patch))
1408 (let ((patch (assoc-ref inputs "system-patch")))
1409 (invoke "patch" "--force" "-p1" "-i" patch)))))
1410 (add-before 'configure 'setenv
1411 (lambda* (#:key outputs #:allow-other-keys)
1412 (let* ((out (assoc-ref outputs "out"))
1413 (bash (assoc-ref %build-inputs "bash"))
1414 (shell (string-append bash "/bin/bash"))
1415 (gcc (assoc-ref %build-inputs "gcc"))
1416 (headers (assoc-ref %build-inputs "headers"))
1417 (cppflags (string-append
1419 " -D MES_BOOTSTRAP=1"
1420 " -D BOOTSTRAP_GLIBC=1"))
1421 (cflags (string-append " -L " (getcwd))))
1422 (setenv "CONFIG_SHELL" shell)
1423 (setenv "SHELL" shell)
1424 (setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
1425 (setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags))
1427 (replace 'configure ; needs classic invocation of configure
1428 (lambda* (#:key configure-flags #:allow-other-keys)
1429 (format (current-error-port)
1430 "running ./configure ~a\n" (string-join configure-flags))
1431 (apply invoke "./configure" configure-flags)))
1432 (add-after 'configure 'fixup-configure
1434 (let* ((out (assoc-ref %outputs "out"))
1435 (bash (assoc-ref %build-inputs "bash"))
1436 (shell (string-append bash "/bin/bash")))
1437 (substitute* "config.make"
1438 (("INSTALL = scripts/") "INSTALL = $(..)./scripts/"))
1439 (substitute* "config.make"
1440 (("INSTALL = scripts/") "INSTALL = $(..)./scripts/")
1441 (("BASH = ") (string-append
1446 (define gcc-mesboot0
1448 (inherit gcc-core-mesboot0)
1449 (name "gcc-mesboot0")
1450 (native-inputs `(("boot-patch" ,(search-patch "gcc-boot-2.95.3.patch"))
1451 ;; Packages are given in an order that's relevant for
1452 ;; #include_next purposes.
1453 ("libc" ,glibc-mesboot0)
1454 ("kernel-headers" ,%bootstrap-linux-libre-headers)
1455 ,@(%boot-mesboot-core-inputs)))
1457 (substitute-keyword-arguments (package-arguments gcc-core-mesboot0)
1459 `(modify-phases ,phases
1462 (setenv "CONFIG_SHELL" (which "sh"))
1463 (with-output-to-file "config.cache"
1466 ac_cv_c_float_format='IEEE (little-endian)'
1470 (lambda* (#:key outputs #:allow-other-keys)
1471 (let* ((out (assoc-ref outputs "out"))
1472 (gcc-dir (string-append
1473 out "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3")))
1476 (zero? (system (string-append "set -x; cd tmp && ar x ../gcc/libgcc2.a")))
1477 (zero? (system (string-append "set -x; cd tmp && ar r " gcc-dir "/libgcc.a *.o")))
1478 (copy-file "gcc/libgcc2.a" (string-append out "/lib/libgcc2.a"))))))))
1479 ((#:configure-flags configure-flags)
1480 `(let ((out (assoc-ref %outputs "out")))
1481 `("--disable-shared"
1483 "--build=i686-unknown-linux-gnu"
1484 "--host=i686-unknown-linux-gnu"
1485 ,(string-append "--prefix=" out))))
1486 ((#:make-flags make-flags)
1487 `(let ((gcc (assoc-ref %build-inputs "gcc")))
1489 ,(string-append "LIBGCC2_INCLUDES=-I " gcc "/include")
1490 "LANGUAGES=c")))))))
1492 (define (%boot-mesboot0-inputs)
1493 `(("gcc" ,gcc-mesboot0)
1494 ("kernel-headers" ,%bootstrap-linux-libre-headers)
1495 ("libc" ,glibc-mesboot0)
1496 ,@(alist-delete "gcc" (%boot-mesboot-core-inputs))))
1499 ;; Initial tar with support for xz compression.
1502 (name "tar-mesboot")
1506 (uri (string-append "mirror://gnu/tar/tar-"
1510 "19nvix64y95n5v6rr5g9g3fn08zz85cb5anzd7csfv4a4sz9lw4y"))))
1511 (supported-systems '("i686-linux" "x86_64-linux"))
1513 (propagated-inputs '())
1514 (native-inputs (%boot-mesboot0-inputs))
1516 `(#:implicit-inputs? #f
1517 #:guile ,%bootstrap-guile
1518 #:parallel-build? #f
1519 #:tests? #f ; check is naive, also checks non-built PROGRAMS
1520 #:strip-binaries? #f ; no strip yet
1521 #:configure-flags '("--build=i686-unknown-linux-gnu"
1522 "--host=i686-unknown-linux-gnu"
1525 (modify-phases %standard-phases
1527 (lambda* (#:key configure-flags #:allow-other-keys)
1528 (let* ((out (assoc-ref %outputs "out"))
1529 (bash (assoc-ref %build-inputs "bash"))
1530 (shell (string-append bash "/bin/bash")))
1531 (setenv "CONFIG_SHELL" shell)
1532 (setenv "SHELL" shell)
1533 (setenv "LIBS" "-lc -lnss_files -lnss_dns -lresolv")
1534 (setenv "gl_cv_func_rename_dest_works" "yes")
1535 (format (current-error-port)
1536 "running ./configure ~a\n" (string-join configure-flags))
1537 (apply invoke (cons "./configure" configure-flags)))))
1538 (add-after 'unpack 'scripted-patch
1540 (let* ((bash (assoc-ref %build-inputs "bash"))
1541 (shell (string-append bash "/bin/bash")))
1542 (substitute* "configure"
1543 ((" /bin/sh") shell)))
1544 (substitute* "Makefile.in"
1545 (("^SUBDIRS = doc") "SUBDIRS ="))
1549 (let* ((out (assoc-ref %outputs "out"))
1550 (bin (string-append out "/bin")))
1551 (install-file "src/tar" bin)
1554 (define grep-mesboot
1555 ;; The initial grep.
1558 (name "grep-mesboot")
1562 (uri (string-append "mirror://gnu/grep/grep-"
1566 "1w862l80lgc5mxvpiy4cfwk761d6xxavn0m3xd2l7xs2kmzvp6lq"))))
1567 (supported-systems '("i686-linux" "x86_64-linux"))
1569 (propagated-inputs '())
1570 (native-inputs (%boot-mesboot0-inputs))
1572 `(#:implicit-inputs? #f
1573 #:guile ,%bootstrap-guile
1574 #:parallel-build? #f
1576 (modify-phases %standard-phases
1577 (add-before 'configure 'patch-configure
1579 (let* ((bash (assoc-ref %build-inputs "bash"))
1580 (shell (string-append bash "/bin/bash")))
1581 (substitute* "configure"
1582 ((" [|][|] ./config.status") " || sh ./config.status")))))
1585 (let* ((out (assoc-ref %outputs "out"))
1586 (bin (string-append out "/bin")))
1587 (install-file "grep" bin)
1588 (symlink "grep" (string-append bin "/egrep"))
1589 (symlink "grep" (string-append bin "/fgrep"))
1592 (define binutils-mesboot1
1594 (inherit binutils-mesboot0)
1595 (name "binutils-mesboot1")
1596 (native-inputs (%boot-mesboot0-inputs))
1598 (substitute-keyword-arguments (package-arguments binutils-mesboot0)
1599 ((#:configure-flags configure-flags)
1600 '(let ((out (assoc-ref %outputs "out")))
1604 "--build=i686-unknown-linux-gnu"
1605 "--host=i686-unknown-linux-gnu"
1607 ,(string-append "--prefix=" out))))
1609 `(modify-phases ,phases
1612 (let* ((out (assoc-ref %outputs "out"))
1613 (bash (assoc-ref %build-inputs "bash"))
1614 (shell (string-append bash "/bin/bash")))
1615 (setenv "CONFIG_SHELL" shell)
1618 (define coreutils-mesboot0
1621 (name "coreutils-mesboot0")
1622 ;; The latest .gz release of Coreutils is 8.13; which does not build with gcc-2.95.3:
1623 ;; randperm.c: In function `sparse_swap':
1624 ;; randperm.c:117: invalid lvalue in unary `&'
1625 (version "5.0") ; 2003-04
1628 (uri (string-append "mirror://gnu/coreutils/coreutils-"
1632 "10wq6k66i8adr4k08p0xmg87ff4ypiazvwzlmi7myib27xgffz62"))))
1633 (native-inputs (%boot-mesboot0-inputs))
1634 (supported-systems '("i686-linux" "x86_64-linux"))
1636 (propagated-inputs '())
1638 `(#:implicit-inputs? #f
1639 #:tests? #f ; WARNING: `perl' is needed, ...
1640 #:parallel-build? #f
1641 #:strip-binaries? #f ; strip: unrecognized option `--only-keep-debug'
1642 #:guile ,%bootstrap-guile
1645 "LIBS=-lc -lnss_files -lnss_dns -lresolv"
1646 "ac_cv_func_gethostbyname=no"
1647 "gl_cv_func_rename_dest_works=yes")))))
1649 (define gnu-make-mesboot
1652 (name "make-mesboot")
1656 (uri (string-append "mirror://gnu/make/make-"
1660 "1rs2f9hmvy3q6zkl15jnlmnpgffm0bhw5ax0h5c7q604wqrip69x"))))
1661 (native-inputs (%boot-mesboot0-inputs))
1662 (supported-systems '("i686-linux" "x86_64-linux"))
1664 (propagated-inputs '())
1666 `(#:implicit-inputs? #f
1667 #:parallel-build? #f
1668 #:guile ,%bootstrap-guile
1669 #:configure-flags '("LIBS=-lc -lnss_files -lnss_dns -lresolv")
1671 (modify-phases %standard-phases
1674 (invoke "./make" "--version")))
1676 (lambda* (#:key outputs #:allow-other-keys)
1677 (let* ((out (assoc-ref outputs "out"))
1678 (bin (string-append out "/bin")))
1679 (install-file "make" bin)
1682 (define gawk-mesboot
1685 (name "gawk-mesboot")
1689 (uri (string-append "mirror://gnu/gawk/gawk-"
1693 "03d5y7jabq7p2s7ys9alay9446mm7i5g2wvy8nlicardgb6b6ii1"))))
1694 (native-inputs `(,@(%boot-mesboot0-inputs)
1695 ("mesboot-headers" ,mesboot-headers)))
1696 (supported-systems '("i686-linux" "x86_64-linux"))
1698 (propagated-inputs '())
1700 `(#:implicit-inputs? #f
1701 #:parallel-build? #f
1702 #:guile ,%bootstrap-guile
1703 #:configure-flags '("ac_cv_func_connect=no")
1704 #:make-flags '("gawk")
1706 (modify-phases %standard-phases
1709 (invoke "./gawk" "--version")))
1711 (lambda* (#:key outputs #:allow-other-keys)
1712 (let* ((out (assoc-ref outputs "out"))
1713 (bin (string-append out "/bin")))
1714 (install-file "gawk" bin)
1715 (symlink "gawk" (string-append bin "/awk"))
1721 (name "sed-mesboot")
1722 (version "4.0.6") ; 2003-04
1725 (uri (string-append "mirror://gnu/sed/sed-"
1729 "0861ij94cqc4vaaki6r2wlapwcmhpx4ggp4r70f46mb21a8fkvf1"))))
1730 (native-inputs (%boot-mesboot0-inputs))
1731 (supported-systems '("i686-linux" "x86_64-linux"))
1733 (propagated-inputs '())
1735 `(#:implicit-inputs? #f
1736 #:parallel-build? #f
1737 #:guile ,%bootstrap-guile
1738 #:tests? #f ; 8to7 fails
1740 (modify-phases %standard-phases
1741 (add-after 'unpack '/bin/sh
1743 (let* ((bash (assoc-ref %build-inputs "bash"))
1744 (shell (string-append bash "/bin/bash")))
1745 (substitute* "testsuite/Makefile.tests"
1746 (("^SHELL = /bin/sh")
1747 (string-append "SHELL = " shell)))
1750 (define bash-mesboot
1752 (inherit bash-mesboot0)
1754 (name "bash-mesboot")
1757 (uri (string-append "mirror://gnu/bash/bash-"
1761 "1jyz6snd63xjn6skk7za6psgidsd53k05cr3lksqybi0q6936syq"))))
1763 (propagated-inputs '())
1764 (native-inputs (%boot-mesboot0-inputs))
1767 `(#:implicit-inputs? #f
1768 #:guile ,%bootstrap-guile
1769 #:parallel-build? #f
1771 '("--build=i686-unknown-linux-gnu"
1772 "--host=i686-unknown-linux-gnu"
1774 "--without-bash-malloc"
1775 "--disable-readline"
1777 "--disable-help-builtin"
1778 "--disable-progcomp"
1779 "--disable-net-redirections"
1782 ;; Pretend 'dlopen' is missing so we don't build loadable
1783 ;; modules and related code.
1784 "ac_cv_func_dlopen=no")
1785 #:make-flags '("bash")
1787 (modify-phases %standard-phases
1788 (add-after 'unpack 'scripted-patch
1790 (substitute* "shell.c"
1793 (add-before 'configure 'setenv
1795 (setenv "AWK" "gawk")
1796 (setenv "LIBS" "-lc -lnss_files -lnss_dns -lresolv")
1797 (setenv "gl_cv_func_rename_dest_works" "yes")
1799 (add-after 'configure 'configure-fixups
1801 (let ((config.h (open-file "config.h" "a")))
1802 (display (string-append "
1803 #define enable_hostname_completion(on_or_off) 0
1810 (invoke "./bash" "--version")))
1813 (let* ((out (assoc-ref %outputs "out"))
1814 (bin (string-append out "/bin")))
1816 (copy-file "bash" (string-append bin "/bash"))
1817 (copy-file "bash" (string-append bin "/sh"))
1820 (define (%boot-mesboot1-inputs)
1821 `(("bash" ,bash-mesboot)
1822 ("binutils" ,binutils-mesboot1)
1823 ("coreutils" ,coreutils-mesboot0)
1824 ("gawk" ,gawk-mesboot)
1825 ("grep" ,grep-mesboot)
1826 ("make" ,gnu-make-mesboot)
1827 ("sed" ,sed-mesboot)
1828 ("tar" ,tar-mesboot)
1829 ,@(fold alist-delete (%boot-mesboot0-inputs)
1830 '("bash" "binutils" "bootar" "coreutils" "gash"
1831 "gawk" "grep" "guile" "make" "sed" "tar"))))
1839 (uri (string-append "mirror://gnu/gmp/gmp-" version
1842 "15rwq54fi3s11izas6g985y9jklm3xprfsmym3v1g6xr84bavqvv"))))))
1850 (uri (string-append "mirror://gnu/mpfr/mpfr-" version
1853 "0dxn4904dra50xa22hi047lj8kkpr41d6vb9sd4grca880c7wv94"))))))
1862 "mirror://gnu/mpc/mpc-" version ".tar.gz"))
1865 "1hzci2zrrd7v3g1jk35qindq05hbl0bhjcyyisq9z209xb3fqzb1"))))))
1867 (define gcc-core-mesboot1
1868 ;; GCC 4.6.4 is the latest modular distribution. This package is not
1869 ;; stricly needed, but very helpful for development because it builds
1870 ;; relatively fast. If this configures and builds then gcc-mesboot1 also
1873 (inherit gcc-mesboot0)
1874 (name "gcc-core-mesboot1")
1878 (uri (string-append "mirror://gnu/gcc/gcc-"
1879 version "/gcc-core-" version ".tar.gz"))
1882 "173kdb188qg79pcz073cj9967rs2vzanyjdjyxy9v0xb0p5sad75"))
1884 ;; (patches (search-patches "gcc-boot-4.6.4.patch"))
1886 (inputs `(("gmp-source" ,(package-source gmp-boot))
1887 ("mpfr-source" ,(package-source mpfr-boot))
1888 ("mpc-source" ,(package-source mpc-boot))))
1889 (native-inputs `(("boot-patch" ,(search-patch "gcc-boot-4.6.4.patch"))
1890 ,@(%boot-mesboot1-inputs)))
1892 `(#:implicit-inputs? #f
1893 #:guile ,%bootstrap-guile
1895 #:modules ((guix build gnu-build-system)
1898 #:parallel-build? #f ; for debugging
1900 (let* ((libc (assoc-ref %build-inputs "libc"))
1901 (ldflags (string-append
1903 "-Wl,-dynamic-linker "
1905 ,(glibc-dynamic-linker "i686-linux"))))
1906 (list (string-append "LDFLAGS=" ldflags)
1907 (string-append "LDFLAGS_FOR_TARGET=" ldflags)))
1909 (let ((out (assoc-ref %outputs "out"))
1910 (glibc (assoc-ref %build-inputs "libc")))
1911 (list (string-append "--prefix=" out)
1912 "--build=i686-unknown-linux-gnu"
1913 "--host=i686-unknown-linux-gnu"
1914 (string-append "--with-native-system-header-dir=" glibc "/include")
1915 (string-append "--with-build-sysroot=" glibc "/include")
1916 "--disable-bootstrap"
1917 "--disable-decimal-float"
1918 "--disable-libatomic"
1919 "--disable-libcilkrts"
1922 "--disable-libmudflap"
1923 "--disable-libquadmath"
1924 "--disable-libsanitizer"
1928 "--disable-lto-plugin"
1929 "--disable-multilib"
1932 "--enable-languages=c"
1935 "--enable-threads=single"
1936 "--disable-libstdcxx-pch"
1937 "--disable-build-with-cxx"))
1939 (modify-phases %standard-phases
1940 (add-after 'unpack 'apply-boot-patch
1941 (lambda* (#:key inputs #:allow-other-keys)
1942 (let ((patch-file (assoc-ref inputs "boot-patch")))
1943 (format (current-error-port) "patch file=~s\n" patch-file)
1944 (system* "patch" "--force" "-p1" "-i" patch-file))
1946 ;; c&p from commencement.scm:gcc-boot0
1947 (add-after 'unpack 'unpack-gmp&co
1948 (lambda* (#:key inputs #:allow-other-keys)
1949 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
1950 (mpfr (assoc-ref %build-inputs "mpfr-source"))
1951 (mpc (assoc-ref %build-inputs "mpc-source")))
1953 ;; To reduce the set of pre-built bootstrap inputs, build
1954 ;; GMP & co. from GCC.
1955 (for-each (lambda (source)
1956 (or (invoke "tar" "xvf" source)
1957 (error "failed to unpack tarball"
1959 (list gmp mpfr mpc))
1961 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
1962 ,@(map (lambda (lib)
1963 ;; Drop trailing letters, as gmp-6.0.0a unpacks
1965 `(symlink ,(string-trim-right
1966 (package-full-name lib "-")
1968 ,(package-name lib)))
1969 (list gmp-boot mpfr-boot mpc-boot))
1971 (add-before 'configure 'setenv
1972 (lambda* (#:key outputs #:allow-other-keys)
1973 (let* ((out (assoc-ref outputs "out"))
1974 (binutils (assoc-ref %build-inputs "binutils"))
1975 (bash (assoc-ref %build-inputs "bash"))
1976 (gcc (assoc-ref %build-inputs "gcc"))
1977 (glibc (assoc-ref %build-inputs "libc"))
1978 (kernel-headers (assoc-ref %build-inputs "kernel-headers")))
1979 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
1980 (setenv "C_INCLUDE_PATH" (string-append
1981 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include"
1982 ":" kernel-headers "/include"
1983 ":" glibc "/include"
1984 ":" (getcwd) "/mpfr/src"))
1985 (setenv "LIBRARY_PATH" (string-append glibc "/lib"
1987 (format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
1988 (format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
1991 (define gcc-mesboot1
1993 (inherit gcc-core-mesboot1)
1994 (name "gcc-mesboot1")
2000 (uri (string-append "mirror://gnu/gcc/gcc-"
2001 version "/gcc-g++-" version ".tar.gz"))
2004 "1fqqk5zkmdg4vmqzdmip9i42q6b82i3f6yc0n86n9021cr7ms2k9"))))
2005 ,@(package-native-inputs gcc-core-mesboot1)))
2007 (substitute-keyword-arguments (package-arguments gcc-core-mesboot1)
2008 ((#:configure-flags configure-flags)
2009 `(let ((out (assoc-ref %outputs "out")))
2010 `("--enable-languages=c,c++"
2012 (negate (lambda (x) (string-prefix? "--enable-languages=" x)))
2013 ,configure-flags))))
2015 `(modify-phases ,phases
2016 (add-before 'unpack 'unpack-g++
2018 (let ((source-g++ (assoc-ref %build-inputs "gcc-g++")))
2019 (invoke "tar" "xvf" source-g++))
2023 (setenv "CONFIG_SHELL" (which "sh"))
2025 ;; Allow MPFR headers to be found.
2026 (setenv "C_INCLUDE_PATH"
2027 (string-append (getcwd) "/mpfr/src:"
2028 (getenv "C_INCLUDE_PATH")))
2030 ;; Set the C++ search path so that C headers can be found as
2031 ;; libstdc++ is being compiled.
2032 (setenv "CPLUS_INCLUDE_PATH" (getenv "C_INCLUDE_PATH"))
2035 (define (%boot-mesboot2-inputs)
2036 `(("gcc" ,gcc-mesboot1)
2037 ,@(alist-delete "gcc" (%boot-mesboot1-inputs))))
2040 ;; Finally, we can build xz.
2045 (source (bootstrap-origin
2048 (uri (list (string-append "http://tukaani.org/xz/xz-" version
2050 (string-append "http://multiprecision.org/guix/xz-"
2051 version ".tar.gz")))
2054 "0kf40ggbs1vaaj5s9k4csycahzqcf65n20pa6lngqhm6j0cj3agb")))))
2055 (supported-systems '("i686-linux" "x86_64-linux"))
2058 (propagated-inputs '())
2059 (native-inputs (%boot-mesboot2-inputs))
2061 `(#:implicit-inputs? #f
2062 #:guile ,%bootstrap-guile
2063 #:parallel-build? #f
2065 `("--disable-assembler"
2071 "--disable-lzmainfo"
2072 "--disable-lzma-links"
2076 "--disable-symbol-versions"
2077 ;; configure disqualifies BASH, CPP, GCC and GREP
2078 ;; all of which seem fine for the build
2079 "ac_cv_prog_cc_c99=-std=gnu9x"
2080 "ac_cv_path_GREP=grep"
2081 "gl_cv_posix_shell=bash"
2082 "ac_cv_have_decl_optreset=no"
2083 "CPPFLAGS=-D__GNUC__=1")))))
2085 (define hello-mesboot
2086 ;; Check for Scheme-only bootstrap.
2089 (name "hello-mesboot")
2090 (supported-systems '("i686-linux" "x86_64-linux"))
2092 (propagated-inputs '())
2093 (native-inputs (%boot-mesboot2-inputs))
2095 `(#:implicit-inputs? #f
2096 #:guile ,%bootstrap-guile
2097 #:parallel-build? #f
2098 ;; checking for grep that handles long lines and -e...
2099 ;; configure: error: no acceptable grep could be found
2100 #:configure-flags '("ac_cv_path_GREP=grep")
2102 (modify-phases %standard-phases
2105 (invoke "./hello"))))))))
2107 (define binutils-mesboot
2110 (name "binutils-mesboot")
2112 (source (bootstrap-origin
2115 (uri (string-append "mirror://gnu/binutils/binutils-"
2116 version ".tar.bz2"))
2117 (patches (search-patches "binutils-boot-2.20.1a.patch"))
2120 "0r7dr0brfpchh5ic0z9r4yxqn4ybzmlh25sbp30cacqk8nb7rlvi")))))
2122 (propagated-inputs '())
2123 (native-inputs `(("xz" ,xz-mesboot)
2124 ,@(%boot-mesboot2-inputs)))
2125 (supported-systems '("i686-linux" "x86_64-linux"))
2127 `(#:implicit-inputs? #f
2128 #:guile ,%bootstrap-guile
2129 #:tests? #f ; runtest: command not found
2130 #:parallel-build? #f
2131 #:strip-binaries? #f ; no strip yet
2140 "--build=i686-unknown-linux-gnu"
2141 "--host=i686-unknown-linux-gnu"
2143 ;; checking for grep that handles long lines and -e
2144 "ac_cv_path_GREP=grep")
2145 ;; FIXME: ac_cv_path_GREP=grep doesn't seem to be forwarded to
2146 ;; cascading configure's?
2147 #:make-flags '("ac_cv_path_GREP=grep")
2149 (modify-phases %standard-phases
2150 (add-after 'unpack 'scripted-patch
2152 ;; sed-mesboot0 cannot build these
2153 (copy-file "binutils/Makefile.in" "binutils/Makefile.in.orig")
2154 (substitute* "binutils/Makefile.in"
2155 ;; binutils/binutils uses an amazingly complex install
2156 ;; command, using FOR, SED, READ, IF, ECHO, SED, SED, AWK,
2157 ;; READ, and then LIBTOOL (to do something like
2158 ;; `mkdir $DESTDIR$bindir; cp readline $DESTDIR$bindir ...')
2160 ;; Some tool [debugme!] cannot handle two escaped newlines
2161 ;; (bash?), and the install stops after $(am__EXEEXT_11)
2162 ;; ("objcopy"), so $(am__EXEEXT_13) ("readelf") and others do
2163 ;; not get installed. Remove the stray newline:
2164 (("^\t@BUILD_NLMCONV@ @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ .*") ""))
2165 (substitute* "opcodes/Makefile.in"
2166 (("^SUBDIRS = [.] po") "SUBDIRS = ."))
2167 (substitute* "binutils/Makefile.in"
2168 (("^SUBDIRS = doc po") "SUBDIRS ="))
2169 (substitute* "gas/Makefile.in"
2170 (("^SUBDIRS = doc po") "SUBDIRS ="))
2171 (substitute* "gprof/Makefile.in"
2172 (("^SUBDIRS = po") "SUBDIRS ="))
2173 (substitute* "ld/Makefile.in"
2174 (("^SUBDIRS = po") "SUBDIRS ="))
2177 (define (%boot-mesboot3-inputs)
2178 `(("binutils" ,binutils-mesboot)
2180 ,@(alist-delete "binutils" (%boot-mesboot2-inputs))))
2182 (define glibc-headers-mesboot
2184 (inherit glibc-mesboot0)
2185 (name "glibc-headers-mesboot")
2187 (source (bootstrap-origin
2190 (uri (string-append "mirror://gnu/glibc/glibc-"
2193 (patches (search-patches "glibc-boot-2.16.0.patch"
2194 "glibc-bootstrap-system-2.16.0.patch"))
2197 "0vlz4x6cgz7h54qq4528q526qlhnsjzbsvgc4iizn76cb0bfanx7")))))
2198 (native-inputs `(("headers" ,mesboot-headers)
2199 ,@(%boot-mesboot3-inputs)))
2201 (substitute-keyword-arguments (package-arguments glibc-mesboot0)
2202 ((#:configure-flags configure-flags)
2203 `(let ((out (assoc-ref %outputs "out"))
2204 (headers (assoc-ref %build-inputs "headers")))
2206 (string-append "--prefix=" out)
2207 "--disable-obsolete-rpc"
2208 "--host=i686-unknown-linux-gnu"
2209 (string-append "--with-headers=" headers "/include")
2210 "--enable-static-nss"
2214 "--enable-add-ons=nptl"
2215 ;; avoid: configure: error: confusing output from nm -u
2216 "libc_cv_predef_stack_protector=no")))
2217 ((#:make-flags make-flags)
2218 '(list "install-bootstrap-headers=yes" "install-headers"))
2220 `(modify-phases ,phases
2221 (delete 'apply-boot-patch)
2222 (delete 'fixup-configure)
2225 (lambda* (#:key source #:allow-other-keys)
2226 (invoke "tar" "xvf" source)
2227 (chdir (string-append "glibc-" ,version))
2230 (lambda* (#:key inputs #:allow-other-keys)
2231 (let* ((headers (assoc-ref inputs "headers"))
2232 (libc (assoc-ref inputs "libc"))
2233 (gcc (assoc-ref inputs "gcc"))
2234 (cppflags (string-append
2235 " -I " (getcwd) "/nptl/sysdeps/pthread/bits"
2236 " -D BOOTSTRAP_GLIBC=1"))
2237 (cflags (string-append " -L " (getcwd)
2238 " -L " libc "/lib")))
2239 (setenv "libc_cv_friendly_stddef" "yes")
2240 (setenv "CONFIG_SHELL" (which "sh"))
2241 (setenv "SHELL" (which "sh"))
2243 (setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
2244 (setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags))
2247 ;; avoid -fstack-protector
2248 (setenv "libc_cv_ssp" "false")
2249 (substitute* "configure"
2250 (("/bin/pwd") "pwd"))
2253 (lambda* (#:key outputs make-flags #:allow-other-keys)
2254 (let ((kernel-headers (assoc-ref %build-inputs "kernel-headers"))
2255 (out (assoc-ref outputs "out")))
2256 (and (apply invoke "make" make-flags)
2257 (copy-recursively kernel-headers out)
2260 (lambda* (#:key configure-flags #:allow-other-keys)
2261 (format (current-error-port) "running ../configure ~a\n" (string-join configure-flags))
2264 (apply invoke "../configure" configure-flags)))
2265 (add-after 'configure 'remove-sunrpc
2267 (let* ((out (assoc-ref %outputs "out"))
2268 (bash (assoc-ref %build-inputs "bash"))
2269 (shell (string-append bash "/bin/bash")))
2271 (let ((Makefile (open-file "Makefile" "a")))
2272 (display (string-append "
2278 (substitute* "../Makefile"
2279 (("^SHELL := /bin/sh") (string-append "SHELL := " shell)))
2280 (substitute* "../Makeconfig"
2281 (("^SHELL := /bin/sh") (string-append "SHELL := " shell)))
2282 (substitute* "../elf/Makefile"
2283 (("^SHELL := /bin/sh") (string-append "SHELL := " shell)))
2284 (invoke "make" (string-append (getcwd) "/sysd-sorted" ))
2285 (substitute* "sysd-sorted"
2290 (define glibc-mesboot
2292 (inherit glibc-headers-mesboot)
2293 (name "glibc-mesboot")
2294 (native-inputs `(("headers" ,glibc-headers-mesboot)
2295 ,@(%boot-mesboot3-inputs)))
2297 `(#:validate-runpath? #f ; fails when using --enable-shared
2298 ,@(substitute-keyword-arguments (package-arguments glibc-headers-mesboot)
2299 ((#:make-flags make-flags)
2300 `(let ((bash (assoc-ref %build-inputs "bash")))
2301 (list (string-append "SHELL=" bash "/bin/sh"))))
2303 `(modify-phases ,phases
2305 (lambda* (#:key outputs make-flags #:allow-other-keys)
2306 (let* ((kernel-headers (assoc-ref %build-inputs "kernel-headers"))
2307 (out (assoc-ref outputs "out"))
2308 (install-flags (cons "install" make-flags)))
2309 (and (apply invoke "make" install-flags)
2310 (copy-recursively kernel-headers out)
2313 (define (%boot-mesboot4-inputs)
2314 `(("libc" ,glibc-mesboot)
2315 ,@(alist-delete "libc" (%boot-mesboot3-inputs))))
2317 (define gcc-mesboot1-wrapper
2318 ;; We need this so gcc-mesboot1 can be used to create shared binaries that
2319 ;; have the correct interpreter, otherwise configuring gcc-mesboot using
2320 ;; --enable-shared will fail.
2322 (inherit gcc-mesboot1)
2323 (name "gcc-mesboot1-wrapper")
2326 (native-inputs `(("bash" ,bash-mesboot)
2327 ("coreutils" ,coreutils-mesboot0)
2328 ("libc" ,glibc-mesboot)
2329 ("gcc" ,gcc-mesboot1)))
2331 `(#:implicit-inputs? #f
2332 #:guile ,%bootstrap-guile
2334 (modify-phases %standard-phases
2339 (lambda* (#:key outputs #:allow-other-keys)
2340 (let* ((out (assoc-ref outputs "out"))
2341 (bash (assoc-ref %build-inputs "bash"))
2342 (libc (assoc-ref %build-inputs "libc"))
2343 (gcc (assoc-ref %build-inputs "gcc"))
2344 (bin (string-append out "/bin")))
2348 (let ((wrapper (string-append bin "/" program)))
2349 (with-output-to-file wrapper
2351 (display (string-append "#! " bash "/bin/bash
2352 exec " gcc "/bin/" program
2353 " -Wl,--dynamic-linker"
2354 ;; also for x86_64-linux, we are still on i686-linux
2355 " -Wl," libc ,(glibc-dynamic-linker "i686-linux")
2360 (chmod wrapper #o555)))))
2364 "i686-unknown-linux-gnu-cpp"
2365 "i686-unknown-linux-gnu-gcc"
2366 "i686-unknown-linux-gnu-g++"))
2369 (lambda* (#:key outputs #:allow-other-keys)
2370 (let* ((out (assoc-ref outputs "out"))
2371 (bin (string-append out "/bin"))
2372 (program (string-append bin "/gcc")))
2373 (invoke program "--help")))))))))
2377 (inherit gcc-mesboot1)
2378 (name "gcc-mesboot")
2379 (version (package-version gcc-4.9))
2380 (source (bootstrap-origin (package-source gcc-4.9)))
2381 (native-inputs `(("gcc-wrapper" ,gcc-mesboot1-wrapper)
2382 ("gcc" ,gcc-mesboot1)
2383 ("headers" ,glibc-headers-mesboot)
2384 ,@(%boot-mesboot4-inputs)))
2386 `(#:validate-runpath? #f
2387 ,@(substitute-keyword-arguments (package-arguments gcc-mesboot1)
2388 ((#:configure-flags configure-flags)
2389 `(let ((out (assoc-ref %outputs "out"))
2390 (glibc (assoc-ref %build-inputs "libc")))
2391 (list (string-append "--prefix=" out)
2392 "--build=i686-unknown-linux-gnu"
2393 "--host=i686-unknown-linux-gnu"
2395 "--with-host-libstdcxx=-lsupc++"
2397 (string-append "--with-native-system-header-dir=" glibc "/include")
2398 (string-append "--with-build-sysroot=" glibc "/include")
2400 "--disable-bootstrap"
2401 "--disable-decimal-float"
2402 "--disable-libatomic"
2403 "--disable-libcilkrts"
2406 "--disable-libmudflap"
2407 "--disable-libquadmath"
2408 "--disable-libsanitizer"
2412 "--disable-lto-plugin"
2413 "--disable-multilib"
2416 "--enable-languages=c,c++"
2420 "--enable-threads=single"
2422 ;; No pre-compiled libstdc++ headers, to save space.
2423 "--disable-libstdcxx-pch"
2426 "--disable-build-with-cxx")))
2428 `(modify-phases ,phases
2429 (delete 'apply-boot-patch)
2430 (delete 'unpack-g++) ; sadly, gcc-4.9.4 does not provide
2431 ; modular core/language downloads
2433 (lambda* (#:key outputs #:allow-other-keys)
2434 (let* ((out (assoc-ref outputs "out"))
2435 (binutils (assoc-ref %build-inputs "binutils"))
2436 (bash (assoc-ref %build-inputs "bash"))
2437 (gcc (assoc-ref %build-inputs "gcc"))
2438 (glibc (assoc-ref %build-inputs "libc"))
2439 (kernel-headers (assoc-ref %build-inputs "kernel-headers")))
2440 (setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
2441 (setenv "C_INCLUDE_PATH" (string-append
2442 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/4.6.4/include"
2443 ":" kernel-headers "/include"
2444 ":" glibc "/include"
2445 ":" (getcwd) "/mpfr/src"))
2446 (setenv "CPLUS_INCLUDE_PATH" (string-append
2447 gcc "/lib/gcc-lib/i686-unknown-linux-gnu/4.6.4/include"
2448 ":" kernel-headers "/include"
2449 ":" glibc "/include"
2450 ":" (getcwd) "/mpfr/src"))
2451 (setenv "LIBRARY_PATH" (string-append glibc "/lib"
2453 (format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
2454 (format (current-error-port) "CPLUS_INCLUDE_PATH=~a\n" (getenv "CPLUS_INCLUDE_PATH"))
2455 (format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
2458 (define gcc-mesboot-wrapper
2459 ;; We need this so gcc-mesboot can be used to create shared binaries that
2460 ;; have the correct interpreter and runpath to libc.
2462 (inherit gcc-mesboot1-wrapper)
2463 (name "gcc-mesboot-wrapper")
2464 (version (package-version gcc-mesboot))
2467 (native-inputs `(("bash" ,bash-mesboot)
2468 ("coreutils" ,coreutils-mesboot0)
2469 ("libc" ,glibc-mesboot)
2470 ("gcc" ,gcc-mesboot)))))
2472 (define (%boot-mesboot5-inputs)
2473 `(("gcc-wrapper" ,gcc-mesboot-wrapper)
2474 ("gcc" ,gcc-mesboot)
2475 ,@(fold alist-delete (%boot-mesboot4-inputs) '("gcc" "gcc-wrapper"))))
2477 (define coreutils-mesboot
2480 (name "coreutils-mesboot")
2481 (source (bootstrap-origin (package-source coreutils)))
2482 (native-inputs (%boot-mesboot5-inputs))
2483 (supported-systems '("i686-linux" "x86_64-linux"))
2485 (propagated-inputs '())
2487 `(#:implicit-inputs? #f
2488 #:guile ,%bootstrap-guile
2491 (define (%boot-mesboot6-inputs)
2492 `(("coreutils" ,coreutils-mesboot)
2493 ,@(fold alist-delete (%boot-mesboot5-inputs)
2494 '("coreutils" "kernel-headers"))))
2496 (define (%bootstrap-inputs+toolchain)
2497 ;; The traditional bootstrap-inputs. For the i686-linux, x86_64-linux
2498 ;; Scheme-only bootstrap the actual reduced set with bootstrapped toolchain.
2499 (match (%current-system)
2500 ((or "i686-linux" "x86_64-linux")
2501 (%boot-mesboot6-inputs))
2503 (%bootstrap-inputs))))
2505 (define gnu-make-boot0
2508 (source (bootstrap-origin (package-source gnu-make)))
2511 `(#:guile ,%bootstrap-guile
2512 #:implicit-inputs? #f
2513 #:tests? #f ; cannot run "make check"
2514 ,@(substitute-keyword-arguments (package-arguments gnu-make)
2515 ((#:configure-flags flags ''())
2516 ;; The generated config.status has some problems due to the
2517 ;; bootstrap environment. Disable dependency tracking to work
2519 `(cons "--disable-dependency-tracking" ,flags))
2521 `(modify-phases ,phases
2524 (invoke "./build.sh")))
2526 (lambda* (#:key outputs #:allow-other-keys)
2527 (let* ((out (assoc-ref outputs "out"))
2528 (bin (string-append out "/bin")))
2529 (install-file "make" bin)
2531 (native-inputs '()) ; no need for 'pkg-config'
2532 (inputs (%bootstrap-inputs+toolchain))))
2537 (name "bzip2-boot0")
2540 `(("diffutils" ,diffutils-boot0)
2541 ("make" ,gnu-make-boot0)
2542 ,@(%bootstrap-inputs+toolchain)))
2544 `(#:guile ,%bootstrap-guile
2545 #:implicit-inputs? #f
2546 ,@(package-arguments bzip2)))))
2548 (define coreutils-boot0
2551 (source (bootstrap-origin (package-source coreutils)))
2552 (name "coreutils-boot0")
2555 `(("make" ,gnu-make-boot0)
2556 ,@(%bootstrap-inputs+toolchain)))
2559 #:implicit-inputs? #f
2560 #:guile ,%bootstrap-guile
2561 ,@(package-arguments coreutils)))))
2563 (define diffutils-boot0
2566 (name "diffutils-boot0")
2569 `(("make" ,gnu-make-boot0)
2570 ,@(%bootstrap-inputs+toolchain)))
2572 `(#:tests? #f ; the test suite needs diffutils
2573 #:guile ,%bootstrap-guile
2574 #:implicit-inputs? #f
2575 ,@(match (%current-system)
2576 ((or "arm-linux" "aarch64-linux")
2577 (substitute-keyword-arguments (package-arguments diffutils)
2578 ((#:configure-flags flags ''())
2579 ;; The generated config.status has some problems due to the
2580 ;; bootstrap environment. Disable dependency tracking to work
2582 `(cons "--disable-dependency-tracking" ,flags))))
2585 (define findutils-boot0
2588 (name "findutils-boot0")
2589 (source (bootstrap-origin (package-source findutils)))
2591 `(("make" ,gnu-make-boot0)
2592 ("diffutils" ,diffutils-boot0) ; for tests
2593 ,@(%bootstrap-inputs+toolchain)))
2595 `(#:implicit-inputs? #f
2596 #:guile ,%bootstrap-guile
2598 ;; The build system assumes we have done a mistake when time_t is 32-bit
2599 ;; on a 64-bit system. Ignore that for our bootstrap toolchain.
2600 ,@(substitute-keyword-arguments (package-arguments findutils)
2601 ((#:configure-flags flags ''())
2603 ,(if (target-64bit?)
2604 ''("TIME_T_32_BIT_OK=yes")
2606 ,(match (%current-system)
2607 ((or "arm-linux" "aarch64-linux")
2608 ''("--disable-dependency-tracking"))
2614 (inherit (@ (gnu packages file) file))
2618 ,,@(match (%current-system)
2619 ((or "arm-linux" "aarch64-linux")
2620 '("--disable-dependency-tracking"))
2626 (source (bootstrap-origin (package-source file)))
2629 `(("make" ,gnu-make-boot0)
2630 ,@(%bootstrap-inputs+toolchain)))
2632 `(#:tests? #f ; merge test fails
2633 #:implicit-inputs? #f
2634 #:guile ,%bootstrap-guile
2635 #:configure-flags '("--disable-bzlib")
2636 #:strip-binaries? #f
2637 #:validate-runpath? #f
2638 ,@(package-arguments file)))))
2643 (source (bootstrap-origin (package-source gawk)))
2647 `(("make" ,gnu-make-boot0)
2648 ,@(%bootstrap-inputs+toolchain)))
2651 #:implicit-inputs? #f
2652 #:guile ,%bootstrap-guile
2653 #:strip-binaries? #f
2654 #:validate-runpath? #f))))
2659 (source (bootstrap-origin (package-source patch)))
2660 (name "patch-boot0")
2663 `(("make" ,gnu-make-boot0)
2664 ,@(%bootstrap-inputs+toolchain)))
2666 `(#:tests? #f ; merge test fails
2667 #:implicit-inputs? #f
2668 #:guile ,%bootstrap-guile
2669 #:strip-binaries? #f
2670 #:validate-runpath? #f))))
2676 (source (bootstrap-origin (package-source sed)))
2679 `(("make" ,gnu-make-boot0)
2680 ,@(%bootstrap-inputs+toolchain)))
2682 `(#:implicit-inputs? #f
2684 #:guile ,%bootstrap-guile
2685 ,@(package-arguments sed)))))
2691 (source (bootstrap-origin (package-source tar)))
2694 `(("make" ,gnu-make-boot0)
2695 ,@(%bootstrap-inputs+toolchain)))
2697 `(#:implicit-inputs? #f
2699 #:guile ,%bootstrap-guile
2700 ,@(package-arguments tar)))))
2702 (define (%boot0-inputs)
2703 `(,@(match (%current-system)
2704 ((or "i686-linux" "x86_64-linux")
2705 `(("bzip2" ,bzip2-boot0)
2706 ("coreutils" ,coreutils-boot0)
2707 ("gawk" ,gawk-boot0)
2708 ("patch" ,patch-boot0)
2710 ("tar" ,tar-boot0)))
2712 ("make" ,gnu-make-boot0)
2713 ("diffutils" ,diffutils-boot0)
2714 ("findutils" ,findutils-boot0)
2715 ("file" ,file-boot0)
2716 ,@(%bootstrap-inputs+toolchain)))
2718 (define* (boot-triplet #:optional (system (%current-system)))
2719 ;; Return the triplet used to create the cross toolchain needed in the
2720 ;; first bootstrapping stage.
2721 (nix-system->gnu-triplet system "guix"))
2723 ;; Following Linux From Scratch, build a cross-toolchain in stage 0. That
2724 ;; toolchain actually targets the same OS and arch, but it has the advantage
2725 ;; of being independent of the libc and tools in
2726 ;; (%BOOTSTRAP-INPUTS+TOOLCHAIN), since GCC-BOOT0 (below) is built without any
2727 ;; reference to the target libc.
2729 (define binutils-boot0
2732 (source (bootstrap-origin (package-source binutils)))
2733 (name "binutils-cross-boot0")
2735 `(#:guile ,%bootstrap-guile
2736 #:implicit-inputs? #f
2738 #:modules ((guix build gnu-build-system)
2740 (ice-9 ftw)) ; for 'scandir'
2741 #:phases (modify-phases %standard-phases
2742 (add-after 'install 'add-symlinks
2743 (lambda* (#:key outputs #:allow-other-keys)
2744 ;; The cross-gcc invokes 'as', 'ld', etc, without the
2745 ;; triplet prefix, so add symlinks.
2746 (let ((out (assoc-ref outputs "out"))
2747 (triplet-prefix (string-append ,(boot-triplet) "-")))
2748 (define (has-triplet-prefix? name)
2749 (string-prefix? triplet-prefix name))
2750 (define (remove-triplet-prefix name)
2751 (substring name (string-length triplet-prefix)))
2752 (with-directory-excursion (string-append out "/bin")
2753 (for-each (lambda (name)
2754 (symlink name (remove-triplet-prefix name)))
2755 (scandir "." has-triplet-prefix?)))
2758 ,@(substitute-keyword-arguments (package-arguments binutils)
2759 ((#:configure-flags cf)
2760 `(cons ,(string-append "--target=" (boot-triplet))
2762 (inputs (%boot0-inputs))))
2764 (define libstdc++-boot0
2765 ;; GCC's libcc1 is always built as a shared library (the top-level
2766 ;; 'Makefile.def' forcefully adds --enable-shared) and thus needs to refer
2767 ;; to libstdc++.so. We cannot build libstdc++-5.3 because it relies on
2768 ;; C++14 features missing in some of our bootstrap compilers.
2769 (let ((lib (make-libstdc++ gcc-4.9)))
2772 (source (bootstrap-origin (package-source lib)))
2773 (name "libstdc++-boot0")
2775 `(#:guile ,%bootstrap-guile
2776 #:implicit-inputs? #f
2778 ;; XXX: libstdc++.so NEEDs ld.so for some reason.
2779 #:validate-runpath? #f
2781 ,@(match (%current-system)
2782 ((or "i686-linux" "x86_64-linux")
2783 (substitute-keyword-arguments (package-arguments lib)
2785 `(modify-phases ,phases
2786 (add-after 'unpack 'workaround-wrapper-bug
2787 ;; XXX: The crude gcc-cross-wrapper causes "g++ -v" to
2788 ;; fail, which in turn confuses the configure script.
2790 (substitute* "libstdc++-v3/configure"
2791 (("g\\+\\+ -v") "true"))
2793 (_ (package-arguments lib)))))
2794 (inputs (%boot0-inputs))
2795 (native-inputs '()))))
2800 (name "gcc-cross-boot0")
2801 (source (bootstrap-origin (package-source gcc)))
2803 `(#:guile ,%bootstrap-guile
2804 #:implicit-inputs? #f
2805 #:modules ((guix build gnu-build-system)
2810 ,@(substitute-keyword-arguments (package-arguments gcc)
2811 ((#:configure-flags flags)
2812 `(append (list ,(string-append "--target=" (boot-triplet))
2817 ;; Disable features not needed at this stage.
2819 "--enable-languages=c,c++"
2821 ,@(if (equal? "powerpc64le-linux-gnu" (boot-triplet))
2822 ;; On POWER9 (little endian) glibc needs the
2823 ;; 128-bit long double type.
2824 '("--with-long-double-128")
2827 ;; libstdc++ cannot be built at this stage
2828 ;; ("Link tests are not allowed after
2829 ;; GCC_NO_EXECUTABLES.").
2830 "--disable-libstdc++-v3"
2833 "--disable-libmudflap"
2834 "--disable-libatomic"
2835 "--disable-libsanitizer"
2839 "--disable-libcilkrts"
2842 "--disable-libquadmath"
2843 "--disable-decimal-float")
2844 (remove (cut string-match
2845 "--(with-system-zlib|enable-languages.*)" <>)
2847 ((#:make-flags flags)
2848 `(let* ((libc (assoc-ref %build-inputs "libc"))
2849 (libc-native (or (assoc-ref %build-inputs "libc-native")
2851 `(,(string-append "LDFLAGS="
2852 "-Wl,-rpath=" libc-native "/lib "
2853 "-Wl,-dynamic-linker "
2854 "-Wl," libc-native ,(glibc-dynamic-linker
2855 (match (%current-system)
2856 ("x86_64-linux" "i686-linux")
2857 (_ (%current-system))))))))
2859 `(modify-phases ,phases
2860 (add-after 'unpack 'unpack-gmp&co
2861 (lambda* (#:key inputs #:allow-other-keys)
2862 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
2863 (mpfr (assoc-ref %build-inputs "mpfr-source"))
2864 (mpc (assoc-ref %build-inputs "mpc-source")))
2866 ;; To reduce the set of pre-built bootstrap inputs, build
2867 ;; GMP & co. from GCC.
2868 (for-each (lambda (source)
2869 (invoke "tar" "xvf" source))
2870 (list gmp mpfr mpc))
2872 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
2873 ,@(map (lambda (lib)
2874 ;; Drop trailing letters, as gmp-6.0.0a unpacks
2876 `(symlink ,(string-trim-right
2877 (package-full-name lib "-")
2879 ,(package-name lib)))
2880 (list gmp-6.0 mpfr mpc))
2882 ,(match (%current-system)
2883 ((or "i686-linux" "x86_64-linux")
2884 '(add-before 'configure 'fix-libcc1
2885 (lambda* (#:key inputs #:allow-other-keys)
2886 ;; libcc1.so NEEDs libgcc_s.so, so provide one here
2887 ;; to placate the 'validate-runpath' phase.
2888 (substitute* "libcc1/Makefile.in"
2890 (string-append "la_LDFLAGS = -Wl,-rpath="
2891 (assoc-ref inputs "gcc") "/lib")))
2892 ;; XXX: "g++ -v" is broken (see also libstdc++ above).
2893 (substitute* "libcc1/configure"
2894 (("g\\+\\+ -v") "true"))
2896 (_ '(add-before 'configure 'return-true
2898 (add-after 'install 'symlink-libgcc_eh
2899 (lambda* (#:key outputs #:allow-other-keys)
2900 (let ((out (assoc-ref outputs "lib")))
2901 ;; Glibc wants to link against libgcc_eh, so provide
2903 (with-directory-excursion
2904 (string-append out "/lib/gcc/"
2906 "/" ,(package-version gcc))
2907 (symlink "libgcc.a" "libgcc_eh.a"))
2910 (inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp-6.0)))
2911 ("mpfr-source" ,(bootstrap-origin (package-source mpfr)))
2912 ("mpc-source" ,(bootstrap-origin (package-source mpc)))
2913 ("binutils-cross" ,binutils-boot0)
2915 ;; The libstdc++ that libcc1 links against.
2916 ("libstdc++" ,libstdc++-boot0)
2918 ;; Call it differently so that the builder can check whether
2919 ;; the "libc" input is #f.
2920 ("libc-native" ,@(assoc-ref (%boot0-inputs) "libc"))
2921 ,@(alist-delete "libc" (%boot0-inputs))))
2923 ;; No need for the native-inputs to build the documentation at this stage.
2924 (native-inputs `())))
2930 (source (bootstrap-origin (package-source perl)))
2931 (inputs (%boot0-inputs))
2933 `(#:implicit-inputs? #f
2934 #:guile ,%bootstrap-guile
2935 #:validate-runpath? #f
2937 ;; At the very least, this must not depend on GCC & co.
2938 #:disallowed-references ,(list %bootstrap-binutils)
2940 ,@(substitute-keyword-arguments (package-arguments perl)
2942 `(modify-phases ,phases
2943 ;; Pthread support is missing in the bootstrap compiler
2944 ;; (broken spec file), so disable it.
2945 (add-before 'configure 'disable-pthreads
2947 (substitute* "Configure"
2948 (("^libswanted=(.*)pthread" _ before)
2949 (string-append "libswanted=" before)))
2951 ;; Do not configure with '-Dusethreads' since pthread
2952 ;; support is missing.
2953 ((#:configure-flags configure-flags)
2954 `(delete "-Dusethreads" ,configure-flags)))))))
2960 (source (bootstrap-origin (package-source m4)))
2961 (inputs (%boot0-inputs))
2963 `(#:guile ,%bootstrap-guile
2964 #:implicit-inputs? #f
2965 ,@(package-arguments m4)))))
2968 ;; This Bison is needed to build MiG so we need it early in the process.
2969 ;; Recent versions of Linux-Libre headers also depend on this.
2972 (name "bison-boot0")
2973 (propagated-inputs `(("m4" ,m4-boot0)))
2974 (native-inputs `(("perl" ,perl-boot0)))
2975 (inputs (%boot0-inputs)) ;remove Flex...
2977 `(#:tests? #f ;... and thus disable tests
2978 #:implicit-inputs? #f
2979 #:guile ,%bootstrap-guile
2981 ;; Zero timestamps in liby.a; this must be done
2982 ;; explicitly here because the bootstrap Binutils don't
2983 ;; do that (default is "cru".)
2984 #:make-flags `("ARFLAGS=crD"
2985 ,,(match (%current-system)
2986 ;; ranlib: '-D': No such file
2987 ((or "i686-linux" "x86_64-linux")
2990 "RANLIB=ranlib -D"))
2993 ,@(package-arguments bison)))))
2996 ;; This Flex is needed to build MiG as well as Linux-Libre headers.
2999 (native-inputs `(("bison" ,bison-boot0)))
3000 (propagated-inputs `(("m4" ,m4-boot0)))
3001 (inputs (%boot0-inputs))
3003 `(#:implicit-inputs? #f
3004 #:guile ,%bootstrap-guile
3010 (native-inputs `(("perl" ,perl-boot0)))
3011 (inputs (%boot0-inputs))
3013 `(#:implicit-inputs? #f
3014 #:guile ,%bootstrap-guile))))
3016 (define-syntax define/system-dependent
3018 "Bind IDENTIFIER to EXP, where the value of EXP is known to depend on
3019 '%current-system'. The definition ensures that (1) EXP is \"thunked\" so that
3020 it sees the right value of '%current-system', and (2) that its result is
3021 memoized as a function of '%current-system'."
3024 (with-syntax ((memoized (datum->syntax #'identifier
3026 (syntax->datum #'identifier)
3030 (mlambda (system) exp))
3031 (define-syntax identifier
3032 (identifier-syntax (memoized (%current-system))))))))))
3034 (define/system-dependent linux-libre-headers-boot0
3035 ;; Note: this is wrapped in a thunk to nicely handle circular dependencies
3036 ;; between (gnu packages linux) and this module. Additionally, memoize
3037 ;; the result to play well with further memoization and code that relies
3038 ;; on pointer identity; see <https://bugs.gnu.org/30155>.
3040 (inherit linux-libre-headers)
3042 `(#:guile ,%bootstrap-guile
3043 #:implicit-inputs? #f
3044 ,@(package-arguments linux-libre-headers)))
3046 `(("perl" ,perl-boot0)
3048 ;; Flex and Bison are required since version 4.16.
3049 ("flex" ,flex-boot0)
3050 ("bison" ,bison-boot0)
3052 ;; Rsync is required since version 5.3.
3053 ("rsync" ,rsync-boot0)
3054 ,@(%boot0-inputs)))))
3057 (package-with-explicit-inputs %boot0-inputs
3060 (define gnumach-headers-boot0
3062 (package-with-bootstrap-guile
3064 (inherit gnumach-headers)
3065 (version "1.8-116-g28b53508")
3066 (source (bootstrap-origin
3069 (uri (string-append "https://lilypond.org/janneke/hurd/"
3070 "gnumach-" version ".tar.gz"))
3073 "006i0zgwy81vxarpfm12vip4q6i5mgmi5mmy5ldvxp5hx9h3l0zg")))))
3074 (native-inputs '())))))
3077 (let* ((mig (package
3078 (inherit (package-with-bootstrap-guile mig))
3079 (native-inputs `(("bison" ,bison-boot0)
3080 ("flex" ,flex-boot0)))
3081 (inputs `(("flex" ,flex-boot0)))
3084 `(,(string-append "LDFLAGS=-Wl,-rpath="
3085 (assoc-ref %build-inputs "flex") "/lib/")))))))
3088 (define hurd-version-boot0 "0.9-229-ga1efcee8")
3089 (define hurd-source-boot0
3090 (let ((version hurd-version-boot0))
3094 (uri (string-append "https://lilypond.org/janneke/hurd/"
3095 "hurd-v" version ".tar.gz"))
3098 "0bq2q2jisxcy0kgcm6rz0z2fddwxxm7azsama7li28a2m08kdpzy"))))))
3100 (define hurd-headers-boot0
3101 (let ((hurd-headers (package (inherit hurd-headers)
3102 (version hurd-version-boot0)
3103 (source hurd-source-boot0)
3104 (native-inputs `(("mig" ,mig-boot0)))
3106 (with-boot0 (package-with-bootstrap-guile hurd-headers))))
3108 (define hurd-minimal-boot0
3109 (let ((hurd-minimal (package (inherit hurd-minimal)
3110 (version hurd-version-boot0)
3111 (source hurd-source-boot0)
3112 (native-inputs `(("mig" ,mig-boot0)))
3114 (with-boot0 (package-with-bootstrap-guile hurd-minimal))))
3116 (define/system-dependent hurd-core-headers-boot0
3117 ;; Return the Hurd and Mach headers as well as initial Hurd libraries for
3118 ;; the bootstrap environment.
3119 (package (inherit (package-with-bootstrap-guile hurd-core-headers))
3120 (arguments `(#:guile ,%bootstrap-guile
3121 ,@(package-arguments hurd-core-headers)))
3123 `(("gnumach-headers" ,gnumach-headers-boot0)
3124 ("hurd-headers" ,hurd-headers-boot0)
3125 ("hurd-minimal" ,hurd-minimal-boot0)
3126 ,@(%boot0-inputs)))))
3128 (define* (kernel-headers-boot0 #:optional (system (%current-system)))
3130 ("i586-gnu" hurd-core-headers-boot0)
3131 (_ linux-libre-headers-boot0)))
3133 (define texinfo-boot0
3134 ;; Texinfo used to build libc's manual.
3135 ;; We build without ncurses because it fails to build at this stage, and
3136 ;; because we don't need the stand-alone Info reader.
3137 ;; Also, use (%BOOT0-INPUTS) to avoid building Perl once more.
3141 (inputs `(,@(%boot0-inputs)
3142 ("perl" ,perl-boot0)))
3144 `(#:implicit-inputs? #f
3145 #:guile ,%bootstrap-guile
3147 ;; Some of Texinfo 6.1's tests would fail with "Couldn't set UTF-8
3148 ;; character type in locale" but we don't have a UTF-8 locale at this
3149 ;; stage, so skip them.
3152 (define expat-sans-tests
3155 (inputs (%boot0-inputs))
3157 ;; XXX: Linking 'runtestscpp' fails with things like:
3159 ;; ld: Dwarf Error: found dwarf version '3789', this reader only handles version 2 and 3 information.
3161 ;; Skip tests altogether.
3162 `(#:implicit-inputs? #f
3163 #:guile ,%bootstrap-guile
3165 ,@(substitute-keyword-arguments (package-arguments expat)
3166 ((#:configure-flags flags ''())
3167 ;; Since we're not passing the right -Wl,-rpath flags, build the
3168 ;; static library to avoid RUNPATH validation failure.
3169 `(cons "--disable-shared" ,flags))
3170 ((#:tests? _ #f) #f))))))
3172 (define python-boot0
3174 (inherit python-minimal)
3175 ;; We cannot use Python 3.7 and later here, because they require
3176 ;; pthreads, which is missing on non-x86 platforms at this stage.
3177 ;; Python 3.6 technically supports being built without threading
3178 ;; support, but requires additional patches.
3180 (source (bootstrap-origin
3183 (uri (string-append "https://www.python.org/ftp/python/"
3184 version "/Python-" version ".tar.xz"))
3187 "0jdh9pvx6m6lfz2liwvvhn7vks7qrysqgwn517fkpxb77b33fjn2"))
3188 (modules '((guix build utils)))
3191 ;; Delete the bundled copy of libexpat.
3192 (delete-file-recursively "Modules/expat")
3193 (substitute* "Modules/Setup.dist"
3194 ;; Link Expat instead of embedding the bundled one.
3195 (("^#pyexpat.*") "pyexpat pyexpat.c -lexpat\n"))
3199 ("expat" ,expat-sans-tests))) ;remove OpenSSL, zlib, etc.
3200 (native-inputs '()) ;and pkg-config
3202 `(#:implicit-inputs? #f
3203 #:guile ,%bootstrap-guile
3205 ,@(substitute-keyword-arguments (package-arguments python-minimal)
3206 ;; Disable features that cannot be built at this stage.
3207 ((#:configure-flags _ ''())
3208 `(list "--without-ensurepip"
3209 "--without-threads"))
3210 ;; Clear #:make-flags, such that changes to the regular
3211 ;; Python package won't interfere with this one.
3212 ((#:make-flags _ ''()) ''())
3214 ;; Remove the 'apply-alignment-patch' phase if present to avoid
3215 ;; rebuilding this package. TODO: for the next rebuild cycle,
3216 ;; consider inlining all the arguments instead of inheriting to
3217 ;; make it easier to patch Python without risking a full rebuild.
3218 ;; Or better yet, change to 'python-on-guile'.
3219 `(modify-phases ,@(list (match phases
3220 (('modify-phases original-phases
3222 ('add-after unpack apply-alignment-patch _))
3223 `(modify-phases ,original-phases ,@changes))
3225 (add-before 'configure 'disable-modules
3227 (substitute* "setup.py"
3228 ;; Disable ctypes, since it requires libffi.
3229 (("extensions\\.append\\(ctypes\\)") "")
3230 ;; Prevent the 'ossaudiodev' extension from being
3231 ;; built, since it requires Linux headers.
3235 ,@(if (hurd-system?)
3236 `((add-before 'build 'fix-regen
3237 (lambda* (#:key inputs #:allow-other-keys)
3238 (let ((libc (assoc-ref inputs "libc")))
3239 (substitute* "Lib/plat-generic/regen"
3240 (("/usr/include/") (string-append libc "/include/")))
3243 ((#:tests? _ #f) #f))))))
3245 (define/system-dependent ld-wrapper-boot0
3246 ;; The first 'ld' wrapper, defined with 'define/system-dependent' because
3247 ;; its calls '%boot0-inputs', whose result depends on (%current-system)
3249 ;; We need this so binaries on Hurd will have libmachuser and libhurduser
3250 ;; in their RUNPATH, otherwise validate-runpath will fail.
3251 (make-ld-wrapper "ld-wrapper-boot0"
3252 #:target boot-triplet
3253 #:binutils binutils-boot0
3254 #:guile %bootstrap-guile
3255 #:bash (car (assoc-ref (%boot0-inputs) "bash"))
3256 #:guile-for-build %bootstrap-guile))
3258 (define (%boot1-inputs)
3259 ;; 2nd stage inputs.
3260 `(("gcc" ,gcc-boot0)
3261 ("ld-wrapper-cross" ,ld-wrapper-boot0)
3262 ("binutils-cross" ,binutils-boot0)
3263 ,@(alist-delete "binutils" (%boot0-inputs))))
3265 (define glibc-final-with-bootstrap-bash
3266 ;; The final libc, "cross-built". If everything went well, the resulting
3267 ;; store path has no dependencies. Actually, the really-final libc is
3268 ;; built just below; the only difference is that this one uses the
3272 (name "glibc-intermediate")
3273 (source (bootstrap-origin (package-source glibc)))
3275 `(#:guile ,%bootstrap-guile
3276 #:implicit-inputs? #f
3278 ,@(substitute-keyword-arguments (package-arguments glibc)
3279 ((#:configure-flags flags)
3280 `(append (list ,(string-append "--host=" (boot-triplet))
3281 ,(string-append "--build="
3282 (nix-system->gnu-triplet))
3283 ,(if (hurd-system?) "--disable-werror"
3287 `(modify-phases ,phases
3288 (add-before 'configure 'pre-configure
3289 (lambda* (#:key inputs #:allow-other-keys)
3290 ;; Don't clobber CPATH with the bootstrap libc.
3291 (setenv "NATIVE_CPATH" (getenv "CPATH"))
3294 ;; Tell 'libpthread' where to find 'libihash' on Hurd systems.
3295 ,@(if (hurd-system?)
3296 '((substitute* '("sysdeps/mach/Makefile"
3297 "sysdeps/mach/hurd/Makefile")
3298 (("LDLIBS-pthread.so =.*")
3299 (string-append "LDLIBS-pthread.so = "
3300 (assoc-ref %build-inputs "kernel-headers")
3301 "/lib/libihash.a\n"))))
3304 ;; 'rpcgen' needs native libc headers to be built.
3305 (substitute* "sunrpc/Makefile"
3306 (("sunrpc-CPPFLAGS =.*" all)
3307 (string-append "CPATH = $(NATIVE_CPATH)\n"
3311 (propagated-inputs `(("kernel-headers" ,(kernel-headers-boot0))))
3313 `(("bison" ,bison-boot0)
3314 ("texinfo" ,texinfo-boot0)
3315 ("perl" ,perl-boot0)
3316 ("python" ,python-boot0)))
3318 `( ;; The boot inputs. That includes the bootstrap libc. We don't want
3319 ;; it in $CPATH, hence the 'pre-configure' phase above.
3322 ;; A native MiG is needed to build Glibc on Hurd.
3323 ,@(if (hurd-system?)
3324 `(("mig" ,mig-boot0))
3327 ;; A native GCC is needed to build `cross-rpcgen'.
3328 ("native-gcc" ,@(assoc-ref (%boot0-inputs) "gcc"))
3330 ;; Here, we use the bootstrap Bash, which is not satisfactory
3331 ;; because we don't want to depend on bootstrap tools.
3332 ("static-bash" ,@(assoc-ref (%boot0-inputs) "bash"))))))
3334 (define (cross-gcc-wrapper gcc binutils glibc bash)
3335 "Return a wrapper for the pseudo-cross toolchain GCC/BINUTILS/GLIBC
3336 that makes it available under the native tool names."
3337 (package (inherit gcc)
3338 (name (string-append (package-name gcc) "-wrapped"))
3340 (build-system trivial-build-system)
3343 `(#:guile ,%bootstrap-guile
3344 #:modules ((guix build utils))
3346 (use-modules (guix build utils))
3348 (let* ((binutils (assoc-ref %build-inputs "binutils"))
3349 (gcc (assoc-ref %build-inputs "gcc"))
3350 (libc (assoc-ref %build-inputs "libc"))
3351 (bash (assoc-ref %build-inputs "bash"))
3352 (out (assoc-ref %outputs "out"))
3353 (bindir (string-append out "/bin"))
3354 (triplet ,(boot-triplet)))
3355 (define (wrap-program program)
3356 ;; GCC-BOOT0 is a libc-less cross-compiler, so it
3357 ;; needs to be told where to find the crt files and
3358 ;; the dynamic linker.
3359 (call-with-output-file program
3361 (format p "#!~a/bin/bash
3362 exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
3366 ,(glibc-dynamic-linker))))
3368 (chmod program #o555))
3371 (with-directory-excursion bindir
3372 (for-each (lambda (tool)
3373 (symlink (string-append binutils "/bin/"
3377 (for-each wrap-program '("gcc" "g++")))
3381 `(("binutils" ,binutils)
3387 (define/system-dependent gcc-boot0-intermediate-wrapped
3388 ;; Make the cross-tools GCC-BOOT0 and BINUTILS-BOOT0 available under the
3390 (cross-gcc-wrapper gcc-boot0 binutils-boot0
3391 glibc-final-with-bootstrap-bash
3392 (car (assoc-ref (%boot1-inputs) "bash"))))
3394 (define static-bash-for-glibc
3395 ;; A statically-linked Bash to be used by GLIBC-FINAL in system(3) & co.
3397 (inherit static-bash)
3398 (source (bootstrap-origin (package-source static-bash)))
3399 (inputs `(("gcc" ,gcc-boot0-intermediate-wrapped)
3400 ("libc" ,glibc-final-with-bootstrap-bash)
3401 ("libc:static" ,glibc-final-with-bootstrap-bash "static")
3402 ,@(fold alist-delete (%boot1-inputs)
3405 `(#:implicit-inputs? #f
3406 #:guile ,%bootstrap-guile
3408 ,@(substitute-keyword-arguments (package-arguments static-bash)
3409 ((#:configure-flags flags '())
3410 ;; Add a '-L' flag so that the pseudo-cross-ld of
3411 ;; BINUTILS-BOOT0 can find libc.a.
3413 (list (string-append "LDFLAGS=-static -L"
3414 (assoc-ref %build-inputs
3418 (define gettext-boot0
3419 ;; A minimal gettext used during bootstrap.
3421 (inherit gettext-minimal)
3422 (name "gettext-boot0")
3423 ;; Newer versions of GNU gettext depends on libxml2 and ncurses. To
3424 ;; simplify the dependency chain, we stick to this version here.
3425 (version "0.19.8.1")
3428 (uri (string-append "mirror://gnu/gettext/gettext-"
3432 "0hsw28f9q9xaggjlsdp2qmbp2rbd1mp0njzan2ld9kiqwkq2m57z"))))
3433 (inputs (%boot1-inputs)) ;zero dependencies
3435 `(#:implicit-inputs? #f
3436 #:guile ,%bootstrap-guile
3438 #:phases (modify-phases %standard-phases
3439 ;; Build only the tools.
3440 (add-after 'unpack 'chdir
3442 (chdir "gettext-tools")
3445 ;; Some test programs require pthreads, which we don't have.
3446 (add-before 'configure 'no-test-programs
3448 (substitute* "tests/Makefile.in"
3454 ;; The final glibc, which embeds the statically-linked Bash built above.
3455 ;; Use 'package/inherit' so we get the 'replacement' of 'glibc', if any.
3459 (source (bootstrap-origin (package-source glibc)))
3460 (inputs `(("static-bash" ,static-bash-for-glibc)
3463 (package-inputs glibc-final-with-bootstrap-bash))))
3465 ;; This time we need 'msgfmt' to install all the libc.mo files.
3466 (native-inputs `(,@(package-native-inputs glibc-final-with-bootstrap-bash)
3467 ("gettext" ,gettext-boot0)))
3470 (package-propagated-inputs glibc-final-with-bootstrap-bash))
3472 ;; The final libc only refers to itself, but the 'debug' output contains
3473 ;; references to GCC-BOOT0 and to the Linux headers. XXX: Would be great
3474 ;; if 'allowed-references' were per-output.
3476 `(#:allowed-references
3478 ,(kernel-headers-boot0)
3479 ,static-bash-for-glibc
3480 ,@(if (hurd-system?)
3481 `(,gnumach-headers-boot0
3482 ,hurd-headers-boot0)
3484 ,@(package-outputs glibc-final-with-bootstrap-bash))
3485 ,@(package-arguments glibc-final-with-bootstrap-bash)))))
3487 (define/system-dependent gcc-boot0-wrapped
3488 ;; Make the cross-tools GCC-BOOT0 and BINUTILS-BOOT0 available under the
3490 (cross-gcc-wrapper gcc-boot0 binutils-boot0 glibc-final
3491 (car (assoc-ref (%boot1-inputs) "bash"))))
3493 (define (%boot2-inputs)
3494 ;; 3rd stage inputs.
3495 `(("libc" ,glibc-final)
3496 ("libc:static" ,glibc-final "static")
3497 ("gcc" ,gcc-boot0-wrapped)
3498 ,@(fold alist-delete (%boot1-inputs) '("libc" "gcc" "linux-libre-headers"))))
3500 (define binutils-final
3503 (source (bootstrap-origin (package-source binutils)))
3505 `(#:guile ,%bootstrap-guile
3506 #:implicit-inputs? #f
3507 #:allowed-references ("out" ,glibc-final)
3508 ,@(package-arguments binutils)))
3509 (inputs (%boot2-inputs))))
3512 ;; Intermediate libstdc++ that will allow us to build the final GCC
3513 ;; (remember that GCC-BOOT0 cannot build libstdc++.)
3514 (let ((lib (make-libstdc++ gcc)))
3517 (source (bootstrap-origin (package-source lib)))
3519 `(#:guile ,%bootstrap-guile
3520 #:implicit-inputs? #f
3521 #:allowed-references ("out")
3523 ;; XXX: libstdc++.so NEEDs ld.so for some reason.
3524 #:validate-runpath? #f
3526 ;; All of the package arguments from 'make-libstdc++
3527 ;; except for the configure-flags.
3528 ,@(package-arguments lib)
3529 #:configure-flags `("--disable-shared"
3530 "--disable-libstdcxx-dual-abi"
3531 "--disable-libstdcxx-threads"
3532 "--disable-libstdcxx-pch"
3533 ,(string-append "--with-gxx-include-dir="
3534 (assoc-ref %outputs "out")
3537 (inputs (%boot2-inputs))
3538 (synopsis "GNU C++ standard library (intermediate)"))))
3541 ;; Zlib used by GCC-FINAL.
3545 `(#:guile ,%bootstrap-guile
3546 #:implicit-inputs? #f
3547 #:allowed-references ("out" ,glibc-final)
3548 ,@(package-arguments zlib)))
3549 (inputs (%boot2-inputs))))
3551 (define/system-dependent ld-wrapper-boot3
3552 ;; A linker wrapper that uses the bootstrap Guile.
3553 (make-ld-wrapper "ld-wrapper-boot3"
3554 #:binutils binutils-final
3555 #:guile %bootstrap-guile
3556 #:bash (car (assoc-ref (%boot2-inputs) "bash"))
3557 #:guile-for-build %bootstrap-guile))
3561 (package (inherit gcc-boot0)
3564 ;; XXX: Currently #:allowed-references applies to all the outputs but the
3565 ;; "debug" output contains disallowed references, notably
3566 ;; linux-libre-headers. Disable the debugging output to work around that.
3567 (outputs (delete "debug" (package-outputs gcc-boot0)))
3570 `(#:guile ,%bootstrap-guile
3571 #:implicit-inputs? #f
3573 #:allowed-references ("out" "lib" ,zlib-final
3574 ,glibc-final ,static-bash-for-glibc)
3576 ;; Things like libasan.so and libstdc++.so NEED ld.so for some
3577 ;; reason, but it is not in their RUNPATH. This is a false
3578 ;; positive, so turn it off.
3579 #:validate-runpath? #f
3581 ,@(substitute-keyword-arguments (package-arguments gcc)
3582 ((#:make-flags flags)
3583 ;; Since $LIBRARY_PATH is not honored, add the relevant flags.
3584 `(let ((zlib (assoc-ref %build-inputs "zlib")))
3586 (if (string-prefix? "LDFLAGS=" flag)
3587 (string-append flag " -L"
3588 (assoc-ref %build-inputs "libstdc++")
3589 "/lib -L" zlib "/lib -Wl,-rpath="
3593 ;; Build again GMP & co. within GCC's build process, because it's hard
3594 ;; to do outside (because GCC-BOOT0 is a cross-compiler, and thus
3595 ;; doesn't honor $LIBRARY_PATH, which breaks `gnu-build-system'.)
3597 `(modify-phases ,phases
3598 (add-after 'unpack 'unpack-gmp&co
3599 (lambda* (#:key inputs #:allow-other-keys)
3600 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
3601 (mpfr (assoc-ref %build-inputs "mpfr-source"))
3602 (mpc (assoc-ref %build-inputs "mpc-source")))
3604 ;; To reduce the set of pre-built bootstrap inputs, build
3605 ;; GMP & co. from GCC.
3606 (for-each (lambda (source)
3607 (invoke "tar" "xvf" source))
3608 (list gmp mpfr mpc))
3610 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
3611 ,@(map (lambda (lib)
3612 ;; Drop trailing letters, as gmp-6.0.0a unpacks
3614 `(symlink ,(string-trim-right
3615 (package-full-name lib "-")
3617 ,(package-name lib)))
3618 (list gmp-6.0 mpfr mpc))
3621 ;; This time we want Texinfo, so we get the manual. Add
3622 ;; STATIC-BASH-FOR-GLIBC so that it's used in the final shebangs of
3623 ;; scripts such as 'mkheaders' and 'fixinc.sh' (XXX: who cares about these
3625 (native-inputs `(("texinfo" ,texinfo-boot0)
3626 ("perl" ,perl-boot0) ;for manpages
3627 ("static-bash" ,static-bash-for-glibc)
3628 ,@(package-native-inputs gcc-boot0)))
3630 (inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp-6.0)))
3631 ("mpfr-source" ,(package-source mpfr))
3632 ("mpc-source" ,(package-source mpc))
3633 ("ld-wrapper" ,ld-wrapper-boot3)
3634 ("binutils" ,binutils-final)
3635 ("libstdc++" ,libstdc++)
3636 ("zlib" ,zlib-final)
3637 ,@(%boot2-inputs)))))
3639 (define (%boot3-inputs)
3640 ;; 4th stage inputs.
3641 `(("gcc" ,gcc-final)
3642 ("ld-wrapper" ,ld-wrapper-boot3)
3643 ,@(alist-delete "gcc" (%boot2-inputs))))
3646 ;; Link with `-static-libgcc' to make sure we don't retain a reference
3647 ;; to the bootstrap GCC. Use "bash-minimal" to avoid an extra dependency
3648 ;; on Readline and ncurses.
3649 (let ((bash (static-libgcc-package bash-minimal)))
3652 (source (bootstrap-origin (package-source bash)))
3653 (inputs (%boot3-inputs))
3655 `(#:implicit-inputs? #f
3656 #:guile ,%bootstrap-guile
3658 #:disallowed-references ,(assoc-ref (%boot3-inputs) "coreutils&co")
3660 ,@(package-arguments bash))))))
3662 (define (%boot4-inputs)
3663 ;; Now use the final Bash.
3664 `(("bash" ,bash-final)
3665 ,@(alist-delete "bash" (%boot3-inputs))))
3668 (package-with-explicit-inputs %boot4-inputs %bootstrap-guile))
3670 (define-public guile-final
3671 ;; This package must be public because other modules refer to it. However,
3672 ;; mark it as hidden so that 'fold-packages' ignores it.
3673 (with-boot4 (hidden-package
3674 (package-with-bootstrap-guile guile-3.0/fixed))))
3676 (define glibc-utf8-locales-final
3677 ;; Now that we have GUILE-FINAL, build the UTF-8 locales. They are needed
3678 ;; by the build processes afterwards so their 'scm_to_locale_string' works
3679 ;; with the full range of Unicode codepoints (remember
3680 ;; 'scm_to_locale_string' is called every time a string is passed to a C
3683 (inherit glibc-utf8-locales)
3685 `(("glibc" ,glibc-final)
3686 ("gzip" ,(with-boot4 gzip))))))
3688 (define-public ld-wrapper
3689 ;; The final 'ld' wrapper, which uses the final Guile and Binutils.
3690 (make-ld-wrapper "ld-wrapper"
3691 #:binutils binutils-final
3695 (define (%boot5-inputs)
3696 ;; Now with UTF-8 locales. Remember that the bootstrap binaries were built
3697 ;; with an older libc, which cannot load the new locale format. See
3698 ;; <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
3699 `(("locales" ,glibc-utf8-locales-final)
3703 (package-with-explicit-inputs %boot5-inputs))
3705 (define gnu-make-final
3706 ;; The final GNU Make, which uses the final Guile.
3707 (let ((pkg-config (package
3708 (inherit %pkg-config) ;the native pkg-config
3709 (inputs `(("guile" ,guile-final)
3712 `(#:implicit-inputs? #f
3713 ,@(package-arguments pkg-config))))))
3715 (inherit (package-with-bootstrap-guile gnu-make))
3716 (inputs `(("guile" ,guile-final)
3718 (native-inputs `(("pkg-config" ,pkg-config)))
3720 `(#:implicit-inputs? #f
3721 ,@(package-arguments gnu-make))))))
3724 (define coreutils-final
3725 ;; The final Coreutils. Treat them specially because some packages, such as
3726 ;; Findutils, keep a reference to the Coreutils they were built with.
3727 (with-boot5 (package-with-bootstrap-guile
3729 (inherit coreutils-minimal)
3730 (name "coreutils")))
3731 ;; Use the final Guile, linked against the
3732 ;; final libc with working iconv, so that
3733 ;; 'substitute*' works well when touching
3734 ;; test files in Gettext.
3738 ;; The final grep. Gzip holds a reference to it (via zgrep), so it must be
3739 ;; built before gzip.
3740 (let ((grep (with-boot5 (package-with-bootstrap-guile grep))))
3741 (package/inherit grep
3742 (inputs (alist-delete "pcre" (package-inputs grep)))
3743 (native-inputs `(("perl" ,perl-boot0))))))
3745 (define (%boot6-inputs)
3746 ;; Now use the final Coreutils.
3747 `(("coreutils" ,coreutils-final)
3748 ("grep" ,grep-final)
3752 (package-with-explicit-inputs %boot6-inputs))
3756 (let ((sed (with-boot6 (package-with-bootstrap-guile sed))))
3757 (package/inherit sed (native-inputs `(("perl" ,perl-boot0))))))
3759 (define-public %final-inputs
3760 ;; Final derivations used as implicit inputs by 'gnu-build-system'. We
3761 ;; still use 'package-with-bootstrap-guile' so that the bootstrap tools are
3762 ;; used for origins that have patches, thereby avoiding circular
3764 (let ((finalize (compose with-boot6
3765 package-with-bootstrap-guile)))
3766 `(,@(map (match-lambda
3768 (list name (finalize package))))
3774 ("diffutils" ,diffutils)
3776 ("findutils" ,findutils)
3779 ("grep" ,grep-final)
3780 ("coreutils" ,coreutils-final)
3781 ("make" ,gnu-make-final)
3782 ("bash" ,bash-final)
3783 ("ld-wrapper" ,ld-wrapper)
3784 ("binutils" ,binutils-final)
3786 ("libc" ,glibc-final)
3787 ("libc:static" ,glibc-final "static")
3788 ("locales" ,glibc-utf8-locales-final))))
3790 (define-public canonical-package
3791 (let ((name->package (fold (lambda (input result)
3793 ((_ package . outputs)
3794 (vhash-cons (package-full-name package)
3797 `(("guile" ,guile-final)
3800 "Return the 'canonical' variant of PACKAGE---i.e., if PACKAGE is one of
3801 the implicit inputs of 'gnu-build-system', return that one, otherwise return
3804 The goal is to avoid duplication in cases like GUILE-FINAL vs. GUILE-2.2,
3805 COREUTILS-FINAL vs. COREUTILS, etc."
3806 ;; XXX: This doesn't handle dependencies of the final inputs, such as
3807 ;; libunistring, GMP, etc.
3808 (match (vhash-assoc (package-full-name package) name->package)
3810 ;; In general we want CANON, except if we're cross-compiling: CANON
3811 ;; uses explicit inputs, so it is "anchored" in the bootstrapped
3812 ;; process, with dependencies on things that cannot be
3814 (if (%current-target-system)
3824 ;; Using the following procedure, a gcc toolchain targeting glibc-2.27 can be
3825 ;; instantiated like this:
3827 ;; (define-public gcc-glibc-2.27-toolchain
3828 ;; (make-gcc-toolchain gcc glibc-2.27))
3830 (define* (make-gcc-toolchain gcc
3833 "Return a complete toolchain for GCC. If LIBC is specified, target that libc."
3834 (let ((gcc (if libc (make-gcc-libc gcc libc) gcc))
3835 (libc (if libc libc glibc-final)))
3837 (name (string-append (package-name gcc) "-toolchain"))
3838 (version (package-version gcc))
3840 (build-system trivial-build-system)
3842 '(#:modules ((guix build union))
3844 (use-modules (ice-9 match)
3849 (let ((out (assoc-ref %outputs "out")))
3851 (filter-map (match-lambda
3852 (("libc-debug" . _) #f)
3853 (("libc-static" . _) #f)
3854 ((_ . directory) directory))
3857 (union-build (assoc-ref %outputs "debug")
3858 (list (assoc-ref %build-inputs
3860 (union-build (assoc-ref %outputs "static")
3861 (list (assoc-ref %build-inputs
3865 (native-search-paths
3866 (append (package-native-search-paths gcc)
3867 (package-native-search-paths libc))) ;GUIX_LOCPATH
3869 (append (package-search-paths gcc)
3870 (package-search-paths libc)))
3872 (license (package-license gcc))
3873 (synopsis "Complete GCC tool chain for C/C++ development")
3875 "This package provides a complete GCC tool chain for C/C++ development to
3876 be installed in user profiles. This includes GCC, as well as libc (headers and
3877 binaries, plus debugging symbols in the @code{debug} output), and Binutils. GCC
3878 is the GNU Compiler Collection.")
3879 (home-page "https://gcc.gnu.org/")
3880 (outputs '("out" "debug" "static"))
3882 ;; The main raison d'être of this "meta-package" is (1) to conveniently
3883 ;; install everything that we need, and (2) to make sure ld-wrapper comes
3884 ;; before Binutils' ld in the user's profile.
3885 (inputs `(("gcc" ,gcc)
3886 ("ld-wrapper" ,(car (assoc-ref %final-inputs "ld-wrapper")))
3887 ("binutils" ,binutils-final)
3889 ("libc-debug" ,libc "debug")
3890 ("libc-static" ,libc "static"))))))
3892 (define-public gcc-toolchain
3893 (make-gcc-toolchain gcc-final))
3895 (define-public gcc-toolchain-4.8
3896 (make-gcc-toolchain gcc-4.8))
3898 (define-public gcc-toolchain-4.9
3899 (make-gcc-toolchain gcc-4.9))
3901 (define-public gcc-toolchain-5
3902 (make-gcc-toolchain gcc-5))
3904 (define-public gcc-toolchain-6
3905 (make-gcc-toolchain gcc-6))
3907 (define-public gcc-toolchain-7
3910 (define-public gcc-toolchain-8
3911 (make-gcc-toolchain gcc-8))
3913 (define-public gcc-toolchain-9
3914 (make-gcc-toolchain gcc-9))
3916 (define-public gcc-toolchain-10
3917 (make-gcc-toolchain gcc-10))
3919 (define-public gcc-toolchain-aka-gcc
3920 ;; It's natural for users to try "guix install gcc". This package
3921 ;; automatically "redirects" them to 'gcc-toolchain'.
3922 (deprecated-package "gcc" gcc-toolchain-10))
3925 (define-public gdc-toolchain-10
3926 (package (inherit (make-gcc-toolchain gdc-10))
3927 (synopsis "Complete GCC tool chain for D lang development")
3928 (description "This package provides a complete GCC tool chain for
3929 D lang development to be installed in user profiles. This includes
3930 gdc, as well as libc (headers and binaries, plus debugging symbols
3931 in the @code{debug} output), and binutils.")))
3933 ;; Provide the Fortran toolchain package only for the version of gfortran that
3934 ;; is used by Guix internally to build Fortran libraries, because combining
3935 ;; code compiled with different versions can cause problems.
3937 (define-public gfortran-toolchain
3938 (package (inherit (make-gcc-toolchain gfortran))
3939 (synopsis "Complete GCC tool chain for Fortran development")
3940 (description "This package provides a complete GCC tool chain for
3941 Fortran development to be installed in user profiles. This includes
3942 gfortran, as well as libc (headers and binaries, plus debugging symbols
3943 in the @code{debug} output), and binutils.")))
3946 ;;; commencement.scm ends here