123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954 |
- ;;; GNU Guix --- Functional package management for GNU
- ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
- ;;; Copyright © 2014, 2015, 2018, 2019 Mark H Weaver <mhw@netris.org>
- ;;; Copyright © 2017, 2020 Efraim Flashner <efraim@flashner.co.il>
- ;;; Copyright © 2018, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- ;;; Copyright © 2019 Carl Dong <contact@carldong.me>
- ;;; Copyright © 2019 Léo Le Bouter <lle-bout@zaclys.net>
- ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
- ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
- ;;;
- ;;; This file is part of GNU Guix.
- ;;;
- ;;; GNU Guix is free software; you can redistribute it and/or modify it
- ;;; under the terms of the GNU General Public License as published by
- ;;; the Free Software Foundation; either version 3 of the License, or (at
- ;;; your option) any later version.
- ;;;
- ;;; GNU Guix is distributed in the hope that it will be useful, but
- ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
- ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;;; GNU General Public License for more details.
- ;;;
- ;;; You should have received a copy of the GNU General Public License
- ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
- (define-module (gnu packages bootstrap)
- #:use-module (guix licenses)
- #:use-module (gnu packages)
- #:use-module (guix packages)
- #:use-module (guix download)
- #:use-module (guix build-system)
- #:use-module (guix build-system gnu)
- #:use-module (guix build-system trivial)
- #:use-module ((guix store)
- #:select (%store-monad interned-file text-file store-lift))
- #:use-module ((guix derivations)
- #:select (raw-derivation derivation-input derivation->output-path))
- #:use-module (guix utils)
- #:use-module ((guix build utils) #:select (elf-file?))
- #:use-module ((guix gexp) #:select (lower-object))
- #:use-module (guix monads)
- #:use-module (guix memoization)
- #:use-module (guix i18n)
- #:use-module (srfi srfi-1)
- #:use-module (srfi srfi-26)
- #:use-module (srfi srfi-34)
- #:use-module (srfi srfi-35)
- #:use-module (ice-9 match)
- #:export (bootstrap-origin
- package-with-bootstrap-guile
- glibc-dynamic-linker
- bootstrap-executable
- bootstrap-guile-origin
- %bootstrap-guile
- %bootstrap-coreutils&co
- %bootstrap-linux-libre-headers
- %bootstrap-binutils
- %bootstrap-gcc
- %bootstrap-glibc
- %bootstrap-inputs
- %bootstrap-mescc-tools
- %bootstrap-mes
- %bootstrap-inputs-for-tests))
- ;;; Commentary:
- ;;;
- ;;; Pre-built packages that are used to bootstrap the
- ;;; distribution--i.e., to build all the core packages from scratch.
- ;;;
- ;;; Code:
- ;;;
- ;;; The bootstrap executables: 'bash', 'mkdir', 'tar', 'xz'. They allow us to
- ;;; extract the very first tarball.
- ;;;
- (define %bootstrap-executables
- ;; List of bootstrap executables and their recursive hashes (as per 'guix
- ;; hash -r'), taking their executable bit into account.
- `(("aarch64-linux"
- ("bash"
- ,(base32 "13aqhqb8nydlwq1ah9974q0iadx1pb95v13wzzyf7vgv6nasrwzr"))
- ("mkdir"
- ,(base32 "1pxhdp7ldwavmm71xbh9wc197cb2nr66acjn26yjx3732cixh9ws"))
- ("tar"
- ,(base32 "1j51gv08sfg277yxj73xd564wjq3f8xwd6s9rbcg8v9gms47m4cx"))
- ("xz"
- ,(base32 "1d779rwsrasphg5g3r37qppcqy3p7ay1jb1y83w7x4i3qsc7zjy2")))
- ("powerpc-linux"
- ("bash"
- ,(base32 "0hwlw5lcyjzadprf5fm0cv4zb6jw667g9amnmhq0lbixasy7j72j"))
- ("mkdir"
- ,(base32 "12lfwh5p8pp06250wgi9mdvjv1jdfpd5xpmvfc0616aj0xqh09hp"))
- ("tar"
- ,(base32 "00sbmwl8qh6alxv9mw4hvj1j4yipwmw5mrw6qad8bi2pr7ya5386"))
- ("xz"
- ,(base32 "0hi47y6zh5zz137i59l5ibw92x6g54zn7ris1b1ym9rvavsasg7b")))
- ("armhf-linux"
- ("bash"
- ,(base32 "0s6f1s26g4dsrrkl39zblvwpxmbzi6n9mgqf6vxsqz42gik6bgyn"))
- ("mkdir"
- ,(base32 "1r5rcp35niyxfkrdf00y2ba8ifrq9bi76cr63lwjf2l655j1i5p7"))
- ("tar"
- ,(base32 "0dksx5im3fv8ximz7368bsax9f26nn47ds74298flm5lnvpv9xly"))
- ("xz"
- ,(base32 "1cqqavghjfr0iwxqf61lrssv27wfigysgq2rs4rm1gkmn04yn1k3")))
- ("i686-linux"
- ("bash"
- ,(base32 "0rjaxyzjdllfkf1abczvgaf3cdcc7mmahyvdbkjmjzhgz92pv23g"))
- ("mkdir"
- ,(base32 "133ybmfpkmsnysrzbngwvbysqnsmfi8is8zifs7i7n6n600h4s1w"))
- ("tar"
- ,(base32 "07830bx29ad5i0l1ykj0g0b1jayjdblf01sr3ww9wbnwdbzinqms"))
- ("xz"
- ,(base32 "0i9kxdi17bm5gxfi2xzm0y73p3ii0cqxli1sbljm6rh2fjgyn90k")))
- ("i586-gnu"
- ("bash"
- ,(base32 "1as8649aqaibahhhrvkj10ci8shpi4hq5n7gnik8rhhy0dc1jarg"))
- ("mkdir"
- ,(base32 "1snqgpfrl00hfn82lm29jqylzjsfb9jd6ha74dp12phwb8fpbmb9"))
- ("tar"
- ,(base32 "0nq2c1zb3wv5bf7kd83sziaashydazrn7xgq6kijlk0zj2syzc2m"))
- ("xz"
- ,(base32 "033rhpk6zrpxpd6ffjyg5y2zwq9x9cnq0zljb7k8jlncbalsayq5")))
- ("mips64el-linux"
- ("bash"
- ,(base32 "1aw046dhda240k9pb9iaj5aqkm23gkvxa9j82n4k7fk87nbrixw6"))
- ("mkdir"
- ,(base32 "0c9j6qgyw84zxbry3ypifzll13gy8ax71w40kdk1h11jbgla3f5k"))
- ("tar"
- ,(base32 "06gmqdjq3rl8lr47b9fyx4ifnm5x56ymc8lyryp1ax1j2s4y5jb4"))
- ("xz"
- ,(base32 "09j1d69qr0hhhx4k4ih8wp00dfc9y4rp01hfg3vc15yxd0jxabh5")))
- ("powerpc64le-linux"
- ("bash"
- ,(base32 "1kiw7n6mkdy2x9in97646nb7aiayxr090ws1hbrlazah3fjqi6nj"))
- ("mkdir"
- ,(base32 "04dpvi231zcl40ig048vqqnyvmnkw1byrm1q1qqvs1f0g16yhrrk"))
- ("tar"
- ,(base32 "150c8948cz8r208g6qgn2dn4f4zs5kpgbpbg6bwag6yw42rapw2l"))
- ("xz"
- ,(base32 "0v5738idy9pqzcbrjdpxi5c6qs5m78zrpsydmrpx5cfcfzbkxzjh")))))
- (define %bootstrap-executable-base-urls
- ;; This is where the bootstrap executables come from.
- '("https://git.savannah.gnu.org/cgit/guix.git/plain/gnu/packages/bootstrap/"
- "https://alpha.gnu.org/gnu/guix/bootstrap/"
- "http://flashner.co.il/guix/bootstrap/"
- "http://lilypond.org/janneke/guix/"))
- (define (bootstrap-executable-file-name system program)
- "Return the FILE-NAME part of url where PROGRAM can be found for SYSTEM."
- (match system
- ("powerpc64le-linux" (string-append system "/20210106/" program))
- ("i586-gnu" (string-append system "/20200326/" program))
- ("powerpc-linux" (string-append system "/20200923/bin/" program))
- (_ (string-append system "/" program
- "?id=44f07d1dc6806e97c4e9ee3e6be883cc59dc666e"))))
- (define bootstrap-executable
- (mlambda (program system)
- "Return an origin for PROGRAM, a statically-linked bootstrap executable
- built for SYSTEM."
- (let ((system (if (string=? system "x86_64-linux")
- "i686-linux"
- system)))
- (match (assoc-ref (assoc-ref %bootstrap-executables system)
- program)
- (#f
- (raise (condition
- (&message
- (message
- (format #f (G_ "could not find bootstrap binary '~a' \
- for system '~a'")
- program system))))))
- ((bv)
- (origin
- (method url-fetch/executable)
- (uri (map (cute string-append <>
- (bootstrap-executable-file-name system program))
- %bootstrap-executable-base-urls))
- (file-name program)
- (hash (content-hash bv sha256))))))))
- ;;;
- ;;; Helper procedures.
- ;;;
- (define bootstrap-origin
- (mlambdaq (source)
- "Return a variant of SOURCE, an <origin> instance, whose method uses
- %BOOTSTRAP-GUILE to do its job."
- (define (boot fetch)
- (lambda* (url hash-algo hash
- #:optional name #:key system)
- (fetch url hash-algo hash name
- #:guile %bootstrap-guile
- #:system system)))
- (define %bootstrap-patch-inputs
- ;; Packages used when an <origin> has a non-empty 'patches' field.
- `(("tar" ,%bootstrap-coreutils&co)
- ("xz" ,%bootstrap-coreutils&co)
- ("bzip2" ,%bootstrap-coreutils&co)
- ("gzip" ,%bootstrap-coreutils&co)
- ("patch" ,%bootstrap-coreutils&co)))
- (let ((orig-method (origin-method source)))
- (if (or (not (null? (origin-patches source)))
- (origin-snippet source))
- (origin (inherit source)
- (method (if (eq? orig-method url-fetch)
- (boot url-fetch)
- orig-method))
- (patch-guile %bootstrap-guile)
- (patch-inputs %bootstrap-patch-inputs)
- ;; Patches can be origins as well, so process them.
- (patches (map (match-lambda
- ((? origin? patch)
- (bootstrap-origin patch))
- (patch patch))
- (origin-patches source))))
- source))))
- (define* (package-from-tarball name source program-to-test description
- #:key snippet)
- "Return a package that correspond to the extraction of SOURCE.
- PROGRAM-TO-TEST is #f or a string: the program to run after extraction of
- SOURCE to check whether everything is alright. If SNIPPET is provided, it is
- evaluated after extracting SOURCE. SNIPPET should return true if successful,
- or false to signal an error."
- (package
- (name name)
- (version "0")
- (build-system trivial-build-system)
- (arguments
- `(#:guile ,%bootstrap-guile
- #:modules ((guix build utils))
- #:builder
- (begin
- (use-modules (guix build utils))
- (let ((out (assoc-ref %outputs "out"))
- (tar (assoc-ref %build-inputs "tar"))
- (xz (assoc-ref %build-inputs "xz"))
- (tarball (assoc-ref %build-inputs "tarball")))
- (mkdir out)
- (copy-file tarball "binaries.tar.xz")
- (invoke xz "-d" "binaries.tar.xz")
- (let ((builddir (getcwd)))
- (with-directory-excursion out
- (invoke tar "xvf"
- (string-append builddir "/binaries.tar"))
- ,@(if snippet (list snippet) '())
- (or (not ,program-to-test)
- (invoke (string-append "bin/" ,program-to-test)
- "--version"))))))))
- (inputs
- `(("tar" ,(bootstrap-executable "tar" (%current-system)))
- ("xz" ,(bootstrap-executable "xz" (%current-system)))
- ("tarball" ,(bootstrap-origin (source (%current-system))))))
- (source #f)
- (synopsis description)
- (description description)
- (home-page #f)
- (license gpl3+)))
- (define package-with-bootstrap-guile
- (mlambdaq (p)
- "Return a variant of P such that all its origins are fetched with
- %BOOTSTRAP-GUILE."
- (define rewritten-input
- (match-lambda
- ((name (? origin? o))
- `(,name ,(bootstrap-origin o)))
- ((name (? package? p) sub-drvs ...)
- `(,name ,(package-with-bootstrap-guile p) ,@sub-drvs))
- (x x)))
- (package (inherit p)
- (source (match (package-source p)
- ((? origin? o) (bootstrap-origin o))
- (s s)))
- (inputs (map rewritten-input
- (package-inputs p)))
- (native-inputs (map rewritten-input
- (package-native-inputs p)))
- (propagated-inputs (map rewritten-input
- (package-propagated-inputs p)))
- (replacement (and=> (package-replacement p)
- package-with-bootstrap-guile)))))
- (define* (glibc-dynamic-linker
- #:optional (system (or (and=> (%current-target-system)
- gnu-triplet->nix-system)
- (%current-system))))
- "Return the name of Glibc's dynamic linker for SYSTEM."
- ;; See the 'SYSDEP_KNOWN_INTERPRETER_NAMES' cpp macro in libc.
- (cond ((string=? system "x86_64-linux") "/lib/ld-linux-x86-64.so.2")
- ((string=? system "i686-linux") "/lib/ld-linux.so.2")
- ((string=? system "armhf-linux") "/lib/ld-linux-armhf.so.3")
- ((string=? system "mips64el-linux") "/lib/ld.so.1")
- ((string=? system "i586-gnu") "/lib/ld.so.1")
- ((string=? system "i686-gnu") "/lib/ld.so.1")
- ((string=? system "aarch64-linux") "/lib/ld-linux-aarch64.so.1")
- ((string=? system "powerpc-linux") "/lib/ld.so.1")
- ((string=? system "powerpc64-linux") "/lib/ld64.so.1")
- ((string=? system "powerpc64le-linux") "/lib/ld64.so.2")
- ((string=? system "alpha-linux") "/lib/ld-linux.so.2")
- ((string=? system "s390x-linux") "/lib/ld64.so.1")
- ((string=? system "riscv64-linux") "/lib/ld-linux-riscv64-lp64d.so.1")
- ;; XXX: This one is used bare-bones, without a libc, so add a case
- ;; here just so we can keep going.
- ((string=? system "arm-elf") "no-ld.so")
- ((string=? system "arm-eabi") "no-ld.so")
- ((string=? system "xtensa-elf") "no-ld.so")
- ((string=? system "avr") "no-ld.so")
- ((string=? system "propeller-elf") "no-ld.so")
- ((string=? system "i686-mingw") "no-ld.so")
- ((string=? system "x86_64-mingw") "no-ld.so")
- ((string=? system "vc4-elf") "no-ld.so")
- (else (error "dynamic linker name not known for this system"
- system))))
- ;;;
- ;;; Bootstrap packages.
- ;;;
- (define %bootstrap-base-urls
- ;; This is where the initial binaries come from.
- '("https://ftp.gnu.org/gnu/guix/bootstrap"
- "https://alpha.gnu.org/gnu/guix/bootstrap"
- "http://ftp.gnu.org/gnu/guix/bootstrap"
- "http://alpha.gnu.org/gnu/guix/bootstrap"
- "ftp://alpha.gnu.org/gnu/guix/bootstrap"
- "http://www.fdn.fr/~lcourtes/software/guix/packages"
- "http://flashner.co.il/guix/bootstrap"
- "http://lilypond.org/janneke/guix/"))
- (define (bootstrap-guile-url-path system)
- "Return the URI for FILE."
- (string-append "/" system
- (match system
- ("aarch64-linux"
- "/20170217/guile-2.0.14.tar.xz")
- ("powerpc-linux"
- "/20200923/guile-2.0.14.tar.xz")
- ("armhf-linux"
- "/20150101/guile-2.0.11.tar.xz")
- ("i586-gnu"
- "/20200326/guile-static-stripped-2.0.14-i586-pc-gnu.tar.xz")
- ("powerpc64le-linux"
- "/20210106/guile-static-stripped-2.0.14-powerpc64le-linux-gnu.tar.xz")
- (_
- "/20131110/guile-2.0.9.tar.xz"))))
- (define (bootstrap-guile-hash system)
- "Return the SHA256 hash of the Guile bootstrap tarball for SYSTEM."
- (match system
- ("x86_64-linux"
- (base32 "1w2p5zyrglzzniqgvyn1b55vprfzhgk8vzbzkkbdgl5248si0yq3"))
- ("i686-linux"
- (base32 "0im800m30abgh7msh331pcbjvb4n02smz5cfzf1srv0kpx3csmxp"))
- ("mips64el-linux"
- (base32 "0fzp93lvi0hn54acc0fpvhc7bvl0yc853k62l958cihk03q80ilr"))
- ("armhf-linux"
- (base32 "1mi3brl7l58aww34rawhvja84xc7l1b4hmwdmc36fp9q9mfx0lg5"))
- ("powerpc64le-linux"
- (base32 "1rnyfz5q38jyvxddj617443bnnzql4vw0mxzqpj8wz48wx4bhbq0"))
- ("aarch64-linux"
- (base32 "1giy2aprjmn5fp9c4s9r125fljw4wv6ixy5739i5bffw4jgr0f9r"))
- ("i586-gnu"
- (base32 "0wgqpsmvg25rnqn49ap7kwd2qxccd8dr4lllzp7i3rjvgav27vac"))
- ("powerpc-linux"
- (base32 "1by2p7s27fbyjzfkcw8h65h4kkqh7d23kv4sgg5jppjn2qx7swq4"))))
- (define (bootstrap-guile-origin system)
- "Return an <origin> object for the Guile tarball of SYSTEM."
- (origin
- (method url-fetch)
- (uri (map (cute string-append <> (bootstrap-guile-url-path system))
- %bootstrap-base-urls))
- (sha256 (bootstrap-guile-hash system))))
- (define (download-bootstrap-guile system)
- "Return a derivation that downloads the bootstrap Guile tarball for SYSTEM."
- (let* ((path (bootstrap-guile-url-path system))
- (base (basename path))
- (urls (map (cut string-append <> path) %bootstrap-base-urls)))
- (url-fetch urls 'sha256 (bootstrap-guile-hash system)
- #:system system)))
- (define* (raw-build name inputs
- #:key outputs system search-paths
- #:allow-other-keys)
- (define (->store file)
- (lower-object (bootstrap-executable file system)
- system))
- (define (make-guile-wrapper bash guile-real)
- ;; The following code, run by the bootstrap guile after it is unpacked,
- ;; creates a wrapper for itself to set its load path. This replaces the
- ;; previous non-portable method based on reading the /proc/self/exe
- ;; symlink.
- '(begin
- (use-modules (ice-9 match))
- (match (command-line)
- ((_ out bash)
- (let ((bin-dir (string-append out "/bin"))
- (guile (string-append out "/bin/guile"))
- (guile-real (string-append out "/bin/.guile-real"))
- ;; We must avoid using a bare dollar sign in this code,
- ;; because it would be interpreted by the shell.
- (dollar (string (integer->char 36))))
- (chmod bin-dir #o755)
- (rename-file guile guile-real)
- (call-with-output-file guile
- (lambda (p)
- (format p "\
- #!~a
- export GUILE_SYSTEM_PATH=~a/share/guile/2.0
- export GUILE_SYSTEM_COMPILED_PATH=~a/lib/guile/2.0/ccache
- exec -a \"~a0\" ~a \"~a@\"\n"
- bash out out dollar guile-real dollar)))
- (chmod guile #o555)
- (chmod bin-dir #o555))))))
- (mlet* %store-monad ((tar (->store "tar"))
- (xz (->store "xz"))
- (mkdir (->store "mkdir"))
- (bash (->store "bash"))
- (guile (download-bootstrap-guile system))
- (wrapper -> (make-guile-wrapper bash guile))
- (builder
- (text-file "build-bootstrap-guile.sh"
- (format #f "
- echo \"unpacking bootstrap Guile to '$out'...\"
- ~a $out
- cd $out
- ~a -dc < $GUILE_TARBALL | ~a xv
- # Use the bootstrap guile to create its own wrapper to set the load path.
- GUILE_SYSTEM_PATH=$out/share/guile/2.0 \
- GUILE_SYSTEM_COMPILED_PATH=$out/lib/guile/2.0/ccache \
- $out/bin/guile -c ~s $out ~a
- # Sanity check.
- $out/bin/guile --version~%"
- (derivation->output-path mkdir)
- (derivation->output-path xz)
- (derivation->output-path tar)
- (object->string wrapper)
- (derivation->output-path bash)))))
- (raw-derivation name
- (derivation->output-path bash) `(,builder)
- #:system system
- #:inputs (map derivation-input
- (list bash mkdir tar xz guile))
- #:sources (list builder)
- #:env-vars `(("GUILE_TARBALL"
- . ,(derivation->output-path guile))))))
- (define* (make-raw-bag name
- #:key source inputs native-inputs outputs
- system target)
- (bag
- (name name)
- (system system)
- (build-inputs inputs)
- (build raw-build)))
- (define %bootstrap-guile
- ;; The Guile used to run the build scripts of the initial derivations.
- ;; It is just unpacked from a tarball containing a pre-built binary.
- ;; This is typically built using %GUILE-BOOTSTRAP-TARBALL below.
- ;;
- ;; XXX: Would need libc's `libnss_files2.so' for proper `getaddrinfo'
- ;; support (for /etc/services).
- (let ((raw (build-system
- (name 'raw)
- (description "Raw build system with direct store access")
- (lower make-raw-bag))))
- (package
- (name "guile-bootstrap")
- (version "2.0")
- (source #f)
- (build-system raw)
- (synopsis "Bootstrap Guile")
- (description "Pre-built Guile for bootstrapping purposes.")
- (home-page #f)
- (license lgpl3+))))
- (define %bootstrap-coreutils&co
- (package-from-tarball "bootstrap-binaries"
- (lambda (system)
- (origin
- (method url-fetch)
- (uri (map (cut string-append <> "/" system
- (match system
- ("armhf-linux"
- "/20150101/static-binaries.tar.xz")
- ("aarch64-linux"
- "/20170217/static-binaries.tar.xz")
- ("powerpc64le-linux"
- "/20210106/static-binaries-0-powerpc64le-linux-gnu.tar.xz")
- ("i586-gnu"
- "/20200326/static-binaries-0-i586-pc-gnu.tar.xz")
- ("powerpc-linux"
- "/20200923/static-binaries.tar.xz")
- (_
- "/20131110/static-binaries.tar.xz")))
- %bootstrap-base-urls))
- (sha256
- (match system
- ("x86_64-linux"
- (base32
- "0c533p9dhczzcsa1117gmfq3pc8w362g4mx84ik36srpr7cx2bg4"))
- ("i686-linux"
- (base32
- "0s5b3jb315n13m1k8095l0a5hfrsz8g0fv1b6riyc5hnxqyphlak"))
- ("armhf-linux"
- (base32
- "0gf0fn2kbpxkjixkmx5f4z6hv6qpmgixl69zgg74dbsfdfj8jdv5"))
- ("aarch64-linux"
- (base32
- "18dfiq6c6xhsdpbidigw6480wh0vdgsxqq3xindq4lpdgqlccpfh"))
- ("powerpc64le-linux"
- (base32
- "0afs2j9z2d1hjq42myz4iwjh0aqgzf59inifw87x6b6p1z9wv92v"))
- ("i586-gnu"
- (base32
- "17kllqnf3fg79gzy9ansgi801c46yh9c23h4d923plvb0nfm1cfn"))
- ("powerpc-linux"
- (base32
- "0kspxy0yczan2vlih6aa9hailr2inz000fqa0gn5x9d1fxxa5y8m"))
- ("mips64el-linux"
- (base32
- "072y4wyfsj1bs80r6vbybbafy8ya4vfy7qj25dklwk97m6g71753"))))))
- "fgrep" ; the program to test
- "Bootstrap binaries of Coreutils, Awk, etc."
- #:snippet
- '(let ((path (list (string-append (getcwd) "/bin"))))
- (chmod "bin" #o755)
- (patch-shebang "bin/egrep" path)
- (patch-shebang "bin/fgrep" path)
- ;; Starting with grep@2.25 'egrep' and 'fgrep' are shell files
- ;; that call 'grep'. If the bootstrap 'egrep' and 'fgrep'
- ;; are not binaries then patch them to execute 'grep' via its
- ;; absolute file name instead of searching for it in $PATH.
- (if (not (elf-file? "bin/egrep"))
- (substitute* '("bin/egrep" "bin/fgrep")
- (("^exec grep") (string-append (getcwd) "/bin/grep"))))
- (chmod "bin" #o555))))
- (define-public %bootstrap-linux-libre-headers
- (package-from-tarball
- "linux-libre-headers-bootstrap"
- (lambda (system)
- (origin
- (method url-fetch)
- (uri (map (cute string-append <>
- "/i686-linux/20190815/"
- "linux-libre-headers-stripped-4.14.67-i686-linux.tar.xz")
- %bootstrap-base-urls))
- (sha256
- (base32
- "0sm2z9x4wk45bh6qfs94p0w1d6hsy6dqx9sw38qsqbvxwa1qzk8s"))))
- #f ; no program to test
- "Bootstrap linux-libre-headers"))
- (define %bootstrap-binutils
- (package-from-tarball "binutils-bootstrap"
- (lambda (system)
- (origin
- (method url-fetch)
- (uri (map (cut string-append <> "/" system
- (match system
- ("armhf-linux"
- "/20150101/binutils-2.25.tar.xz")
- ("aarch64-linux"
- "/20170217/binutils-2.27.tar.xz")
- ("powerpc64le-linux"
- "/20210106/binutils-static-stripped-2.34-powerpc64le-linux-gnu.tar.xz")
- ("i586-gnu"
- "/20200326/binutils-static-stripped-2.34-i586-pc-gnu.tar.xz")
- ("powerpc-linux"
- "/20200923/binutils-2.35.1.tar.xz")
- (_
- "/20131110/binutils-2.23.2.tar.xz")))
- %bootstrap-base-urls))
- (sha256
- (match system
- ("x86_64-linux"
- (base32
- "1j5yivz7zkjqfsfmxzrrrffwyayjqyfxgpi89df0w4qziqs2dg20"))
- ("i686-linux"
- (base32
- "14jgwf9gscd7l2pnz610b1zia06dvcm2qyzvni31b8zpgmcai2v9"))
- ("armhf-linux"
- (base32
- "1v7dj6bzn6m36f20gw31l99xaabq4xrhrx3gwqkhhig0mdlmr69q"))
- ("aarch64-linux"
- (base32
- "111s7ilfiby033rczc71797xrmaa3qlv179wdvsaq132pd51xv3n"))
- ("powerpc64le-linux"
- (base32
- "1klxy945c61134mzhqzz2gbk8w0n8jq7arwkrvz78d22ff2q0cwz"))
- ("i586-gnu"
- (base32
- "11kykv1kmqc5wln57rs4klaqa13hm952smkc57qcsyss21kfjprs"))
- ("powerpc-linux"
- (base32
- "0asbg1c4avkrvh057mx0942xwddd136jni382zqsxzn79ls42yq8"))
- ("mips64el-linux"
- (base32
- "1x8kkhcxmfyzg1ddpz2pxs6fbdl6412r7x0nzbmi5n7mj8zw2gy7"))))))
- "ld" ; the program to test
- "Bootstrap binaries of the GNU Binutils"))
- (define %bootstrap-glibc
- ;; The initial libc.
- (package
- (name "glibc-bootstrap")
- (version "0")
- (source #f)
- (build-system trivial-build-system)
- (arguments
- `(#:guile ,%bootstrap-guile
- #:modules ((guix build utils))
- #:builder
- (begin
- (use-modules (guix build utils))
- (let ((out (assoc-ref %outputs "out"))
- (tar (assoc-ref %build-inputs "tar"))
- (xz (assoc-ref %build-inputs "xz"))
- (tarball (assoc-ref %build-inputs "tarball")))
- (mkdir out)
- (copy-file tarball "binaries.tar.xz")
- (invoke xz "-d" "binaries.tar.xz")
- (let ((builddir (getcwd)))
- (with-directory-excursion out
- (invoke tar "xvf"
- (string-append builddir
- "/binaries.tar"))
- (chmod "lib" #o755)
- ;; Patch libc.so so it refers to the right path.
- (substitute* "lib/libc.so"
- (("/[^ ]+/lib/(libc|ld)" _ prefix)
- (string-append out "/lib/" prefix)))
- #t))))))
- (inputs
- `(("tar" ,(bootstrap-executable "tar" (%current-system)))
- ("xz" ,(bootstrap-executable "xz" (%current-system)))
- ("tarball" ,(bootstrap-origin
- (origin
- (method url-fetch)
- (uri (map (cut string-append <> "/" (%current-system)
- (match (%current-system)
- ("armhf-linux"
- "/20150101/glibc-2.20.tar.xz")
- ("aarch64-linux"
- "/20170217/glibc-2.25.tar.xz")
- ("powerpc64le-linux"
- "/20210106/glibc-stripped-2.31-powerpc64le-linux-gnu.tar.xz")
- ("i586-gnu"
- "/20200326/glibc-stripped-2.31-i586-pc-gnu.tar.xz")
- ("powerpc-linux"
- "/20200923/glibc-2.32.tar.xz")
- (_
- "/20131110/glibc-2.18.tar.xz")))
- %bootstrap-base-urls))
- (sha256
- (match (%current-system)
- ("x86_64-linux"
- (base32
- "0jlqrgavvnplj1b083s20jj9iddr4lzfvwybw5xrcis9spbfzk7v"))
- ("i686-linux"
- (base32
- "1hgrccw1zqdc7lvgivwa54d9l3zsim5pqm0dykxg0z522h6gr05w"))
- ("armhf-linux"
- (base32
- "18cmgvpllqfpn6khsmivqib7ys8ymnq0hdzi3qp24prik0ykz8gn"))
- ("aarch64-linux"
- (base32
- "07nx3x8598i2924rjnlrncg6rm61c9bmcczbbcpbx0fb742nvv5c"))
- ("powerpc64le-linux"
- (base32
- "1a1df6z8gkaq09md3jy94lixnh20599p58p0s856p10xwjaqr1iz"))
- ("i586-gnu"
- (base32
- "14ddm10lpbas8bankmn5bcrlqvz1v5dnn1qjzxb19r57vd2w5952"))
- ("powerpc-linux"
- (base32
- "0smmssyjrlk5cvx49586smmk81gkwff0i6r91n4rir4jm6ba25sb"))
- ("mips64el-linux"
- (base32
- "0k97a3whzx3apsi9n2cbsrr79ad6lh00klxph9hw4fqyp1abkdsg")))))))))
- (synopsis "Bootstrap binaries and headers of the GNU C Library")
- (description synopsis)
- (home-page #f)
- (license lgpl2.1+)))
- (define %bootstrap-gcc
- ;; The initial GCC. Uses binaries from a tarball typically built by
- ;; %GCC-BOOTSTRAP-TARBALL.
- (package
- (name "gcc-bootstrap")
- (version "0")
- (source #f)
- (build-system trivial-build-system)
- (arguments
- `(#:guile ,%bootstrap-guile
- #:modules ((guix build utils))
- #:builder
- (begin
- (use-modules (guix build utils)
- (ice-9 popen))
- (let ((out (assoc-ref %outputs "out"))
- (tar (assoc-ref %build-inputs "tar"))
- (xz (assoc-ref %build-inputs "xz"))
- (bash (assoc-ref %build-inputs "bash"))
- (libc (assoc-ref %build-inputs "libc"))
- (tarball (assoc-ref %build-inputs "tarball")))
- (mkdir out)
- (copy-file tarball "binaries.tar.xz")
- (invoke xz "-d" "binaries.tar.xz")
- (let ((builddir (getcwd))
- (bindir (string-append out "/bin")))
- (with-directory-excursion out
- (invoke tar "xvf"
- (string-append builddir "/binaries.tar")))
- (with-directory-excursion bindir
- (chmod "." #o755)
- (rename-file "gcc" ".gcc-wrapped")
- (call-with-output-file "gcc"
- (lambda (p)
- (format p "#!~a
- exec ~a/bin/.gcc-wrapped -B~a/lib \
- -Wl,-rpath -Wl,~a/lib \
- -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
- bash
- out libc libc libc
- ,(glibc-dynamic-linker))))
- (chmod "gcc" #o555)
- #t))))))
- (inputs
- `(("tar" ,(bootstrap-executable "tar" (%current-system)))
- ("xz" ,(bootstrap-executable "xz" (%current-system)))
- ("bash" ,(bootstrap-executable "bash" (%current-system)))
- ("libc" ,%bootstrap-glibc)
- ("tarball" ,(bootstrap-origin
- (origin
- (method url-fetch)
- (uri (map (cut string-append <> "/" (%current-system)
- (match (%current-system)
- ("armhf-linux"
- "/20150101/gcc-4.8.4.tar.xz")
- ("aarch64-linux"
- "/20170217/gcc-5.4.0.tar.xz")
- ("powerpc64le-linux"
- "/20210106/gcc-stripped-5.5.0-powerpc64le-linux-gnu.tar.xz")
- ("i586-gnu"
- "/20200326/gcc-stripped-5.5.0-i586-pc-gnu.tar.xz")
- ("powerpc-linux"
- "/20200923/gcc-5.5.0.tar.xz")
- (_
- "/20131110/gcc-4.8.2.tar.xz")))
- %bootstrap-base-urls))
- (sha256
- (match (%current-system)
- ("x86_64-linux"
- (base32
- "17ga4m6195n4fnbzdkmik834znkhs53nkypp6557pl1ps7dgqbls"))
- ("i686-linux"
- (base32
- "150c1arrf2k8vfy6dpxh59vcgs4p1bgiz2av5m19dynpks7rjnyw"))
- ("armhf-linux"
- (base32
- "0ghz825yzp43fxw53kd6afm8nkz16f7dxi9xi40bfwc8x3nbbr8v"))
- ("aarch64-linux"
- (base32
- "1ar3vdzyqbfm0z36kmvazvfswxhcihlacl2dzdjgiq25cqnq9ih1"))
- ("powerpc64le-linux"
- (base32
- "151kjsai25vz2s667bgzpisx8f281fpl3n9pxz2yrp9jlnadz3m1"))
- ("i586-gnu"
- (base32
- "1j2zc58wzil71a34h7c70sd68dmqvcscrw3rmn2whq79vd70zvv5"))
- ("powerpc-linux"
- (base32
- "1p7df3yixhm87dw5sccc6yn1i9db1r9hnmsg87wq5xi4rfmirq7w"))
- ("mips64el-linux"
- (base32
- "1m5miqkyng45l745n0sfafdpjkqv9225xf44jqkygwsipj2cv9ks")))))))))
- (native-search-paths
- (list (search-path-specification
- (variable "C_INCLUDE_PATH")
- (files '("include")))
- (search-path-specification
- (variable "CPLUS_INCLUDE_PATH")
- (files '("include/c++" "include")))
- (search-path-specification
- (variable "LIBRARY_PATH")
- (files '("lib" "lib64")))))
- (synopsis "Bootstrap binaries of the GNU Compiler Collection")
- (description synopsis)
- (home-page #f)
- (license gpl3+)))
- (define %bootstrap-mescc-tools
- ;; The initial MesCC tools. Uses binaries from a tarball typically built by
- ;; %MESCC-TOOLS-BOOTSTRAP-TARBALL.
- (package
- (name "bootstrap-mescc-tools")
- (version "0.5.2")
- (source #f)
- (build-system trivial-build-system)
- (arguments
- `(#:guile ,%bootstrap-guile
- #:modules ((guix build utils))
- #:builder
- (begin
- (use-modules (guix build utils)
- (ice-9 popen))
- (let ((out (assoc-ref %outputs "out"))
- (tar (assoc-ref %build-inputs "tar"))
- (xz (assoc-ref %build-inputs "xz"))
- (tarball (assoc-ref %build-inputs "tarball")))
- (mkdir out)
- (copy-file tarball "binaries.tar.xz")
- (invoke xz "-d" "binaries.tar.xz")
- (let ((builddir (getcwd))
- (bindir (string-append out "/bin")))
- (with-directory-excursion out
- (invoke tar "xvf"
- (string-append builddir "/binaries.tar"))))))))
- (inputs
- `(("tar" ,(bootstrap-executable "tar" (%current-system)))
- ("xz" ,(bootstrap-executable "xz" (%current-system)))
- ("tarball"
- ,(bootstrap-origin
- (origin
- (method url-fetch)
- (uri (map
- (cute string-append <>
- "/i686-linux/20190815/"
- "mescc-tools-static-stripped-0.5.2-i686-linux.tar.xz")
- %bootstrap-base-urls))
- (sha256
- (base32
- "0c3kklgghzh4q2dbpl6asb74cimp7hp6jscdwqwmzxbapgcl6582")))))))
- (synopsis "Bootstrap binaries of MesCC Tools")
- (description synopsis)
- (home-page #f)
- (supported-systems '("i686-linux" "x86_64-linux"))
- (license gpl3+)))
- (define %bootstrap-mes
- ;; The initial Mes. Uses binaries from a tarball typically built by
- ;; %MES-BOOTSTRAP-TARBALL.
- (package
- (name "bootstrap-mes")
- (version "0")
- (source #f)
- (build-system trivial-build-system)
- (arguments
- `(#:guile ,%bootstrap-guile
- #:modules ((guix build utils))
- #:builder
- (begin
- (use-modules (guix build utils)
- (ice-9 popen))
- (let ((out (assoc-ref %outputs "out"))
- (tar (assoc-ref %build-inputs "tar"))
- (xz (assoc-ref %build-inputs "xz"))
- (tarball (assoc-ref %build-inputs "tarball")))
- (mkdir out)
- (copy-file tarball "binaries.tar.xz")
- (invoke xz "-d" "binaries.tar.xz")
- (let ((builddir (getcwd))
- (bindir (string-append out "/bin")))
- (with-directory-excursion out
- (invoke tar "xvf"
- (string-append builddir "/binaries.tar"))))))))
- (inputs
- `(("tar" ,(bootstrap-executable "tar" (%current-system)))
- ("xz" ,(bootstrap-executable "xz" (%current-system)))
- ("tarball"
- ,(bootstrap-origin
- (origin
- (method url-fetch)
- (uri (map
- (cute string-append <>
- "/i686-linux/20190815/"
- "mes-minimal-stripped-0.19-i686-linux.tar.xz")
- %bootstrap-base-urls))
- (sha256
- (base32
- "1q4xjpx6nbn44kxnilpgl12bhpmwy2bblzwszc2ci7xkf400jcpv")))))))
- (supported-systems '("i686-linux" "x86_64-linux"))
- (synopsis "Bootstrap binaries of Mes")
- (description synopsis)
- (home-page #f)
- (license gpl3+)))
- (define (%bootstrap-inputs)
- ;; The initial, pre-built inputs. From now on, we can start building our
- ;; own packages.
- (match (%current-system)
- ((or "i686-linux" "x86_64-linux")
- `(("linux-libre-headers" ,%bootstrap-linux-libre-headers)
- ("bootstrap-mescc-tools" ,%bootstrap-mescc-tools)
- ("mes" ,%bootstrap-mes)))
- (_
- `(("libc" ,%bootstrap-glibc)
- ("gcc" ,%bootstrap-gcc)
- ("binutils" ,%bootstrap-binutils)
- ("coreutils&co" ,%bootstrap-coreutils&co)
- ;; In gnu-build-system.scm, we rely on the availability of Bash.
- ("bash" ,%bootstrap-coreutils&co)))))
- (define %bootstrap-inputs-for-tests
- ;; These are bootstrap inputs that are cheap to produce (no compilation
- ;; needed) and that are meant to be used for testing. (These are those we
- ;; used before the Mes-based reduced bootstrap.)
- `(("libc" ,%bootstrap-glibc)
- ("gcc" ,%bootstrap-gcc)
- ("binutils" ,%bootstrap-binutils)
- ("coreutils&co" ,%bootstrap-coreutils&co)
- ("bash" ,%bootstrap-coreutils&co)))
- ;;; bootstrap.scm ends here
|