gnu: Add font-mononoki.
[jackhill/guix/guix.git] / gnu / packages / commencement.scm
CommitLineData
bdb36958 1;;; GNU Guix --- Functional package management for GNU
20bf5fce 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
bdb36958
LC
3;;; Copyright © 2014 Andreas Enge <andreas@enge.fr>
4;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org>
13f7f2fd 5;;; Copyright © 2014, 2015, 2017 Mark H Weaver <mhw@netris.org>
809b0a90 6;;; Copyright © 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
53bfec7b 7;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
bdb36958
LC
8;;;
9;;; This file is part of GNU Guix.
10;;;
11;;; GNU Guix is free software; you can redistribute it and/or modify it
12;;; under the terms of the GNU General Public License as published by
13;;; the Free Software Foundation; either version 3 of the License, or (at
14;;; your option) any later version.
15;;;
16;;; GNU Guix is distributed in the hope that it will be useful, but
17;;; WITHOUT ANY WARRANTY; without even the implied warranty of
18;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;;; GNU General Public License for more details.
20;;;
21;;; You should have received a copy of the GNU General Public License
22;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
23
24(define-module (gnu packages commencement)
25 #:use-module ((guix licenses)
26 #:select (gpl3+ lgpl2.0+ public-domain))
b2fd8f63 27 #:use-module (gnu packages)
bdb36958
LC
28 #:use-module (gnu packages bootstrap)
29 #:use-module (gnu packages base)
30 #:use-module (gnu packages bash)
31 #:use-module (gnu packages gcc)
2d5d63d7 32 #:use-module (gnu packages m4)
8efe2a22 33 #:use-module (gnu packages code)
c00a9fbf 34 #:use-module (gnu packages file)
bdb36958 35 #:use-module (gnu packages gawk)
2d5d63d7 36 #:use-module (gnu packages bison)
d75acc29 37 #:use-module (gnu packages flex)
bdb36958 38 #:use-module (gnu packages guile)
6162b95d 39 #:use-module (gnu packages gettext)
bdb36958
LC
40 #:use-module (gnu packages multiprecision)
41 #:use-module (gnu packages compression)
42 #:use-module (gnu packages perl)
43 #:use-module (gnu packages linux)
d75acc29 44 #:use-module (gnu packages hurd)
bdb36958
LC
45 #:use-module (gnu packages texinfo)
46 #:use-module (gnu packages pkg-config)
47 #:use-module (guix packages)
48 #:use-module (guix download)
49 #:use-module (guix build-system gnu)
50 #:use-module (guix build-system trivial)
8102cf0b 51 #:use-module (guix memoization)
bdb36958
LC
52 #:use-module (guix utils)
53 #:use-module (srfi srfi-1)
54 #:use-module (srfi srfi-26)
55 #:use-module (ice-9 vlist)
d75acc29
MR
56 #:use-module (ice-9 match)
57 #:use-module (ice-9 regex))
bdb36958
LC
58
59;;; Commentary:
60;;;
61;;; This is the commencement, this is where things start. Before the
62;;; commencement, of course, there's the 'bootstrap' module, which provides us
63;;; with the initial binaries. This module uses those bootstrap binaries to
64;;; actually build up the whole tool chain that make up the implicit inputs of
65;;; 'gnu-build-system'.
66;;;
67;;; To avoid circular dependencies, this module should not be imported
68;;; directly from anywhere.
69;;;
a1df45e9
CM
70;;; Below, we frequently use "inherit" to create modified packages. The
71;;; reason why we use "inherit" instead of "package/inherit" is because we do
72;;; not want these commencement packages to inherit grafts. By definition,
73;;; these packages are not depended on at run time by any of the packages we
74;;; use. Thus it does not make sense to inherit grafts. Furthermore, those
75;;; grafts would often lead to extra overhead for users who would end up
76;;; downloading those "-boot0" packages just to build package replacements
77;;; that are in fact not going to be used.
78;;;
bdb36958
LC
79;;; Code:
80
81(define gnu-make-boot0
82 (package-with-bootstrap-guile
83 (package (inherit gnu-make)
84 (name "make-boot0")
bdb36958
LC
85 (arguments
86 `(#:guile ,%bootstrap-guile
87 #:implicit-inputs? #f
88 #:tests? #f ; cannot run "make check"
89 ,@(substitute-keyword-arguments (package-arguments gnu-make)
90 ((#:phases phases)
8e5e8724
LC
91 `(modify-phases ,phases
92 (replace 'build
93 (lambda _
53bfec7b
TGR
94 (invoke "./build.sh")
95 #t))
8e5e8724
LC
96 (replace 'install
97 (lambda* (#:key outputs #:allow-other-keys)
98 (let* ((out (assoc-ref outputs "out"))
99 (bin (string-append out "/bin")))
53bfec7b
TGR
100 (install-file "make" bin)
101 #t))))))))
bdb36958
LC
102 (native-inputs '()) ; no need for 'pkg-config'
103 (inputs %bootstrap-inputs))))
104
105(define diffutils-boot0
106 (package-with-bootstrap-guile
107 (let ((p (package-with-explicit-inputs diffutils
108 `(("make" ,gnu-make-boot0)
109 ,@%bootstrap-inputs)
110 #:guile %bootstrap-guile)))
111 (package (inherit p)
09964b4f 112 (name "diffutils-boot0")
bdb36958
LC
113 (arguments `(#:tests? #f ; the test suite needs diffutils
114 ,@(package-arguments p)))))))
115
116(define findutils-boot0
117 (package-with-bootstrap-guile
09964b4f
LC
118 (package-with-explicit-inputs (package
119 (inherit findutils)
120 (name "findutils-boot0"))
bdb36958
LC
121 `(("make" ,gnu-make-boot0)
122 ("diffutils" ,diffutils-boot0) ; for tests
123 ,@%bootstrap-inputs)
124 (current-source-location)
125 #:guile %bootstrap-guile)))
126
c00a9fbf
MW
127(define file-boot0
128 (package-with-bootstrap-guile
e47c69f2 129 (package-with-explicit-inputs (package/inherit file
09964b4f 130 (name "file-boot0"))
c00a9fbf
MW
131 `(("make" ,gnu-make-boot0)
132 ,@%bootstrap-inputs)
133 (current-source-location)
134 #:guile %bootstrap-guile)))
135
bdb36958
LC
136
137(define %boot0-inputs
138 `(("make" ,gnu-make-boot0)
139 ("diffutils" ,diffutils-boot0)
140 ("findutils" ,findutils-boot0)
c00a9fbf 141 ("file" ,file-boot0)
bdb36958
LC
142 ,@%bootstrap-inputs))
143
bdb36958
LC
144(define* (boot-triplet #:optional (system (%current-system)))
145 ;; Return the triplet used to create the cross toolchain needed in the
146 ;; first bootstrapping stage.
147 (nix-system->gnu-triplet system "guix"))
148
149;; Following Linux From Scratch, build a cross-toolchain in stage 0. That
150;; toolchain actually targets the same OS and arch, but it has the advantage
151;; of being independent of the libc and tools in %BOOTSTRAP-INPUTS, since
152;; GCC-BOOT0 (below) is built without any reference to the target libc.
153
154(define binutils-boot0
155 (package-with-bootstrap-guile
45953b1f 156 (package (inherit binutils)
bdb36958
LC
157 (name "binutils-cross-boot0")
158 (arguments
159 `(#:guile ,%bootstrap-guile
160 #:implicit-inputs? #f
f8badf15
MW
161
162 #:modules ((guix build gnu-build-system)
163 (guix build utils)
164 (ice-9 ftw)) ; for 'scandir'
ac423120
EF
165 #:phases (modify-phases %standard-phases
166 (add-after 'install 'add-symlinks
167 (lambda* (#:key outputs #:allow-other-keys)
168 ;; The cross-gcc invokes 'as', 'ld', etc, without the
169 ;; triplet prefix, so add symlinks.
170 (let ((out (assoc-ref outputs "out"))
171 (triplet-prefix (string-append ,(boot-triplet) "-")))
172 (define (has-triplet-prefix? name)
173 (string-prefix? triplet-prefix name))
174 (define (remove-triplet-prefix name)
175 (substring name (string-length triplet-prefix)))
176 (with-directory-excursion (string-append out "/bin")
177 (for-each (lambda (name)
178 (symlink name (remove-triplet-prefix name)))
179 (scandir "." has-triplet-prefix?)))
180 #t))))
f8badf15 181
bdb36958
LC
182 ,@(substitute-keyword-arguments (package-arguments binutils)
183 ((#:configure-flags cf)
184 `(cons ,(string-append "--target=" (boot-triplet))
185 ,cf)))))
186 (inputs %boot0-inputs))))
187
3469a5ea
MB
188;; Use a "fixed" package source for this early libstdc++ variant so we can
189;; update GCC 4.9 without triggering a full rebuild.
190(define gcc-for-libstdc++
191 (package
192 (inherit gcc-4.9)
193 (source (origin
194 (inherit (package-source gcc-4.9))
195 (patches (search-patches "gcc-4.9-libsanitizer-fix.patch"
196 "gcc-arm-bug-71399.patch"
197 "gcc-asan-missing-include.patch"
198 "gcc-libvtv-runpath.patch"
199 "gcc-fix-texi2pod.patch"))))))
200
b810a850
LC
201(define libstdc++-boot0
202 ;; GCC's libcc1 is always built as a shared library (the top-level
203 ;; 'Makefile.def' forcefully adds --enable-shared) and thus needs to refer
204 ;; to libstdc++.so. We cannot build libstdc++-5.3 because it relies on
809b0a90 205 ;; C++14 features missing in some of our bootstrap compilers.
3469a5ea 206 (let ((lib (package-with-bootstrap-guile (make-libstdc++ gcc-for-libstdc++))))
b810a850
LC
207 (package
208 (inherit lib)
209 (name "libstdc++-boot0")
210 (arguments
211 `(#:guile ,%bootstrap-guile
212 #:implicit-inputs? #f
213
214 ;; XXX: libstdc++.so NEEDs ld.so for some reason.
215 #:validate-runpath? #f
216
217 ,@(package-arguments lib)))
218 (inputs %boot0-inputs)
219 (native-inputs '()))))
220
bdb36958
LC
221(define gcc-boot0
222 (package-with-bootstrap-guile
c92f1c0a 223 (package (inherit gcc)
bdb36958
LC
224 (name "gcc-cross-boot0")
225 (arguments
226 `(#:guile ,%bootstrap-guile
227 #:implicit-inputs? #f
228 #:modules ((guix build gnu-build-system)
229 (guix build utils)
230 (ice-9 regex)
231 (srfi srfi-1)
232 (srfi srfi-26))
c92f1c0a 233 ,@(substitute-keyword-arguments (package-arguments gcc)
bdb36958
LC
234 ((#:configure-flags flags)
235 `(append (list ,(string-append "--target=" (boot-triplet))
236
237 ;; No libc yet.
238 "--without-headers"
239
240 ;; Disable features not needed at this stage.
241 "--disable-shared"
242 "--enable-languages=c,c++"
243
244 ;; libstdc++ cannot be built at this stage
245 ;; ("Link tests are not allowed after
246 ;; GCC_NO_EXECUTABLES.").
247 "--disable-libstdc++-v3"
248
249 "--disable-threads"
250 "--disable-libmudflap"
251 "--disable-libatomic"
252 "--disable-libsanitizer"
253 "--disable-libitm"
254 "--disable-libgomp"
de4ac325
LC
255 "--disable-libcilkrts"
256 "--disable-libvtv"
bdb36958
LC
257 "--disable-libssp"
258 "--disable-libquadmath"
259 "--disable-decimal-float")
98bd851e
LC
260 (remove (cut string-match
261 "--(with-system-zlib|enable-languages.*)" <>)
bdb36958
LC
262 ,flags)))
263 ((#:phases phases)
53bfec7b
TGR
264 `(modify-phases ,phases
265 (add-after 'unpack 'unpack-gmp&co
266 (lambda* (#:key inputs #:allow-other-keys)
267 (let ((gmp (assoc-ref %build-inputs "gmp-source"))
268 (mpfr (assoc-ref %build-inputs "mpfr-source"))
269 (mpc (assoc-ref %build-inputs "mpc-source")))
270
271 ;; To reduce the set of pre-built bootstrap inputs, build
272 ;; GMP & co. from GCC.
273 (for-each (lambda (source)
274 (invoke "tar" "xvf" source))
275 (list gmp mpfr mpc))
276
277 ;; Create symlinks like `gmp' -> `gmp-x.y.z'.
278 ,@(map (lambda (lib)
279 ;; Drop trailing letters, as gmp-6.0.0a unpacks
280 ;; into gmp-6.0.0.
281 `(symlink ,(string-trim-right
539bf8f2 282 (package-full-name lib "-")
53bfec7b
TGR
283 char-set:letter)
284 ,(package-name lib)))
285 (list gmp-6.0 mpfr mpc))
286 #t)))
287 (add-after 'install 'symlink-libgcc_eh
288 (lambda* (#:key outputs #:allow-other-keys)
289 (let ((out (assoc-ref outputs "lib")))
290 ;; Glibc wants to link against libgcc_eh, so provide
291 ;; it.
292 (with-directory-excursion
293 (string-append out "/lib/gcc/"
294 ,(boot-triplet)
295 "/" ,(package-version gcc))
296 (symlink "libgcc.a" "libgcc_eh.a"))
297 #t))))))))
bdb36958 298
8309c389 299 (inputs `(("gmp-source" ,(package-source gmp-6.0))
bdb36958
LC
300 ("mpfr-source" ,(package-source mpfr))
301 ("mpc-source" ,(package-source mpc))
302 ("binutils-cross" ,binutils-boot0)
303
b810a850
LC
304 ;; The libstdc++ that libcc1 links against.
305 ("libstdc++" ,libstdc++-boot0)
306
bdb36958
LC
307 ;; Call it differently so that the builder can check whether
308 ;; the "libc" input is #f.
309 ("libc-native" ,@(assoc-ref %boot0-inputs "libc"))
9dee9e8f
LC
310 ,@(alist-delete "libc" %boot0-inputs)))
311
19d27131
MC
312 ;; No need for the native-inputs to build the documentation at this stage.
313 (native-inputs `()))))
bdb36958
LC
314
315(define perl-boot0
4de35074
LC
316 (let ((perl (package
317 (inherit perl)
09964b4f 318 (name "perl-boot0")
4de35074 319 (arguments
81cea47d
LC
320 ;; At the very least, this must not depend on GCC & co.
321 (let ((args `(#:disallowed-references
322 ,(list %bootstrap-binutils))))
323 (substitute-keyword-arguments (package-arguments perl)
324 ((#:phases phases)
325 `(modify-phases ,phases
326 ;; Pthread support is missing in the bootstrap compiler
327 ;; (broken spec file), so disable it.
328 (add-before 'configure 'disable-pthreads
329 (lambda _
330 (substitute* "Configure"
331 (("^libswanted=(.*)pthread" _ before)
75f3aace
MW
332 (string-append "libswanted=" before)))
333 #t))))
156c0810
BW
334 ;; Do not configure with '-Dusethreads' since pthread
335 ;; support is missing.
336 ((#:configure-flags configure-flags)
337 `(delete "-Dusethreads" ,configure-flags))))))))
81cea47d
LC
338 (package-with-bootstrap-guile
339 (package-with-explicit-inputs perl
340 %boot0-inputs
341 (current-source-location)
342 #:guile %bootstrap-guile))))
bdb36958 343
d75acc29
MR
344(define bison-boot0
345 ;; This Bison is needed to build MiG so we need it early in the process.
346 ;; It is also needed to rebuild Bash's parser, which is modified by
347 ;; its CVE patches. Remove it when it's no longer needed.
348 (let* ((m4 (package-with-bootstrap-guile
349 (package-with-explicit-inputs m4 %boot0-inputs
350 (current-source-location)
351 #:guile %bootstrap-guile)))
352 (bison (package (inherit bison)
353 (propagated-inputs `(("m4" ,m4)))
354 (inputs '()) ;remove Flex...
355 (arguments
356 '(#:tests? #f ;... and thus disable tests
357
358 ;; Zero timestamps in liby.a; this must be done
359 ;; explicitly here because the bootstrap Binutils don't
360 ;; do that (default is "cru".)
361 #:make-flags '("ARFLAGS=crD" "RANLIB=ranlib -D"
362 "V=1"))))))
363 (package
364 (inherit (package-with-bootstrap-guile
365 (package-with-explicit-inputs bison %boot0-inputs
366 (current-source-location)
367 #:guile %bootstrap-guile)))
368 (native-inputs `(("perl" ,perl-boot0))))))
369
370(define flex-boot0
371 ;; This Flex is needed to build MiG.
372 (let* ((flex (package (inherit flex)
373 (native-inputs `(("bison" ,bison-boot0)))
374 (propagated-inputs `(("m4" ,m4)))
375 (inputs `(("indent" ,indent)))
376 (arguments '(#:tests? #f)))))
377 (package-with-bootstrap-guile
378 (package-with-explicit-inputs flex %boot0-inputs
379 (current-source-location)
380 #:guile %bootstrap-guile))))
381
8102cf0b
LC
382(define linux-libre-headers-boot0
383 (mlambda ()
384 "Return Linux-Libre header files for the bootstrap environment."
385 ;; Note: this is wrapped in a thunk to nicely handle circular dependencies
386 ;; between (gnu packages linux) and this module. Additionally, memoize
387 ;; the result to play well with further memoization and code that relies
388 ;; on pointer identity; see <https://bugs.gnu.org/30155>.
389 (package-with-bootstrap-guile
390 (package (inherit linux-libre-headers)
391 (arguments `(#:guile ,%bootstrap-guile
392 #:implicit-inputs? #f
393 ,@(package-arguments linux-libre-headers)))
394 (native-inputs
395 `(("perl" ,perl-boot0)
396 ,@%boot0-inputs))))))
bdb36958 397
d75acc29
MR
398(define gnumach-headers-boot0
399 (package-with-bootstrap-guile
400 (package-with-explicit-inputs gnumach-headers
401 %boot0-inputs
402 (current-source-location)
403 #:guile %bootstrap-guile)))
404
405(define mig-boot0
406 (let* ((mig (package (inherit mig)
407 (native-inputs `(("bison" ,bison-boot0)
408 ("flex" ,flex-boot0)))
409 (inputs `(("flex" ,flex-boot0)))
410 (arguments
411 `(#:configure-flags
412 `(,(string-append "LDFLAGS=-Wl,-rpath="
413 (assoc-ref %build-inputs "flex") "/lib/")))))))
414 (package-with-bootstrap-guile
415 (package-with-explicit-inputs mig %boot0-inputs
416 (current-source-location)
417 #:guile %bootstrap-guile))))
418
419(define hurd-headers-boot0
420 (let ((hurd-headers (package (inherit hurd-headers)
421 (native-inputs `(("mig" ,mig-boot0)))
422 (inputs '()))))
423 (package-with-bootstrap-guile
424 (package-with-explicit-inputs hurd-headers %boot0-inputs
425 (current-source-location)
426 #:guile %bootstrap-guile))))
427
428(define hurd-minimal-boot0
429 (let ((hurd-minimal (package (inherit hurd-minimal)
430 (native-inputs `(("mig" ,mig-boot0)))
431 (inputs '()))))
432 (package-with-bootstrap-guile
433 (package-with-explicit-inputs hurd-minimal %boot0-inputs
434 (current-source-location)
435 #:guile %bootstrap-guile))))
436
8102cf0b
LC
437(define hurd-core-headers-boot0
438 (mlambda ()
439 "Return the Hurd and Mach headers as well as initial Hurd libraries for
d75acc29 440the bootstrap environment."
8102cf0b
LC
441 (package-with-bootstrap-guile
442 (package (inherit hurd-core-headers)
443 (arguments `(#:guile ,%bootstrap-guile
444 ,@(package-arguments hurd-core-headers)))
445 (inputs
446 `(("gnumach-headers" ,gnumach-headers-boot0)
447 ("hurd-headers" ,hurd-headers-boot0)
448 ("hurd-minimal" ,hurd-minimal-boot0)
449 ,@%boot0-inputs))))))
d75acc29
MR
450
451(define* (kernel-headers-boot0 #:optional (system (%current-system)))
452 (match system
453 ("i586-gnu" (hurd-core-headers-boot0))
454 (_ (linux-libre-headers-boot0))))
455
bdb36958
LC
456(define texinfo-boot0
457 ;; Texinfo used to build libc's manual.
458 ;; We build without ncurses because it fails to build at this stage, and
459 ;; because we don't need the stand-alone Info reader.
460 ;; Also, use %BOOT0-INPUTS to avoid building Perl once more.
461 (let ((texinfo (package (inherit texinfo)
47ed8e04 462 (native-inputs '())
5d6c4d37
LC
463 (inputs `(("perl" ,perl-boot0)))
464
465 ;; Some of Texinfo 6.1's tests would fail with "Couldn't
466 ;; set UTF-8 character type in locale" but we don't have a
467 ;; UTF-8 locale at this stage, so skip them.
468 (arguments '(#:tests? #f)))))
bdb36958
LC
469 (package-with-bootstrap-guile
470 (package-with-explicit-inputs texinfo %boot0-inputs
471 (current-source-location)
472 #:guile %bootstrap-guile))))
473
d75acc29
MR
474(define ld-wrapper-boot0
475 ;; We need this so binaries on Hurd will have libmachuser and libhurduser
476 ;; in their RUNPATH, otherwise validate-runpath will fail.
168c4000
LC
477 (make-ld-wrapper "ld-wrapper-boot0"
478 #:target boot-triplet
d75acc29
MR
479 #:binutils binutils-boot0
480 #:guile %bootstrap-guile
481 #:bash (car (assoc-ref %boot0-inputs "bash"))))
482
bdb36958
LC
483(define %boot1-inputs
484 ;; 2nd stage inputs.
485 `(("gcc" ,gcc-boot0)
d75acc29 486 ("ld-wrapper-cross" ,ld-wrapper-boot0)
bdb36958 487 ("binutils-cross" ,binutils-boot0)
f8badf15 488 ,@(alist-delete "binutils" %boot0-inputs)))
bdb36958
LC
489
490(define glibc-final-with-bootstrap-bash
491 ;; The final libc, "cross-built". If everything went well, the resulting
492 ;; store path has no dependencies. Actually, the really-final libc is
493 ;; built just below; the only difference is that this one uses the
494 ;; bootstrap Bash.
495 (package-with-bootstrap-guile
848f550f 496 (package (inherit glibc)
bdb36958
LC
497 (name "glibc-intermediate")
498 (arguments
499 `(#:guile ,%bootstrap-guile
500 #:implicit-inputs? #f
501
502 ,@(substitute-keyword-arguments (package-arguments glibc)
503 ((#:configure-flags flags)
504 `(append (list ,(string-append "--host=" (boot-triplet))
505 ,(string-append "--build="
506 (nix-system->gnu-triplet))
507
508 ;; Build Sun/ONC RPC support. In particular,
509 ;; install rpc/*.h.
510 "--enable-obsolete-rpc")
511 ,flags))
512 ((#:phases phases)
53bfec7b
TGR
513 `(modify-phases ,phases
514 (add-before 'configure 'pre-configure
515 (lambda* (#:key inputs #:allow-other-keys)
516 ;; Don't clobber CPATH with the bootstrap libc.
517 (setenv "NATIVE_CPATH" (getenv "CPATH"))
518 (unsetenv "CPATH")
519
520 ;; Tell 'libpthread' where to find 'libihash' on Hurd systems.
521 ,@(if (hurd-triplet? (%current-system))
522 `((substitute* "libpthread/Makefile"
523 (("LDLIBS-pthread.so =.*")
524 (string-append "LDLIBS-pthread.so = "
525 (assoc-ref %build-inputs "kernel-headers")
526 "/lib/libihash.a\n"))))
527 '())
528
529 ;; 'rpcgen' needs native libc headers to be built.
530 (substitute* "sunrpc/Makefile"
531 (("sunrpc-CPPFLAGS =.*" all)
532 (string-append "CPATH = $(NATIVE_CPATH)\n"
533 "export CPATH\n"
534 all "\n")))
535 #t)))))))
d75acc29 536 (propagated-inputs `(("kernel-headers" ,(kernel-headers-boot0))))
bdb36958 537 (native-inputs
5e8cb5e6
MB
538 `(("bison" ,bison-boot0)
539 ("texinfo" ,texinfo-boot0)
ff647c3d 540 ("perl" ,perl-boot0)))
bdb36958
LC
541 (inputs
542 `(;; The boot inputs. That includes the bootstrap libc. We don't want
543 ;; it in $CPATH, hence the 'pre-configure' phase above.
544 ,@%boot1-inputs
545
d75acc29 546 ;; A native MiG is needed to build Glibc on Hurd.
62596a15 547 ,@(if (hurd-triplet? (%current-system))
d75acc29
MR
548 `(("mig" ,mig-boot0))
549 '())
550
bdb36958
LC
551 ;; A native GCC is needed to build `cross-rpcgen'.
552 ("native-gcc" ,@(assoc-ref %boot0-inputs "gcc"))
553
554 ;; Here, we use the bootstrap Bash, which is not satisfactory
555 ;; because we don't want to depend on bootstrap tools.
556 ("static-bash" ,@(assoc-ref %boot0-inputs "bash")))))))
557
558(define (cross-gcc-wrapper gcc binutils glibc bash)
559 "Return a wrapper for the pseudo-cross toolchain GCC/BINUTILS/GLIBC
560that makes it available under the native tool names."
c92f1c0a 561 (package (inherit gcc)
bdb36958
LC
562 (name (string-append (package-name gcc) "-wrapped"))
563 (source #f)
564 (build-system trivial-build-system)
565 (outputs '("out"))
566 (arguments
567 `(#:guile ,%bootstrap-guile
568 #:modules ((guix build utils))
569 #:builder (begin
570 (use-modules (guix build utils))
571
572 (let* ((binutils (assoc-ref %build-inputs "binutils"))
573 (gcc (assoc-ref %build-inputs "gcc"))
574 (libc (assoc-ref %build-inputs "libc"))
575 (bash (assoc-ref %build-inputs "bash"))
576 (out (assoc-ref %outputs "out"))
577 (bindir (string-append out "/bin"))
578 (triplet ,(boot-triplet)))
579 (define (wrap-program program)
580 ;; GCC-BOOT0 is a libc-less cross-compiler, so it
581 ;; needs to be told where to find the crt files and
582 ;; the dynamic linker.
583 (call-with-output-file program
584 (lambda (p)
585 (format p "#!~a/bin/bash
586exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
587 bash
588 gcc triplet program
589 libc libc
590 ,(glibc-dynamic-linker))))
591
592 (chmod program #o555))
593
594 (mkdir-p bindir)
595 (with-directory-excursion bindir
596 (for-each (lambda (tool)
597 (symlink (string-append binutils "/bin/"
598 triplet "-" tool)
599 tool))
600 '("ar" "ranlib"))
e3cfef22
MW
601 (for-each wrap-program '("gcc" "g++")))
602
603 #t))))
bdb36958
LC
604 (native-inputs
605 `(("binutils" ,binutils)
606 ("gcc" ,gcc)
607 ("libc" ,glibc)
608 ("bash" ,bash)))
609 (inputs '())))
610
611(define static-bash-for-glibc
90d891fc 612 ;; A statically-linked Bash to be used by GLIBC-FINAL in system(3) & co.
bdb36958
LC
613 (let* ((gcc (cross-gcc-wrapper gcc-boot0 binutils-boot0
614 glibc-final-with-bootstrap-bash
615 (car (assoc-ref %boot1-inputs "bash"))))
6dff905e
LC
616 (bash (package
617 (inherit static-bash)
bdb36958 618 (arguments
6dff905e
LC
619 (substitute-keyword-arguments
620 (package-arguments static-bash)
621 ((#:guile _ #f)
622 '%bootstrap-guile)
623 ((#:configure-flags flags '())
624 ;; Add a '-L' flag so that the pseudo-cross-ld of
625 ;; BINUTILS-BOOT0 can find libc.a.
626 `(append ,flags
627 (list (string-append "LDFLAGS=-static -L"
628 (assoc-ref %build-inputs
629 "libc:static")
630 "/lib"))))))))
32243bfb
LC
631 (inputs `(("gcc" ,gcc)
632 ("libc" ,glibc-final-with-bootstrap-bash)
6dff905e 633 ("libc:static" ,glibc-final-with-bootstrap-bash "static")
32243bfb
LC
634 ,@(fold alist-delete %boot1-inputs
635 '("gcc" "libc")))))
c573f5a5
LC
636 (package-with-bootstrap-guile
637 (package-with-explicit-inputs bash inputs
638 (current-source-location)
639 #:guile %bootstrap-guile))))
bdb36958 640
6162b95d
LC
641(define gettext-boot0
642 ;; A minimal gettext used during bootstrap.
669b8639 643 (let ((gettext-minimal
b94a6ca0 644 (package (inherit gettext-minimal)
669b8639
LC
645 (name "gettext-boot0")
646 (inputs '()) ;zero dependencies
647 (arguments
648 (substitute-keyword-arguments
649 `(#:tests? #f
b94a6ca0 650 ,@(package-arguments gettext-minimal))
669b8639
LC
651 ((#:phases phases)
652 `(modify-phases ,phases
653 ;; Build only the tools.
654 (add-after 'unpack 'chdir
655 (lambda _
60ff6ec4
MW
656 (chdir "gettext-tools")
657 #t))
669b8639
LC
658
659 ;; Some test programs require pthreads, which we don't have.
660 (add-before 'configure 'no-test-programs
661 (lambda _
662 (substitute* "tests/Makefile.in"
663 (("^PROGRAMS =.*$")
664 "PROGRAMS =\n"))
665 #t))
666
667 ;; Don't try to link against libexpat.
668 (delete 'link-expat)
669 (delete 'patch-tests))))))))
6162b95d
LC
670 (package-with-bootstrap-guile
671 (package-with-explicit-inputs gettext-minimal
672 %boot1-inputs
673 (current-source-location)
674 #:guile %bootstrap-guile))))
675
89223417 676(define glibc-final
bdb36958 677 ;; The final glibc, which embeds the statically-linked Bash built above.
7c788ed2
LC
678 ;; Use 'package/inherit' so we get the 'replacement' of 'glibc', if any.
679 (let ((glibc (package-with-bootstrap-guile glibc)))
680 (package/inherit glibc
681 (name "glibc")
682 (inputs `(("static-bash" ,static-bash-for-glibc)
683 ,@(alist-delete
684 "static-bash"
685 (package-inputs glibc-final-with-bootstrap-bash))))
686
687 ;; This time we need 'msgfmt' to install all the libc.mo files.
688 (native-inputs `(,@(package-native-inputs glibc-final-with-bootstrap-bash)
689 ("gettext" ,gettext-boot0)))
690
691 (propagated-inputs
692 (package-propagated-inputs glibc-final-with-bootstrap-bash))
693
694 ;; The final libc only refers to itself, but the 'debug' output contains
695 ;; references to GCC-BOOT0 and to the Linux headers. XXX: Would be great
696 ;; if 'allowed-references' were per-output.
697 (arguments
698 `(#:allowed-references
699 ,(cons* `(,gcc-boot0 "lib") (kernel-headers-boot0)
700 static-bash-for-glibc
701 (package-outputs glibc-final-with-bootstrap-bash))
bdb36958 702
7c788ed2 703 ,@(package-arguments glibc-final-with-bootstrap-bash))))))
bdb36958
LC
704
705(define gcc-boot0-wrapped
706 ;; Make the cross-tools GCC-BOOT0 and BINUTILS-BOOT0 available under the
707 ;; non-cross names.
708 (cross-gcc-wrapper gcc-boot0 binutils-boot0 glibc-final
709 (car (assoc-ref %boot1-inputs "bash"))))
710
711(define %boot2-inputs
712 ;; 3rd stage inputs.
713 `(("libc" ,glibc-final)
6dff905e 714 ("libc:static" ,glibc-final "static")
bdb36958
LC
715 ("gcc" ,gcc-boot0-wrapped)
716 ,@(fold alist-delete %boot1-inputs '("libc" "gcc"))))
717
718(define binutils-final
719 (package-with-bootstrap-guile
45953b1f 720 (package (inherit binutils)
bdb36958
LC
721 (arguments
722 `(#:guile ,%bootstrap-guile
723 #:implicit-inputs? #f
724 #:allowed-references ("out" ,glibc-final)
725 ,@(package-arguments binutils)))
726 (inputs %boot2-inputs))))
727
728(define libstdc++
729 ;; Intermediate libstdc++ that will allow us to build the final GCC
730 ;; (remember that GCC-BOOT0 cannot build libstdc++.)
86d02fa8
EF
731 (let ((lib (package-with-bootstrap-guile (make-libstdc++ gcc))))
732 (package
733 (inherit lib)
734 (arguments
735 `(#:guile ,%bootstrap-guile
736 #:implicit-inputs? #f
737 #:allowed-references ("out")
738
739 ;; XXX: libstdc++.so NEEDs ld.so for some reason.
740 #:validate-runpath? #f
741
742 ;; All of the package arguments from 'make-libstdc++
743 ;; except for the configure-flags.
744 ,@(package-arguments lib)
745 #:configure-flags `("--disable-shared"
746 "--disable-libstdcxx-threads"
747 "--disable-libstdcxx-pch"
748 ,(string-append "--with-gxx-include-dir="
749 (assoc-ref %outputs "out")
750 "/include"))))
751 (outputs '("out"))
752 (inputs %boot2-inputs)
753 (synopsis "GNU C++ standard library (intermediate)"))))
bdb36958 754
98bd851e
LC
755(define zlib-final
756 ;; Zlib used by GCC-FINAL.
757 (package-with-bootstrap-guile
758 (package
759 (inherit zlib)
760 (arguments
761 `(#:guile ,%bootstrap-guile
762 #:implicit-inputs? #f
763 #:allowed-references ("out" ,glibc-final)
764 ,@(package-arguments zlib)))
765 (inputs %boot2-inputs))))
766
767(define ld-wrapper-boot3
768 ;; A linker wrapper that uses the bootstrap Guile.
769 (make-ld-wrapper "ld-wrapper-boot3"
770 #:binutils binutils-final
771 #:guile %bootstrap-guile
772 #:bash (car (assoc-ref %boot2-inputs "bash"))))
773
89223417 774(define gcc-final
bdb36958
LC
775 ;; The final GCC.
776 (package (inherit gcc-boot0)
777 (name "gcc")
ab999c25
LC
778
779 ;; XXX: Currently #:allowed-references applies to all the outputs but the
780 ;; "debug" output contains disallowed references, notably
781 ;; linux-libre-headers. Disable the debugging output to work around that.
782 (outputs (delete "debug" (package-outputs gcc-boot0)))
783
bdb36958
LC
784 (arguments
785 `(#:guile ,%bootstrap-guile
786 #:implicit-inputs? #f
787
98bd851e 788 #:allowed-references ("out" "lib" ,zlib-final
90d891fc 789 ,glibc-final ,static-bash-for-glibc)
bdb36958 790
d485ebba
LC
791 ;; Things like libasan.so and libstdc++.so NEED ld.so for some
792 ;; reason, but it is not in their RUNPATH. This is a false
793 ;; positive, so turn it off.
794 #:validate-runpath? #f
795
bdb36958
LC
796 ;; Build again GMP & co. within GCC's build process, because it's hard
797 ;; to do outside (because GCC-BOOT0 is a cross-compiler, and thus
798 ;; doesn't honor $LIBRARY_PATH, which breaks `gnu-build-system'.)
799 ,@(substitute-keyword-arguments (package-arguments gcc-boot0)
800 ((#:configure-flags boot-flags)
c92f1c0a 801 (let loop ((args (package-arguments gcc)))
bdb36958
LC
802 (match args
803 ((#:configure-flags normal-flags _ ...)
804 normal-flags)
805 ((_ rest ...)
806 (loop rest)))))
807 ((#:make-flags flags)
52cfd8cb 808 ;; Since $LIBRARY_PATH is not honored, add the relevant flags.
98bd851e
LC
809 `(let ((zlib (assoc-ref %build-inputs "zlib")))
810 (map (lambda (flag)
811 (if (string-prefix? "LDFLAGS=" flag)
812 (string-append flag " -L"
813 (assoc-ref %build-inputs "libstdc++")
814 "/lib -L" zlib "/lib -Wl,-rpath="
815 zlib "/lib")
816 flag))
817 ,flags)))
bdb36958
LC
818 ((#:phases phases)
819 `(alist-delete 'symlink-libgcc_eh ,phases)))))
820
90d891fc
LC
821 ;; This time we want Texinfo, so we get the manual. Add
822 ;; STATIC-BASH-FOR-GLIBC so that it's used in the final shebangs of
823 ;; scripts such as 'mkheaders' and 'fixinc.sh' (XXX: who cares about these
824 ;; scripts?).
bdb36958 825 (native-inputs `(("texinfo" ,texinfo-boot0)
19d27131 826 ("perl" ,perl-boot0) ;for manpages
90d891fc 827 ("static-bash" ,static-bash-for-glibc)
bdb36958
LC
828 ,@(package-native-inputs gcc-boot0)))
829
8309c389 830 (inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp-6.0)))
bdb36958
LC
831 ("mpfr-source" ,(package-source mpfr))
832 ("mpc-source" ,(package-source mpc))
98bd851e 833 ("ld-wrapper" ,ld-wrapper-boot3)
bdb36958
LC
834 ("binutils" ,binutils-final)
835 ("libstdc++" ,libstdc++)
98bd851e 836 ("zlib" ,zlib-final)
bdb36958
LC
837 ,@%boot2-inputs))))
838
bdb36958
LC
839(define %boot3-inputs
840 ;; 4th stage inputs.
841 `(("gcc" ,gcc-final)
842 ("ld-wrapper" ,ld-wrapper-boot3)
843 ,@(alist-delete "gcc" %boot2-inputs)))
844
845(define bash-final
846 ;; Link with `-static-libgcc' to make sure we don't retain a reference
704243e0
LC
847 ;; to the bootstrap GCC. Use "bash-minimal" to avoid an extra dependency
848 ;; on Readline and ncurses.
d9b4cbc2 849 (let ((bash (package
704243e0 850 (inherit bash-minimal)
d9b4cbc2
LC
851 (arguments
852 `(#:disallowed-references
853 ,(assoc-ref %boot3-inputs "coreutils&co")
704243e0 854 ,@(package-arguments bash-minimal))))))
d9b4cbc2
LC
855 (package-with-bootstrap-guile
856 (package-with-explicit-inputs (static-libgcc-package bash)
857 %boot3-inputs
858 (current-source-location)
859 #:guile %bootstrap-guile))))
bdb36958
LC
860
861(define %boot4-inputs
862 ;; Now use the final Bash.
863 `(("bash" ,bash-final)
864 ,@(alist-delete "bash" %boot3-inputs)))
865
866(define-public guile-final
386b71d1
LC
867 ;; This package must be public because other modules refer to it. However,
868 ;; mark it as hidden so that 'fold-packages' ignores it.
bdb36958 869 (package-with-bootstrap-guile
34d624ce 870 (package-with-explicit-inputs (hidden-package guile-2.2/fixed)
bdb36958
LC
871 %boot4-inputs
872 (current-source-location)
873 #:guile %bootstrap-guile)))
874
89223417 875(define glibc-utf8-locales-final
87c8b92f
LC
876 ;; Now that we have GUILE-FINAL, build the UTF-8 locales. They are needed
877 ;; by the build processes afterwards so their 'scm_to_locale_string' works
878 ;; with the full range of Unicode codepoints (remember
879 ;; 'scm_to_locale_string' is called every time a string is passed to a C
880 ;; function.)
881 (package
882 (inherit glibc-utf8-locales)
883 (inputs `(("glibc" ,glibc-final)
884 ("gzip"
885 ,(package-with-explicit-inputs gzip %boot4-inputs
886 (current-source-location)
887 #:guile %bootstrap-guile))))))
888
28cbc587
LC
889(define-public ld-wrapper
890 ;; The final 'ld' wrapper, which uses the final Guile and Binutils.
78dea6f1
LC
891 (make-ld-wrapper "ld-wrapper"
892 #:binutils binutils-final
893 #:guile guile-final
894 #:bash bash-final))
28cbc587 895
87c8b92f 896(define %boot5-inputs
b6ac5451
LC
897 ;; Now with UTF-8 locales. Remember that the bootstrap binaries were built
898 ;; with an older libc, which cannot load the new locale format. See
28cbc587 899 ;; <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
b6ac5451
LC
900 `(("locales" ,glibc-utf8-locales-final)
901 ,@%boot4-inputs))
87c8b92f 902
bdb36958
LC
903(define gnu-make-final
904 ;; The final GNU Make, which uses the final Guile.
905 (package-with-bootstrap-guile
906 (package-with-explicit-inputs gnu-make
907 `(("guile" ,guile-final)
87c8b92f 908 ,@%boot5-inputs)
bdb36958
LC
909 (current-source-location))))
910
bdb36958
LC
911(define coreutils-final
912 ;; The final Coreutils. Treat them specially because some packages, such as
913 ;; Findutils, keep a reference to the Coreutils they were built with.
914 (package-with-bootstrap-guile
915 (package-with-explicit-inputs coreutils
87c8b92f 916 %boot5-inputs
bdb36958
LC
917 (current-source-location)
918
919 ;; Use the final Guile, linked against the
920 ;; final libc with working iconv, so that
921 ;; 'substitute*' works well when touching
922 ;; test files in Gettext.
923 #:guile guile-final)))
924
925(define grep-final
926 ;; The final grep. Gzip holds a reference to it (via zgrep), so it must be
927 ;; built before gzip.
78ca500a
LC
928 (let ((grep (package-with-bootstrap-guile
929 (package-with-explicit-inputs grep %boot5-inputs
930 (current-source-location)
931 #:guile guile-final))))
932 (package/inherit grep
933 (inputs (alist-delete "pcre" (package-inputs grep)))
934 (native-inputs `(("perl" ,perl-boot0))))))
bdb36958 935
87c8b92f 936(define %boot6-inputs
bdb36958
LC
937 ;; Now use the final Coreutils.
938 `(("coreutils" ,coreutils-final)
939 ("grep" ,grep-final)
87c8b92f 940 ,@%boot5-inputs))
b0fd2bd3 941
301a4249
LC
942(define sed-final
943 ;; The final sed.
944 (let ((sed (package-with-bootstrap-guile
945 (package-with-explicit-inputs sed %boot6-inputs
946 (current-source-location)
947 #:guile guile-final))))
948 (package/inherit sed (native-inputs `(("perl" ,perl-boot0))))))
949
bdb36958
LC
950(define-public %final-inputs
951 ;; Final derivations used as implicit inputs by 'gnu-build-system'. We
952 ;; still use 'package-with-bootstrap-guile' so that the bootstrap tools are
953 ;; used for origins that have patches, thereby avoiding circular
954 ;; dependencies.
955 (let ((finalize (compose package-with-bootstrap-guile
87c8b92f 956 (cut package-with-explicit-inputs <> %boot6-inputs
bdb36958
LC
957 (current-source-location)))))
958 `(,@(map (match-lambda
959 ((name package)
960 (list name (finalize package))))
961 `(("tar" ,tar)
87c8b92f 962 ("gzip" ,gzip)
bdb36958
LC
963 ("bzip2" ,bzip2)
964 ("xz" ,xz)
c00a9fbf 965 ("file" ,file)
bdb36958
LC
966 ("diffutils" ,diffutils)
967 ("patch" ,patch)
bdb36958
LC
968 ("findutils" ,findutils)
969 ("gawk" ,gawk)))
301a4249 970 ("sed" ,sed-final)
bdb36958
LC
971 ("grep" ,grep-final)
972 ("coreutils" ,coreutils-final)
973 ("make" ,gnu-make-final)
974 ("bash" ,bash-final)
975 ("ld-wrapper" ,ld-wrapper)
976 ("binutils" ,binutils-final)
977 ("gcc" ,gcc-final)
b0fd2bd3 978 ("libc" ,glibc-final)
6dff905e 979 ("libc:static" ,glibc-final "static")
b0fd2bd3 980 ("locales" ,glibc-utf8-locales-final))))
bdb36958
LC
981
982(define-public canonical-package
983 (let ((name->package (fold (lambda (input result)
984 (match input
6dff905e 985 ((_ package . outputs)
bdb36958
LC
986 (vhash-cons (package-full-name package)
987 package result))))
988 vlist-null
989 `(("guile" ,guile-final)
990 ,@%final-inputs))))
991 (lambda (package)
992 "Return the 'canonical' variant of PACKAGE---i.e., if PACKAGE is one of
993the implicit inputs of 'gnu-build-system', return that one, otherwise return
994PACKAGE.
995
34d624ce 996The goal is to avoid duplication in cases like GUILE-FINAL vs. GUILE-2.2,
bdb36958
LC
997COREUTILS-FINAL vs. COREUTILS, etc."
998 ;; XXX: This doesn't handle dependencies of the final inputs, such as
999 ;; libunistring, GMP, etc.
1000 (match (vhash-assoc (package-full-name package) name->package)
1001 ((_ . canon)
1002 ;; In general we want CANON, except if we're cross-compiling: CANON
1003 ;; uses explicit inputs, so it is "anchored" in the bootstrapped
1004 ;; process, with dependencies on things that cannot be
1005 ;; cross-compiled.
1006 (if (%current-target-system)
1007 package
1008 canon))
1009 (_ package)))))
1010
1011\f
1012;;;
1013;;; GCC toolchain.
1014;;;
1015
b887ede1 1016(define (make-gcc-toolchain gcc)
bdb36958
LC
1017 "Return a complete toolchain for GCC."
1018 (package
1019 (name "gcc-toolchain")
1020 (version (package-version gcc))
1021 (source #f)
1022 (build-system trivial-build-system)
1023 (arguments
1024 '(#:modules ((guix build union))
1025 #:builder (begin
1026 (use-modules (ice-9 match)
6f450b87 1027 (srfi srfi-26)
bdb36958
LC
1028 (guix build union))
1029
6f450b87 1030 (let ((out (assoc-ref %outputs "out")))
bdb36958 1031
6f450b87
LC
1032 (match %build-inputs
1033 (((names . directories) ...)
1034 (union-build out directories)))
1035
6f450b87
LC
1036 (union-build (assoc-ref %outputs "debug")
1037 (list (assoc-ref %build-inputs
e3cfef22 1038 "libc-debug")))
5a48a066
LC
1039 (union-build (assoc-ref %outputs "static")
1040 (list (assoc-ref %build-inputs
3d5ad159 1041 "libc-static")))
e3cfef22 1042 #t))))
d474d5d0
LC
1043
1044 (native-search-paths (package-native-search-paths gcc))
1045 (search-paths (package-search-paths gcc))
1046
bdb36958
LC
1047 (license (package-license gcc))
1048 (synopsis "Complete GCC tool chain for C/C++ development")
1049 (description
1050 "This package provides a complete GCC tool chain for C/C++ development to
1051be installed in user profiles. This includes GCC, as well as libc (headers
1052and binaries, plus debugging symbols in the 'debug' output), and Binutils.")
6fd52309 1053 (home-page "https://gcc.gnu.org/")
5a48a066 1054 (outputs '("out" "debug" "static"))
bdb36958
LC
1055
1056 ;; The main raison d'être of this "meta-package" is (1) to conveniently
1057 ;; install everything that we need, and (2) to make sure ld-wrapper comes
1058 ;; before Binutils' ld in the user's profile.
1059 (inputs `(("gcc" ,gcc)
cbbb11c8 1060 ("ld-wrapper" ,(car (assoc-ref %final-inputs "ld-wrapper")))
bdb36958
LC
1061 ("binutils" ,binutils-final)
1062 ("libc" ,glibc-final)
5a48a066
LC
1063 ("libc-debug" ,glibc-final "debug")
1064 ("libc-static" ,glibc-final "static")))))
bdb36958
LC
1065
1066(define-public gcc-toolchain-4.8
b887ede1 1067 (make-gcc-toolchain gcc-4.8))
bdb36958
LC
1068
1069(define-public gcc-toolchain-4.9
b887ede1
LC
1070 (make-gcc-toolchain gcc-4.9))
1071
1072(define-public gcc-toolchain
1073 (make-gcc-toolchain gcc-final))
bdb36958 1074
629f4d2e 1075(define-public gcc-toolchain-5
b887ede1 1076 gcc-toolchain)
60e2d5fe 1077
e760ec41 1078(define-public gcc-toolchain-6
b887ede1 1079 (make-gcc-toolchain gcc-6))
e760ec41 1080
d7ecab74 1081(define-public gcc-toolchain-7
b887ede1 1082 (make-gcc-toolchain gcc-7))
d7ecab74 1083
5ae27f57
LC
1084(define-public gcc-toolchain-8
1085 (make-gcc-toolchain gcc-8))
1086
bdb36958 1087;;; commencement.scm ends here