gnu: Add basic support for riscv64-linux-gnu targets.
[jackhill/guix/guix.git] / gnu / packages / bootstrap.scm
CommitLineData
233e7676 1;;; GNU Guix --- Functional package management for GNU
7ddd418a 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
ad1656dc 3;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
3b88f376 4;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
18633d4f 5;;;
233e7676 6;;; This file is part of GNU Guix.
18633d4f 7;;;
233e7676 8;;; GNU Guix is free software; you can redistribute it and/or modify it
18633d4f
LC
9;;; under the terms of the GNU General Public License as published by
10;;; the Free Software Foundation; either version 3 of the License, or (at
11;;; your option) any later version.
12;;;
233e7676 13;;; GNU Guix is distributed in the hope that it will be useful, but
18633d4f
LC
14;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16;;; GNU General Public License for more details.
17;;;
18;;; You should have received a copy of the GNU General Public License
233e7676 19;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
18633d4f 20
1ffa7090 21(define-module (gnu packages bootstrap)
4a44e743 22 #:use-module (guix licenses)
59a43334 23 #:use-module (gnu packages)
18633d4f 24 #:use-module (guix packages)
62cab99c 25 #:use-module (guix download)
18633d4f
LC
26 #:use-module (guix build-system)
27 #:use-module (guix build-system gnu)
28 #:use-module (guix build-system trivial)
5c93d233
LC
29 #:use-module ((guix store)
30 #:select (run-with-store add-to-store add-text-to-store))
31 #:use-module ((guix derivations)
32 #:select (derivation derivation->output-path))
958dd3ce 33 #:use-module ((guix utils) #:select (gnu-triplet->nix-system))
f9704f17 34 #:use-module (guix memoization)
18633d4f
LC
35 #:use-module (srfi srfi-1)
36 #:use-module (srfi srfi-26)
37 #:use-module (ice-9 match)
38 #:export (bootstrap-origin
39 package-with-bootstrap-guile
40 glibc-dynamic-linker
41
3e5750af
LC
42 bootstrap-guile-origin
43
18633d4f
LC
44 %bootstrap-guile
45 %bootstrap-coreutils&co
46 %bootstrap-binutils
47 %bootstrap-gcc
48 %bootstrap-glibc
49 %bootstrap-inputs))
50
51;;; Commentary:
52;;;
53;;; Pre-built packages that are used to bootstrap the
54;;; distribution--i.e., to build all the core packages from scratch.
55;;;
56;;; Code:
57
58
59\f
60;;;
61;;; Helper procedures.
62;;;
63
64(define (bootstrap-origin source)
65 "Return a variant of SOURCE, an <origin> instance, whose method uses
66%BOOTSTRAP-GUILE to do its job."
67 (define (boot fetch)
f220a838 68 (lambda* (url hash-algo hash
18633d4f 69 #:optional name #:key system)
52c0c82f 70 (fetch url hash-algo hash name
18633d4f
LC
71 #:guile %bootstrap-guile
72 #:system system)))
73
5fbeb4e6
LC
74 (define %bootstrap-patch-inputs
75 ;; Packages used when an <origin> has a non-empty 'patches' field.
76 `(("tar" ,%bootstrap-coreutils&co)
77 ("xz" ,%bootstrap-coreutils&co)
78 ("bzip2" ,%bootstrap-coreutils&co)
79 ("gzip" ,%bootstrap-coreutils&co)
80 ("patch" ,%bootstrap-coreutils&co)))
81
18633d4f
LC
82 (let ((orig-method (origin-method source)))
83 (origin (inherit source)
87f5d366 84 (method (cond ((eq? orig-method url-fetch)
62cab99c 85 (boot url-fetch))
5fbeb4e6
LC
86 (else orig-method)))
87 (patch-guile %bootstrap-guile)
ce517b20
LC
88 (patch-inputs %bootstrap-patch-inputs)
89
90 ;; Patches can be origins as well, so process them.
91 (patches (map (match-lambda
92 ((? origin? patch)
93 (bootstrap-origin patch))
94 (patch patch))
95 (origin-patches source))))))
18633d4f 96
2959dbe9
MW
97(define* (package-from-tarball name source program-to-test description
98 #:key snippet)
dfb52abb 99 "Return a package that correspond to the extraction of SOURCE.
ad1656dc
MW
100PROGRAM-TO-TEST is a program to run after extraction of SOURCE, to check
101whether everything is alright. If SNIPPET is provided, it is evaluated after
102extracting SOURCE. SNIPPET should raise an exception to signal an error; its
103return value is ignored."
18633d4f 104 (package
dfb52abb 105 (name name)
18633d4f 106 (version "0")
18633d4f
LC
107 (build-system trivial-build-system)
108 (arguments
109 `(#:guile ,%bootstrap-guile
110 #:modules ((guix build utils))
111 #:builder
112 (let ((out (assoc-ref %outputs "out"))
113 (tar (assoc-ref %build-inputs "tar"))
114 (xz (assoc-ref %build-inputs "xz"))
115 (tarball (assoc-ref %build-inputs "tarball")))
116 (use-modules (guix build utils))
117
118 (mkdir out)
119 (copy-file tarball "binaries.tar.xz")
ad1656dc 120 (invoke xz "-d" "binaries.tar.xz")
18633d4f
LC
121 (let ((builddir (getcwd)))
122 (with-directory-excursion out
ad1656dc
MW
123 (invoke tar "xvf"
124 (string-append builddir "/binaries.tar"))
125 ,@(if snippet (list snippet) '())
126 (invoke (string-append "bin/" ,program-to-test)
127 "--version"))))))
18633d4f 128 (inputs
dd6b9a37
LC
129 `(("tar" ,(search-bootstrap-binary "tar" (%current-system)))
130 ("xz" ,(search-bootstrap-binary "xz" (%current-system)))
dfb52abb
LC
131 ("tarball" ,(bootstrap-origin (source (%current-system))))))
132 (source #f)
133 (synopsis description)
7de1f103 134 (description description)
1fb78cb2 135 (home-page #f)
90f2801e 136 (license gpl3+)))
18633d4f
LC
137
138(define package-with-bootstrap-guile
6d7b26a3 139 (mlambdaq (p)
18633d4f
LC
140 "Return a variant of P such that all its origins are fetched with
141%BOOTSTRAP-GUILE."
142 (define rewritten-input
143 (match-lambda
55b2d921
LC
144 ((name (? origin? o))
145 `(,name ,(bootstrap-origin o)))
146 ((name (? package? p) sub-drvs ...)
147 `(,name ,(package-with-bootstrap-guile p) ,@sub-drvs))
148 (x x)))
18633d4f
LC
149
150 (package (inherit p)
55b2d921
LC
151 (source (match (package-source p)
152 ((? origin? o) (bootstrap-origin o))
153 (s s)))
154 (inputs (map rewritten-input
155 (package-inputs p)))
156 (native-inputs (map rewritten-input
157 (package-native-inputs p)))
158 (propagated-inputs (map rewritten-input
159 (package-propagated-inputs p)))
160 (replacement (and=> (package-replacement p)
161 package-with-bootstrap-guile)))))
18633d4f 162
e7133c76
LC
163(define* (glibc-dynamic-linker
164 #:optional (system (or (and=> (%current-target-system)
165 gnu-triplet->nix-system)
166 (%current-system))))
18633d4f 167 "Return the name of Glibc's dynamic linker for SYSTEM."
c89e2107 168 ;; See the 'SYSDEP_KNOWN_INTERPRETER_NAMES' cpp macro in libc.
18633d4f
LC
169 (cond ((string=? system "x86_64-linux") "/lib/ld-linux-x86-64.so.2")
170 ((string=? system "i686-linux") "/lib/ld-linux.so.2")
3f00ff8b 171 ((string=? system "armhf-linux") "/lib/ld-linux-armhf.so.3")
827d2891 172 ((string=? system "mips64el-linux") "/lib/ld.so.1")
66feaa32
MB
173 ((string=? system "i586-gnu") "/lib/ld.so.1")
174 ((string=? system "i686-gnu") "/lib/ld.so.1")
19c444f4 175 ((string=? system "aarch64-linux") "/lib/ld-linux-aarch64.so.1")
4a6f099e 176 ((string=? system "powerpc-linux") "/lib/ld.so.1")
c89e2107 177 ((string=? system "powerpc64le-linux") "/lib/ld64.so.2")
605fec78 178 ((string=? system "alpha-linux") "/lib/ld-linux.so.2")
b91004c2 179 ((string=? system "s390x-linux") "/lib/ld64.so.1")
7180dd67 180 ((string=? system "riscv64-linux") "/lib/ld-linux-riscv64-lp64d.so.1")
9d307460
LC
181
182 ;; XXX: This one is used bare-bones, without a libc, so add a case
183 ;; here just so we can keep going.
7f2d67c8 184 ((string=? system "arm-elf") "no-ld.so")
35a37efb 185 ((string=? system "arm-eabi") "no-ld.so")
9d307460 186 ((string=? system "xtensa-elf") "no-ld.so")
a5b60e3c 187 ((string=? system "avr") "no-ld.so")
6f5b1c91 188 ((string=? system "propeller-elf") "no-ld.so")
3135b95f 189 ((string=? system "i686-mingw") "no-ld.so")
7cf06d62 190 ((string=? system "vc4-elf") "no-ld.so")
9d307460 191
18633d4f
LC
192 (else (error "dynamic linker name not known for this system"
193 system))))
194
195\f
196;;;
197;;; Bootstrap packages.
198;;;
199
5c93d233
LC
200(define %bootstrap-base-urls
201 ;; This is where the initial binaries come from.
894fc4e9 202 '("https://alpha.gnu.org/gnu/guix/bootstrap"
5c93d233 203 "http://alpha.gnu.org/gnu/guix/bootstrap"
894fc4e9 204 "ftp://alpha.gnu.org/gnu/guix/bootstrap"
5c93d233
LC
205 "http://www.fdn.fr/~lcourtes/software/guix/packages"
206 "http://flashner.co.il/guix/bootstrap"))
207
208(define (bootstrap-guile-url-path system)
209 "Return the URI for FILE."
210 (string-append "/" system
211 (match system
212 ("aarch64-linux"
213 "/20170217/guile-2.0.14.tar.xz")
214 ("armhf-linux"
215 "/20150101/guile-2.0.11.tar.xz")
216 (_
217 "/20131110/guile-2.0.9.tar.xz"))))
218
219(define (bootstrap-guile-hash system)
220 "Return the SHA256 hash of the Guile bootstrap tarball for SYSTEM."
221 (match system
222 ("x86_64-linux"
223 (base32 "1w2p5zyrglzzniqgvyn1b55vprfzhgk8vzbzkkbdgl5248si0yq3"))
224 ("i686-linux"
225 (base32 "0im800m30abgh7msh331pcbjvb4n02smz5cfzf1srv0kpx3csmxp"))
226 ("mips64el-linux"
227 (base32 "0fzp93lvi0hn54acc0fpvhc7bvl0yc853k62l958cihk03q80ilr"))
228 ("armhf-linux"
229 (base32 "1mi3brl7l58aww34rawhvja84xc7l1b4hmwdmc36fp9q9mfx0lg5"))
230 ("aarch64-linux"
231 (base32 "1giy2aprjmn5fp9c4s9r125fljw4wv6ixy5739i5bffw4jgr0f9r"))))
232
3e5750af
LC
233(define (bootstrap-guile-origin system)
234 "Return an <origin> object for the Guile tarball of SYSTEM."
235 (origin
236 (method url-fetch)
237 (uri (map (cute string-append <> (bootstrap-guile-url-path system))
238 %bootstrap-base-urls))
239 (sha256 (bootstrap-guile-hash system))))
240
5c93d233
LC
241(define (download-bootstrap-guile store system)
242 "Return a derivation that downloads the bootstrap Guile tarball for SYSTEM."
243 (let* ((path (bootstrap-guile-url-path system))
244 (base (basename path))
245 (urls (map (cut string-append <> path) %bootstrap-base-urls)))
246 (run-with-store store
247 (url-fetch urls 'sha256 (bootstrap-guile-hash system)
248 #:system system))))
249
0d5a559f
LC
250(define* (raw-build store name inputs
251 #:key outputs system search-paths
252 #:allow-other-keys)
253 (define (->store file)
254 (add-to-store store file #t "sha256"
255 (or (search-bootstrap-binary file
256 system)
257 (error "bootstrap binary not found"
258 file system))))
259
260 (let* ((tar (->store "tar"))
261 (xz (->store "xz"))
262 (mkdir (->store "mkdir"))
263 (bash (->store "bash"))
5c93d233 264 (guile (download-bootstrap-guile store system))
5d6792f0
MW
265 ;; The following code, run by the bootstrap guile after it is
266 ;; unpacked, creates a wrapper for itself to set its load path.
267 ;; This replaces the previous non-portable method based on
268 ;; reading the /proc/self/exe symlink.
269 (make-guile-wrapper
270 '(begin
271 (use-modules (ice-9 match))
272 (match (command-line)
273 ((_ out bash)
274 (let ((bin-dir (string-append out "/bin"))
275 (guile (string-append out "/bin/guile"))
276 (guile-real (string-append out "/bin/.guile-real"))
277 ;; We must avoid using a bare dollar sign in this code,
278 ;; because it would be interpreted by the shell.
279 (dollar (string (integer->char 36))))
280 (chmod bin-dir #o755)
281 (rename-file guile guile-real)
282 (call-with-output-file guile
283 (lambda (p)
284 (format p "\
285#!~a
286export GUILE_SYSTEM_PATH=~a/share/guile/2.0
287export GUILE_SYSTEM_COMPILED_PATH=~a/lib/guile/2.0/ccache
288exec -a \"~a0\" ~a \"~a@\"\n"
289 bash out out dollar guile-real dollar)))
290 (chmod guile #o555)
291 (chmod bin-dir #o555))))))
0d5a559f
LC
292 (builder
293 (add-text-to-store store
294 "build-bootstrap-guile.sh"
295 (format #f "
296echo \"unpacking bootstrap Guile to '$out'...\"
297~a $out
298cd $out
5c93d233 299~a -dc < $GUILE_TARBALL | ~a xv
0d5a559f 300
5d6792f0
MW
301# Use the bootstrap guile to create its own wrapper to set the load path.
302GUILE_SYSTEM_PATH=$out/share/guile/2.0 \
303GUILE_SYSTEM_COMPILED_PATH=$out/lib/guile/2.0/ccache \
304$out/bin/guile -c ~s $out ~a
305
0d5a559f
LC
306# Sanity check.
307$out/bin/guile --version~%"
5c93d233 308 mkdir xz tar
5d6792f0
MW
309 (format #f "~s" make-guile-wrapper)
310 bash)
5c93d233 311 (list mkdir xz tar bash))))
0d5a559f
LC
312 (derivation store name
313 bash `(,builder)
314 #:system system
5c93d233
LC
315 #:inputs `((,bash) (,builder) (,guile))
316 #:env-vars `(("GUILE_TARBALL"
317 . ,(derivation->output-path guile))))))
0d5a559f
LC
318
319(define* (make-raw-bag name
d3d337d2
LC
320 #:key source inputs native-inputs outputs
321 system target)
0d5a559f
LC
322 (bag
323 (name name)
d3d337d2 324 (system system)
0d5a559f
LC
325 (build-inputs inputs)
326 (build raw-build)))
327
18633d4f
LC
328(define %bootstrap-guile
329 ;; The Guile used to run the build scripts of the initial derivations.
330 ;; It is just unpacked from a tarball containing a pre-built binary.
331 ;; This is typically built using %GUILE-BOOTSTRAP-TARBALL below.
332 ;;
333 ;; XXX: Would need libc's `libnss_files2.so' for proper `getaddrinfo'
334 ;; support (for /etc/services).
335 (let ((raw (build-system
0d5a559f
LC
336 (name 'raw)
337 (description "Raw build system with direct store access")
338 (lower make-raw-bag))))
18633d4f
LC
339 (package
340 (name "guile-bootstrap")
341 (version "2.0")
342 (source #f)
343 (build-system raw)
344 (synopsis "Bootstrap Guile")
345 (description "Pre-built Guile for bootstrapping purposes.")
346 (home-page #f)
4a44e743 347 (license lgpl3+))))
18633d4f 348
18633d4f
LC
349(define %bootstrap-coreutils&co
350 (package-from-tarball "bootstrap-binaries"
351 (lambda (system)
352 (origin
87f5d366 353 (method url-fetch)
04732c37 354 (uri (map (cut string-append <> "/" system
aa1e1947
MW
355 (match system
356 ("armhf-linux"
357 "/20150101/static-binaries.tar.xz")
3b88f376
EF
358 ("aarch64-linux"
359 "/20170217/static-binaries.tar.xz")
aa1e1947
MW
360 (_
361 "/20131110/static-binaries.tar.xz")))
04732c37 362 %bootstrap-base-urls))
18633d4f
LC
363 (sha256
364 (match system
365 ("x86_64-linux"
366 (base32
06213498 367 "0c533p9dhczzcsa1117gmfq3pc8w362g4mx84ik36srpr7cx2bg4"))
18633d4f
LC
368 ("i686-linux"
369 (base32
06213498 370 "0s5b3jb315n13m1k8095l0a5hfrsz8g0fv1b6riyc5hnxqyphlak"))
aa1e1947
MW
371 ("armhf-linux"
372 (base32
373 "0gf0fn2kbpxkjixkmx5f4z6hv6qpmgixl69zgg74dbsfdfj8jdv5"))
3b88f376
EF
374 ("aarch64-linux"
375 (base32
376 "18dfiq6c6xhsdpbidigw6480wh0vdgsxqq3xindq4lpdgqlccpfh"))
f57ff219
MW
377 ("mips64el-linux"
378 (base32
06213498 379 "072y4wyfsj1bs80r6vbybbafy8ya4vfy7qj25dklwk97m6g71753"))))))
84cbe39c
MW
380 "fgrep" ; the program to test
381 "Bootstrap binaries of Coreutils, Awk, etc."
382 #:snippet
383 '(let ((path (list (string-append (getcwd) "/bin"))))
384 (chmod "bin" #o755)
385 (patch-shebang "bin/egrep" path)
386 (patch-shebang "bin/fgrep" path)
653add37
EF
387 ;; Starting with grep@2.25 'egrep' and 'fgrep' are shell files
388 ;; that call 'grep'. If the bootstrap 'egrep' and 'fgrep'
389 ;; are not binaries then patch them to execute 'grep' via its
390 ;; absolute file name instead of searching for it in $PATH.
391 (if (not (elf-file? "bin/egrep"))
392 (substitute* '("bin/egrep" "bin/fgrep")
393 (("^exec grep") (string-append (getcwd) "/bin/grep"))))
ad1656dc 394 (chmod "bin" #o555))))
18633d4f
LC
395
396(define %bootstrap-binutils
397 (package-from-tarball "binutils-bootstrap"
398 (lambda (system)
399 (origin
87f5d366 400 (method url-fetch)
04732c37 401 (uri (map (cut string-append <> "/" system
aa1e1947
MW
402 (match system
403 ("armhf-linux"
404 "/20150101/binutils-2.25.tar.xz")
3b88f376
EF
405 ("aarch64-linux"
406 "/20170217/binutils-2.27.tar.xz")
aa1e1947
MW
407 (_
408 "/20131110/binutils-2.23.2.tar.xz")))
04732c37 409 %bootstrap-base-urls))
18633d4f
LC
410 (sha256
411 (match system
412 ("x86_64-linux"
413 (base32
06213498 414 "1j5yivz7zkjqfsfmxzrrrffwyayjqyfxgpi89df0w4qziqs2dg20"))
18633d4f
LC
415 ("i686-linux"
416 (base32
06213498 417 "14jgwf9gscd7l2pnz610b1zia06dvcm2qyzvni31b8zpgmcai2v9"))
aa1e1947
MW
418 ("armhf-linux"
419 (base32
420 "1v7dj6bzn6m36f20gw31l99xaabq4xrhrx3gwqkhhig0mdlmr69q"))
3b88f376
EF
421 ("aarch64-linux"
422 (base32
423 "111s7ilfiby033rczc71797xrmaa3qlv179wdvsaq132pd51xv3n"))
f57ff219
MW
424 ("mips64el-linux"
425 (base32
06213498 426 "1x8kkhcxmfyzg1ddpz2pxs6fbdl6412r7x0nzbmi5n7mj8zw2gy7"))))))
18633d4f
LC
427 "ld" ; the program to test
428 "Bootstrap binaries of the GNU Binutils"))
429
430(define %bootstrap-glibc
431 ;; The initial libc.
432 (package
433 (name "glibc-bootstrap")
434 (version "0")
435 (source #f)
436 (build-system trivial-build-system)
437 (arguments
438 `(#:guile ,%bootstrap-guile
439 #:modules ((guix build utils))
440 #:builder
441 (let ((out (assoc-ref %outputs "out"))
442 (tar (assoc-ref %build-inputs "tar"))
443 (xz (assoc-ref %build-inputs "xz"))
444 (tarball (assoc-ref %build-inputs "tarball")))
445 (use-modules (guix build utils))
446
447 (mkdir out)
448 (copy-file tarball "binaries.tar.xz")
ad1656dc 449 (invoke xz "-d" "binaries.tar.xz")
18633d4f
LC
450 (let ((builddir (getcwd)))
451 (with-directory-excursion out
ad1656dc
MW
452 (invoke tar "xvf"
453 (string-append builddir
454 "/binaries.tar"))
18633d4f
LC
455 (chmod "lib" #o755)
456
457 ;; Patch libc.so so it refers to the right path.
458 (substitute* "lib/libc.so"
459 (("/[^ ]+/lib/(libc|ld)" _ prefix)
ad1656dc
MW
460 (string-append out "/lib/" prefix)))
461
462 #t)))))
18633d4f 463 (inputs
dd6b9a37
LC
464 `(("tar" ,(search-bootstrap-binary "tar" (%current-system)))
465 ("xz" ,(search-bootstrap-binary "xz" (%current-system)))
466 ("tarball" ,(bootstrap-origin
467 (origin
468 (method url-fetch)
469 (uri (map (cut string-append <> "/" (%current-system)
aa1e1947
MW
470 (match (%current-system)
471 ("armhf-linux"
472 "/20150101/glibc-2.20.tar.xz")
3b88f376
EF
473 ("aarch64-linux"
474 "/20170217/glibc-2.25.tar.xz")
aa1e1947
MW
475 (_
476 "/20131110/glibc-2.18.tar.xz")))
dd6b9a37
LC
477 %bootstrap-base-urls))
478 (sha256
479 (match (%current-system)
480 ("x86_64-linux"
481 (base32
06213498 482 "0jlqrgavvnplj1b083s20jj9iddr4lzfvwybw5xrcis9spbfzk7v"))
dd6b9a37
LC
483 ("i686-linux"
484 (base32
06213498 485 "1hgrccw1zqdc7lvgivwa54d9l3zsim5pqm0dykxg0z522h6gr05w"))
aa1e1947
MW
486 ("armhf-linux"
487 (base32
488 "18cmgvpllqfpn6khsmivqib7ys8ymnq0hdzi3qp24prik0ykz8gn"))
3b88f376
EF
489 ("aarch64-linux"
490 (base32
491 "07nx3x8598i2924rjnlrncg6rm61c9bmcczbbcpbx0fb742nvv5c"))
f57ff219
MW
492 ("mips64el-linux"
493 (base32
06213498 494 "0k97a3whzx3apsi9n2cbsrr79ad6lh00klxph9hw4fqyp1abkdsg")))))))))
18633d4f 495 (synopsis "Bootstrap binaries and headers of the GNU C Library")
7de1f103 496 (description synopsis)
1fb78cb2
LC
497 (home-page #f)
498 (license lgpl2.1+)))
18633d4f
LC
499
500(define %bootstrap-gcc
501 ;; The initial GCC. Uses binaries from a tarball typically built by
502 ;; %GCC-BOOTSTRAP-TARBALL.
503 (package
504 (name "gcc-bootstrap")
505 (version "0")
506 (source #f)
507 (build-system trivial-build-system)
508 (arguments
21c203a5
LC
509 `(#:guile ,%bootstrap-guile
510 #:modules ((guix build utils))
511 #:builder
512 (let ((out (assoc-ref %outputs "out"))
513 (tar (assoc-ref %build-inputs "tar"))
514 (xz (assoc-ref %build-inputs "xz"))
515 (bash (assoc-ref %build-inputs "bash"))
516 (libc (assoc-ref %build-inputs "libc"))
517 (tarball (assoc-ref %build-inputs "tarball")))
518 (use-modules (guix build utils)
519 (ice-9 popen))
18633d4f 520
21c203a5
LC
521 (mkdir out)
522 (copy-file tarball "binaries.tar.xz")
ad1656dc 523 (invoke xz "-d" "binaries.tar.xz")
21c203a5
LC
524 (let ((builddir (getcwd))
525 (bindir (string-append out "/bin")))
526 (with-directory-excursion out
ad1656dc
MW
527 (invoke tar "xvf"
528 (string-append builddir "/binaries.tar")))
18633d4f 529
21c203a5
LC
530 (with-directory-excursion bindir
531 (chmod "." #o755)
532 (rename-file "gcc" ".gcc-wrapped")
533 (call-with-output-file "gcc"
534 (lambda (p)
535 (format p "#!~a
18633d4f
LC
536exec ~a/bin/.gcc-wrapped -B~a/lib \
537 -Wl,-rpath -Wl,~a/lib \
538 -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
21c203a5
LC
539 bash
540 out libc libc libc
541 ,(glibc-dynamic-linker))))
18633d4f 542
ad1656dc
MW
543 (chmod "gcc" #o555)
544 #t)))))
18633d4f 545 (inputs
dd6b9a37
LC
546 `(("tar" ,(search-bootstrap-binary "tar" (%current-system)))
547 ("xz" ,(search-bootstrap-binary "xz" (%current-system)))
548 ("bash" ,(search-bootstrap-binary "bash" (%current-system)))
18633d4f 549 ("libc" ,%bootstrap-glibc)
dd6b9a37
LC
550 ("tarball" ,(bootstrap-origin
551 (origin
552 (method url-fetch)
553 (uri (map (cut string-append <> "/" (%current-system)
aa1e1947
MW
554 (match (%current-system)
555 ("armhf-linux"
556 "/20150101/gcc-4.8.4.tar.xz")
3b88f376
EF
557 ("aarch64-linux"
558 "/20170217/gcc-5.4.0.tar.xz")
aa1e1947
MW
559 (_
560 "/20131110/gcc-4.8.2.tar.xz")))
dd6b9a37
LC
561 %bootstrap-base-urls))
562 (sha256
563 (match (%current-system)
564 ("x86_64-linux"
565 (base32
06213498 566 "17ga4m6195n4fnbzdkmik834znkhs53nkypp6557pl1ps7dgqbls"))
dd6b9a37
LC
567 ("i686-linux"
568 (base32
06213498 569 "150c1arrf2k8vfy6dpxh59vcgs4p1bgiz2av5m19dynpks7rjnyw"))
aa1e1947
MW
570 ("armhf-linux"
571 (base32
572 "0ghz825yzp43fxw53kd6afm8nkz16f7dxi9xi40bfwc8x3nbbr8v"))
3b88f376
EF
573 ("aarch64-linux"
574 (base32
575 "1ar3vdzyqbfm0z36kmvazvfswxhcihlacl2dzdjgiq25cqnq9ih1"))
f57ff219
MW
576 ("mips64el-linux"
577 (base32
06213498 578 "1m5miqkyng45l745n0sfafdpjkqv9225xf44jqkygwsipj2cv9ks")))))))))
a18eda27
LC
579 (native-search-paths
580 (list (search-path-specification
581 (variable "CPATH")
af070955 582 (files '("include")))
a18eda27
LC
583 (search-path-specification
584 (variable "LIBRARY_PATH")
af070955 585 (files '("lib" "lib64")))))
18633d4f 586 (synopsis "Bootstrap binaries of the GNU Compiler Collection")
7de1f103 587 (description synopsis)
1fb78cb2
LC
588 (home-page #f)
589 (license gpl3+)))
18633d4f
LC
590
591(define %bootstrap-inputs
592 ;; The initial, pre-built inputs. From now on, we can start building our
593 ;; own packages.
594 `(("libc" ,%bootstrap-glibc)
595 ("gcc" ,%bootstrap-gcc)
596 ("binutils" ,%bootstrap-binutils)
9d1d434c
LC
597 ("coreutils&co" ,%bootstrap-coreutils&co)
598
599 ;; In gnu-build-system.scm, we rely on the availability of Bash.
600 ("bash" ,%bootstrap-coreutils&co)))
18633d4f
LC
601
602;;; bootstrap.scm ends here