You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3926 lines
155 KiB

;;; 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 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2014, 2015, 2017 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018, 2019, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2019, 2020 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2020 Timothy Sample <samplet@ngyro.com>
;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
;;;
;;; 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 commencement)
#:use-module (gnu packages)
#:use-module (gnu packages bootstrap)
#:use-module (gnu packages base)
#:use-module (gnu packages bash)
#:use-module (gnu packages c)
#:use-module (gnu packages gcc)
#:use-module (gnu packages m4)
#:use-module (gnu packages gawk)
#:use-module (gnu packages bison)
#:use-module (gnu packages flex)
#:use-module (gnu packages guile)
#:use-module (gnu packages gettext)
#:use-module (gnu packages multiprecision)
#:use-module (gnu packages compression)
#:use-module (gnu packages mes)
#:use-module (gnu packages perl)
#:use-module (gnu packages python)
#:use-module (gnu packages linux)
#:use-module (gnu packages hurd)
#:use-module (gnu packages shells)
#:use-module (gnu packages texinfo)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages rsync)
#:use-module (gnu packages xml)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix build-system gnu)
#:use-module (guix build-system trivial)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix memoization)
#:use-module (guix utils)
#:use-module (srfi srfi-1)
#:use-module (ice-9 vlist)
#:use-module (ice-9 match)
#:export (make-gcc-toolchain))
;;; Commentary:
;;;
;;; This is the commencement, this is where things start. Before the
;;; commencement, of course, there's the 'bootstrap' module, which provides us
;;; with the initial binaries. This module uses those bootstrap binaries to
;;; actually build up the whole tool chain that make up the implicit inputs of
;;; 'gnu-build-system'.
;;;
;;; To avoid circular dependencies, this module should not be imported
;;; directly from anywhere.
;;;
;;; Below, we frequently use "inherit" to create modified packages. The
;;; reason why we use "inherit" instead of "package/inherit" is because we do
;;; not want these commencement packages to inherit grafts. By definition,
;;; these packages are not depended on at run time by any of the packages we
;;; use. Thus it does not make sense to inherit grafts. Furthermore, those
;;; grafts would often lead to extra overhead for users who would end up
;;; downloading those "-boot0" packages just to build package replacements
;;; that are in fact not going to be used.
;;;
;;; Code:
(define bootar
(package
(name "bootar")
(version "1a")
(source (origin
(method url-fetch)
(uri (list (string-append
"mirror://gnu/guix/mirror/bootar-" version ".ses")
(string-append
"https://files.ngyro.com/bootar/bootar-"
version ".ses")))
(sha256
(base32
"0mvp6vgx0q316fvy3z2lddlc5xgq5np3bm1fypgvj6dnayibg9np"))))
(build-system gnu-build-system)
(arguments
`(#:implicit-inputs? #f
#:tests? #f
#:guile ,%bootstrap-guile
#:imported-modules ((guix build gnu-bootstrap)
,@%gnu-build-system-modules)
#:phases
(begin
(use-modules (guix build gnu-bootstrap))
(modify-phases %standard-phases
(replace 'unpack
(lambda* (#:key inputs #:allow-other-keys)
(let* ((source (assoc-ref inputs "source"))
(guile-dir (assoc-ref inputs "guile"))
(guile (string-append guile-dir "/bin/guile")))
(invoke guile "--no-auto-compile" source)
(chdir "bootar")
#t)))
(replace 'configure (bootstrap-configure ,version "." "scripts"))
(replace 'build (bootstrap-build "."))
(replace 'install (bootstrap-install "." "scripts"))))))
(inputs `(("guile" ,%bootstrap-guile)))
(home-page "https://git.ngyro.com/bootar")
(synopsis "Tar decompression and extraction in Guile Scheme")
(description "Bootar is a simple Tar extractor written in Guile
Scheme. It supports running 'tar xvf' on uncompressed tarballs or
tarballs that are compressed with BZip2, GZip, or XZ. It also provides
standalone scripts for 'bzip2', 'gzip', and 'xz' that each support
decompression to standard output.
What makes this special is that Bootar is distributed as a
self-extracting Scheme (SES) program. That is, a little script that
outputs the source code of Bootar. This makes it possible to go from
pure Scheme to Tar and decompression in one easy step.")
(license license:gpl3+)))
(define gash-boot
(package
(inherit gash)
(name "gash-boot")
(source (origin
(inherit (package-source gash))
(snippet #f))) ;discard snippet for Guile 3.0 support
(arguments
`(#:implicit-inputs? #f
#:tests? #f
#:guile ,%bootstrap-guile
#:imported-modules ((guix build gnu-bootstrap)
,@%gnu-build-system-modules)
#:phases
(begin
(use-modules (guix build gnu-bootstrap))
(modify-phases %standard-phases
(replace 'configure
(bootstrap-configure ,(package-version gash) "gash" "scripts"))
(replace 'build (bootstrap-build "gash"))
(replace 'install (bootstrap-install "gash" "scripts"))
(add-after 'install 'install-symlinks
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
(symlink (string-append out "/bin/gash")
(string-append out "/bin/sh"))
(symlink (string-append out "/bin/gash")
(string-append out "/bin/bash"))
#t)))))))
(inputs `(("guile" ,%bootstrap-guile)))
(native-inputs `(("bootar" ,bootar)))))
(define gash-utils-boot
(package
(inherit gash-utils)
(name "gash-utils-boot")
(source (origin
(inherit (package-source gash-utils))
(patches '())
(snippet #f))) ;discard snippet for Guile 3.0 support
(arguments
`(#:implicit-inputs? #f
#:tests? #f
#:guile ,%bootstrap-guile
#:imported-modules ((guix build gnu-bootstrap)
,@%gnu-build-system-modules)
#:phases
(begin
(use-modules (guix build gnu-bootstrap))
(modify-phases %standard-phases
(add-after 'unpack 'set-load-path
(lambda* (#:key inputs #:allow-other-keys)
(let ((gash (assoc-ref inputs "gash")))
(add-to-load-path (string-append gash "/share/guile/site/"
(effective-version))))
#t))
(add-before 'configure 'pre-configure
(lambda _
(format #t "Creating gash/commands/testb.scm~%")
(copy-file "gash/commands/test.scm"
"gash/commands/testb.scm")
(substitute* "gash/commands/testb.scm"
(("gash commands test") "gash commands testb")
(("apply test [(]cdr") "apply test/bracket (cdr"))
(for-each (lambda (script)
(let ((target (string-append "scripts/"
script ".in")))
(format #t "Creating scripts/~a~%" target)
(copy-file "scripts/template.in" target)
(substitute* target
(("@UTILITY@") script))))
'("awk" "basename" "cat" "chmod" "cmp" "command"
"compress" "cp" "cut" "diff" "dirname" "expr"
"false" "find" "grep" "head" "ln" "ls" "mkdir"
"mv" "printf" "pwd" "reboot" "rm" "rmdir"
"sed" "sleep" "sort" "tar" "test" "touch" "tr"
"true" "uname" "uniq" "wc" "which"))
(format #t "Creating scripts/[.in~%")
(copy-file "scripts/template.in" "scripts/[.in")
(substitute* "scripts/[.in"
(("@UTILITY@") "testb"))
(delete-file "scripts/template.in")
#t))
(replace 'configure
(bootstrap-configure ,(package-version gash-utils)
"gash" "scripts"))
(replace 'build (bootstrap-build "gash"))
(replace 'install (bootstrap-install "gash" "scripts"))
;; XXX: The scripts should add Gash to their load paths and
;; this phase should not exist.
(add-after 'install 'copy-gash
(lambda* (#:key inputs outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(moddir (string-append out "/share/guile/site/"
(effective-version)))
(godir (string-append out "/lib/guile/"
(effective-version)
"/site-ccache"))
(gash (assoc-ref inputs "gash"))
(gash-moddir (string-append gash "/share/guile/site/"
(effective-version)))
(gash-godir (string-append gash "/lib/guile/"
(effective-version)
"/site-ccache")))
(copy-file (string-append gash-moddir "/gash/compat.scm")
(string-append moddir "/gash/compat.scm"))
(copy-recursively (string-append gash-moddir "/gash/compat")
(string-append moddir "/gash/compat"))
(copy-file (string-append gash-godir "/gash/compat.go")
(string-append godir "/gash/compat.go"))
(copy-recursively (string-append gash-godir "/gash/compat")
(string-append godir "/gash/compat"))
#t)))))))
(inputs `(("gash" ,gash-boot)
("guile" ,%bootstrap-guile)))
(native-inputs `(("bootar" ,bootar)))))
(define (%boot-gash-inputs)
`(("bash" , gash-boot) ; gnu-build-system wants "bash"
("coreutils" , gash-utils-boot)
("bootar" ,bootar)
("guile" ,%bootstrap-guile)))
(define %bootstrap-mes-rewired
(package
(inherit mes)
(name "bootstrap-mes-rewired")
(version "0.19")
(source #f)
(native-inputs `(("mes" ,%bootstrap-mes)
("gash" ,gash-boot)))
(inputs '())
(propagated-inputs '())
(outputs '("out"))
(build-system trivial-build-system)
(arguments
`(#:guile ,%bootstrap-guile
#:modules ((guix build utils))
#:builder (begin
(use-modules (guix build utils)
(srfi srfi-26))
(let* ((mes (assoc-ref %build-inputs "mes"))
(gash (assoc-ref %build-inputs "gash"))
(mes-bin (string-append mes "/bin"))
(guile (string-append mes-bin "/mes"))
(mes-module (string-append mes "/share/mes/module"))
(out (assoc-ref %outputs "out"))
(bin (string-append out "/bin"))
(mescc (string-append bin "/mescc"))
(module (string-append out "/share/mes/module")))
(define (rewire file)
(substitute* file
((mes) out)
(("/gnu/store[^ ]+mes-minimal-[^/)}\"]*") out)
(("/gnu/store[^ ]+guile-[^/]*/bin/guile") guile)
(("/gnu/store[^ ]+bash-[^/)}\"]*") gash)))
(mkdir-p bin)
(for-each (lambda (file) (install-file file bin))
(find-files mes-bin))
(mkdir-p module)
(copy-recursively (string-append mes-module "/mes")
(string-append module "/mes"))
(copy-recursively (string-append mes-module "/srfi")
(string-append module "/srfi"))
(for-each rewire
;; Cannot easily rewire "mes" because it
;; contains NUL characters; would require
;; remove-store-references alike trick
(filter (negate (cut string-suffix? "/mes" <>))
(find-files bin)))
(rewire (string-append module "/mes/boot-0.scm"))
(delete-file mescc)
(with-output-to-file mescc
(lambda _
(display (string-append
"\
#! " gash "/bin/sh
LANG=C
LC_ALL=C
export LANG LC_ALL
MES_PREFIX=${MES_REWIRED_PREFIX-" out "/share/mes}
MES=" bin "/mes
export MES MES_PREFIX
MES_ARENA=${MES_REWIRED_ARENA-10000000}
MES_MAX_ARENA=${MES_REWIRED_ARENA-10000000}
MES_STACK=${MES_REWIRED_STACK-1000000}
export MES_ARENA MES_MAX_ARENA MES_STACK
$MES -e '(mescc)' module/mescc.scm -- \"$@\"
"))))
(chmod mescc #o555)
(with-directory-excursion module
(chmod "mes/base.mes" #o644)
(copy-file "mes/base.mes" "mes/base.mes.orig")
(let ((base.mes (open-file "mes/base.mes" "a")))
(display "
;; A fixed map, from Mes 0.21, required to bootstrap Mes 0.21
(define (map f h . t)
(if (or (null? h)
(and (pair? t) (null? (car t)))
(and (pair? t) (pair? (cdr t)) (null? (cadr t)))) '()
(if (null? t) (cons (f (car h)) (map f (cdr h)))
(if (null? (cdr t))
(cons (f (car h) (caar t)) (map f (cdr h) (cdar t)))
(if (null? (cddr t))
(cons (f (car h) (caar t) (caadr t)) (map f (cdr h) (cdar t) (cdadr t)))
(error 'unsupported (cons* 'map-4: f h t))b )))))
" base.mes)
(close base.mes))
(chmod "mes/guile.mes" #o644)
(copy-file "mes/guile.mes" "mes/guile.mes.orig")
(let ((guile.mes (open-file "mes/guile.mes" "a")))
(display "
;; After booting guile.scm; use Mes 0.21; especially: MesCC 0.21
(let* ((self (car (command-line)))
(prefix (dirname (dirname self))))
(set! %moduledir (string-append prefix \"/mes/module/\"))
(setenv \"%numbered_arch\" \"true\"))
" guile.mes)
(close guile.mes)))
#t))))))
(define mes-boot
(package
(inherit mes)
(name "mes-boot")
(version "0.22")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/mes/"
"mes-" version ".tar.gz"))
(sha256
(base32
"0p1jsrrmcbc0zrvbvnjbb6iyxr0in71km293q8qj6gnar6bw09av"))))
(inputs '())
(propagated-inputs '())
(native-inputs
`(("nyacc-source" ,(origin (inherit (package-source nyacc))
(snippet #f)))
("mes" ,%bootstrap-mes-rewired)
("mescc-tools" ,%bootstrap-mescc-tools)
,@(%boot-gash-inputs)))
(arguments
`(#:implicit-inputs? #f
#:tests? #f
#:guile ,%bootstrap-guile
#:strip-binaries? #f ; binutil's strip b0rkes MesCC/M1/hex2 binaries
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'unpack-seeds
(lambda _
(let ((nyacc-source (assoc-ref %build-inputs "nyacc-source")))
(with-directory-excursion ".."
(invoke "tar" "-xvf" nyacc-source)))))
(replace 'configure
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref %outputs "out"))
(gash (assoc-ref %build-inputs "bash"))
(mes (assoc-ref %build-inputs "mes"))
(dir (with-directory-excursion ".." (getcwd))))
(setenv "AR" (string-append "gash " (getcwd) "/scripts/mesar"))
(setenv "BASH" (string-append gash "/bin/bash"))
(setenv "CC" (string-append mes "/bin/mescc"))
(setenv "GUILE_LOAD_PATH"
(string-append
mes "/share/mes/module"
":" dir "/nyacc-0.99.0/module"))
(invoke "gash" "configure.sh"
(string-append "--prefix=" out)
(string-append "--host=i686-linux-gnu")))))
(replace 'build
(lambda _
(invoke "sh" "bootstrap.sh")))
(delete 'check)
(replace 'install
(lambda _
(substitute* "install.sh" ; show some progress
((" -xf") " -xvf")
(("^( *)((cp|mkdir|tar) [^']*[^\\])\n" all space cmd)
(string-append space "echo '" cmd "'\n"
space cmd "\n")))
(invoke "sh" "install.sh")
;; Keep ASCII output, for friendlier comparison and bisection
(let* ((out (assoc-ref %outputs "out"))
(cache (string-append out "/lib/cache")))
(define (objects-in-dir dir)
(find-files dir
(lambda (name stat)
(and (equal? (dirname name) dir)
(or (string-suffix? ".o" name)
(string-suffix? ".s" name))))))
(for-each (lambda (x) (install-file x cache))
(append (objects-in-dir ".")
(objects-in-dir "mescc-lib"))))
#t)))))
(native-search-paths
(list (search-path-specification
(variable "C_INCLUDE_PATH")
(files '("include")))
(search-path-specification
(variable "LIBRARY_PATH")
(files '("lib")))
(search-path-specification
(variable "MES_PREFIX")
(separator #f)
(files '("")))))))
(define tcc-boot0
;; Pristine tcc cannot be built by MesCC, we are keeping a delta of 11
;; patches. In a very early and rough form they were presented to the
;; TinyCC developers, who at the time showed no interest in supporting the
;; bootstrappable effort; we will try again later. These patches have been
;; ported to 0.9.27, alas the resulting tcc is buggy. Once MesCC is more
;; mature, this package should use the 0.9.27 sources (or later).
(package
(inherit tcc)
(name "tcc-boot0")
(version "0.9.26-1103-g6e62e0e")
(source (origin
(method url-fetch)
(uri (string-append
"http://lilypond.org/janneke/mes/20191117/"
"/tcc-" version ".tar.gz"))
(sha256
(base32
"1qbybw7mxbgkv3sazvz1v7c8byq998vk8f1h25ik8w3d2l63lxng"))))
(build-system gnu-build-system)
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs
`(("mes" ,mes-boot)
("nyacc-source" ,(origin (inherit (package-source nyacc))
(snippet #f)))
("mescc-tools" ,%bootstrap-mescc-tools)
,@(%boot-gash-inputs)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:validate-runpath? #f ; no dynamic executables
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'unpack-seeds
(lambda* (#:key outputs #:allow-other-keys)
(let ((nyacc-source (assoc-ref %build-inputs "nyacc-source")))
(with-directory-excursion ".."
(invoke "tar" "-xvf" nyacc-source)))))
(replace 'configure
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref %outputs "out"))
(dir (with-directory-excursion ".." (getcwd)))
(interpreter "/lib/mes-loader"))
(setenv "prefix" out)
(setenv "GUILE_LOAD_PATH"
(string-append dir "/nyacc-0.99.0/module"))
(substitute* "conftest.c"
(("volatile") ""))
(invoke "sh" "configure"
"--cc=mescc"
(string-append "--prefix=" out)
(string-append "--elfinterp=" interpreter)
"--crtprefix=."
"--tccdir=."))))
(replace 'build
(lambda _
(substitute* "bootstrap.sh" ; Show some progress
(("^( *)((cp|ls|mkdir|rm|[.]/tcc|[.]/[$][{PROGRAM_PREFIX[}]tcc) [^\"]*[^\\])\n" all space cmd)
(string-append space "echo \"" cmd "\"\n"
space cmd "\n")))
(invoke "sh" "bootstrap.sh")))
(replace 'check
(lambda _
;; fail fast tests
(system* "./tcc" "--help") ; --help exits 1
;; (invoke "sh" "test.sh" "mes/scaffold/tests/30-strlen")
;; (invoke "sh" "-x" "test.sh" "mes/scaffold/tinycc/00_assignment")
;; TODO: add sensible check target (without depending on make)
;; (invoke "sh" "check.sh")
#t))
(replace 'install
(lambda _
(substitute* "install.sh" ; Show some progress
(("^( *)((cp|ls|mkdir|rm|tar|./[$][{PROGRAM_PREFIX[}]tcc) [^\"]*[^\\])\n" all space cmd)
(string-append space "echo \"" cmd "\"\n"
space cmd "\n")))
(invoke "sh" "install.sh"))))))
(native-search-paths
(list (search-path-specification
(variable "C_INCLUDE_PATH")
(files '("include")))
(search-path-specification
(variable "LIBRARY_PATH")
(files '("lib")))))))
(define gzip-mesboot
;; The initial gzip. We keep this scripted gzip build before building make
;; to soften the dependency on Gash Core Utils gzip.
(package
(inherit gzip)
(version "1.2.4")
(name "gzip-mesboot")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/gzip/gzip-" version ".tar"))
(sha256
(base32
"1rhgk2vvmdvnn6vygf0dja92ryyng00knl0kz5srb77k2kryjb2d"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs `(("tcc" ,tcc-boot0)
,@(%boot-gash-inputs)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
(delete 'configure)
(add-after 'unpack 'scripted-patch
(lambda _
(substitute* "util.c"
(("^char [*]strlwr" all) (string-append all "_tcc_cannot_handle_dupe")))
#t))
(replace 'build
(lambda _
(let ((files '("bits" "crypt" "deflate" "getopt" "gzip"
"inflate" "lzw" "trees" "unlzh" "unlzw"
"unpack" "unzip" "util" "zip")))
(define (compile x)
(invoke "tcc" "-c" "-D NO_UTIME=1" "-D HAVE_UNISTD_H=1"
(string-append x ".c")))
(for-each compile files)
(apply invoke
(cons* "tcc" "-o" "gzip"
(map (lambda (x) (string-append x ".o")) files)))
(link "gzip" "gunzip"))))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(install-file "gzip" bin)
(install-file "gunzip" bin))))
(replace 'check
(lambda _
(invoke "./gzip" "--version")))
;; no gzip yet
(delete 'compress-documentation))))))
(define gnu-make-mesboot0
;; The initial make
(package
(inherit gnu-make)
(name "make-mesboot0")
(version "3.80")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/make/make-" version ".tar.gz"))
(sha256
(base32
"1pb7fb7fqf9wz9najm85qdma1xhxzf1rhj5gwrlzdsz2zm0hpcv4"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs `(("tcc" ,tcc-boot0)
,@(%boot-gash-inputs)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:configure-flags '("CC=tcc"
"CPP=tcc -E"
"LD=tcc"
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--disable-nls")
#:modules ((guix build gnu-build-system)
(guix build utils)
(srfi srfi-1))
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
(substitute* "build.sh.in"
(("@LIBOBJS@") "getloadavg.o")
(("@REMOTE@") "stub"))
#t))
(add-after 'configure 'configure-fixup
(lambda _
(substitute* "make.h"
(("^extern long int lseek.*" all) (string-append "// " all)))
#t))
(replace 'build
(lambda _
(invoke "sh" "./build.sh")))
(replace 'check ; proper check needs awk
(lambda _
(invoke "./make" "--version")))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(install-file "make" bin)))))))))
(define (%boot-tcc0-inputs)
`(("make" ,gnu-make-mesboot0)
("tcc" ,tcc-boot0)
,@(%boot-gash-inputs)))
(define bzip2-mesboot
;; The initial bzip2
(package
(inherit bzip2)
(name "bzip2-mesboot")
(version (package-version bzip2))
(source (bootstrap-origin (package-source bzip2)))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc0-inputs))
(outputs '("out"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:tests? #f ; check is naive, also checks non-built PROGRAMS
#:strip-binaries? #f ; no strip yet
#:make-flags (list "CC=tcc -I ." "AR=tcc -ar" "bzip2"
(string-append "PREFIX="
(assoc-ref %outputs "out")))
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
(substitute* "Makefile"
(("\tln " all)
(string-append "\t#" all)))
(substitute* "bzip2.c"
(("struct utimbuf uTimBuf;" all)
(string-append "// " all))
(("uTimBuf[.]" all)
(string-append "// " all))
(("retVal = utime [(] dstName, &uTimBuf [)];" all)
(string-append "retVal = 0; // " all)))
#t))
(replace 'configure
(lambda _
(with-output-to-file "utime.h"
(lambda _ (display "
#define fchown(filedes, owner, group) 0
#define fchmod(filedes, mode) 0
")))
#t))
(replace 'check
(lambda _
(invoke "./bzip2" "--help")))
;; FIXME: no compressing gzip yet
(delete 'compress-documentation))))))
(define bash-mesboot0
;; The initial Bash
(package
(inherit static-bash)
(name "bash-mesboot0")
(version "2.05b")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/bash/bash-"
version ".tar.gz"))
(sha256
(base32
"1r1z2qdw3rz668nxrzwa14vk2zcn00hw7mpjn384picck49d80xs"))))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc0-inputs))
(outputs '("out"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:strip-binaries? #f ; no strip yet
#:configure-flags
(list "--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--without-bash-malloc"
"--disable-readline"
"--disable-history"
"--disable-help-builtin"
"--disable-progcomp"
"--disable-net-redirections"
"--disable-nls"
;; Pretend 'dlopen' is missing so we don't build loadable
;; modules and related code.
"ac_cv_func_dlopen=no")
#:make-flags '("bash")
#:phases
(modify-phases %standard-phases
(add-before 'configure 'setenv
(lambda _
(let* ((gash (assoc-ref %build-inputs "bash"))
(shell (string-append gash "/bin/gash")))
(setenv "CONFIG_SHELL" shell)
(setenv "SHELL" shell)
(setenv "CC" "tcc")
(setenv "LD" "tcc")
(setenv "AR" "tcc -ar")
(setenv "CFLAGS" "-D _POSIX_VERSION=1")
#t)))
(add-after 'unpack 'scripted-patch
(lambda _
(substitute* "Makefile.in"
(("mksyntax\\.c\n") "mksyntax.c -lgetopt\n")
(("buildversion[.]o\n") "buildversion.o -lgetopt\n")
;; No size in Gash
(("\tsize ") "#\tsize"))
(substitute* "lib/sh/oslib.c"
(("int name, namelen;") "char *name; int namelen;"))
(substitute* "lib/sh/snprintf.c"
(("^#if (defined [(]HAVE_LOCALE_H[)])" all define) (string-append "#if 0 //" define)))
(substitute* "configure"
((" egrep") " grep"))
#t))
(replace 'configure
(lambda* (#:key configure-flags #:allow-other-keys)
(let ((configure-flags (filter (lambda (x)
(and (not (string-prefix? "CONFIG_SHELL=" x))
(not (string-prefix? "SHELL=" x))))
configure-flags)))
(format (current-error-port)
"running ./configure ~a\n" (string-join configure-flags)))
(apply invoke (cons "./configure" configure-flags))))
(add-after 'configure 'configure-fixups
(lambda _
(substitute* "config.h"
(("#define GETCWD_BROKEN 1") "#undef GETCWD_BROKEN"))
(let ((config.h (open-file "config.h" "a")))
(display (string-append "
// tcc: error: undefined symbol 'enable_hostname_completion'
#define enable_hostname_completion(on_or_off) 0
// /gnu/store/cq0cmv35s9dhilx14zaghlc08gpc0hwr-tcc-boot0-0.9.26-6.c004e9a/lib/libc.a: error: 'sigprocmask' defined twice
#define HAVE_POSIX_SIGNALS 1
#define endpwent(x) 0
")
config.h)
(close config.h))
#t))
(replace 'check
(lambda _
(invoke "./bash" "--version")))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(mkdir-p bin)
(copy-file "bash" (string-append bin "/bash"))
(copy-file "bash" (string-append bin "/sh"))
#t))))))))
(define tcc-boot
;; The final tcc.
(package
(inherit tcc-boot0)
(name "tcc-boot")
(version "0.9.27")
(source (origin
(inherit (package-source tcc))
;; `patches' needs XZ
;; (patches (search-patches "tcc-boot-0.9.27.patch"))
))
(build-system gnu-build-system)
(inputs '())
(propagated-inputs '())
(native-inputs `(;;("boot-patch" ,(search-patch "tcc-boot-0.9.27.patch"))
("bzip2" ,bzip2-mesboot)
,@(%boot-tcc0-inputs)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:validate-runpath? #f ; no dynamic executables
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
;; tar xvf ..bz2 gives
;; bzip2: PANIC -- internal consistency error
(replace 'unpack
(lambda* (#:key source #:allow-other-keys)
(copy-file source "tarball.tar.bz2")
(invoke "bzip2" "-d" "tarball.tar.bz2")
(invoke "tar" "xvf" "tarball.tar")
(chdir (string-append "tcc-" ,version))
#t))
;; no patch yet
;; (add-after 'unpack 'apply-boot-patch
;; (lambda* (#:key inputs #:allow-other-keys)
;; (let ((patch-file (assoc-ref inputs "boot-patch")))
;; (invoke "patch" "-p1" "-i" patch-file))))
(add-after 'unpack 'scripted-patch
(lambda* (#:key inputs #:allow-other-keys)
(substitute* "libtcc.c"
(("s->alacarte_link = 1;" all)
(string-append all "
s->static_link = 1;")))
#t))
(replace 'configure
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref %outputs "out"))
(tcc (assoc-ref %build-inputs "tcc"))
(libc (assoc-ref %build-inputs "libc"))
(interpreter "/mes/loader"))
(invoke "sh" "configure"
(string-append "--cc=tcc")
(string-append "--cpu=i386")
(string-append "--prefix=" out)
(string-append "--elfinterp=" interpreter)
(string-append "--crtprefix=" tcc "/lib")
(string-append "--sysincludepaths=" tcc "/include")
(string-append "--libpaths=" tcc "/lib")))))
(replace 'build
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref %outputs "out"))
(tcc (assoc-ref %build-inputs "tcc"))
(libc (assoc-ref %build-inputs "libc"))
(interpreter "/mes/loader"))
(invoke
"tcc"
"-vvv"
"-D" "BOOTSTRAP=1"
"-D" "ONE_SOURCE=1"
"-D" "TCC_TARGET_I386=1"
"-D" "CONFIG_TCC_STATIC=1"
"-D" "CONFIG_USE_LIBGCC=1"
"-D" (string-append "CONFIG_TCCDIR=\"" out "/lib/tcc\"")
"-D" (string-append "CONFIG_TCC_CRTPREFIX=\"" out "/lib:{B}/lib:.\"")
"-D" (string-append "CONFIG_TCC_CRTPREFIX=\"" out "/lib:{B}/lib:.\"")
"-D" (string-append "CONFIG_TCC_ELFINTERP=\"" interpreter "\"")
"-D" (string-append "CONFIG_TCC_LIBPATHS=\"" tcc "/lib:{B}/lib:.\"")
"-D" (string-append "CONFIG_TCC_SYSINCLUDEPATHS=\""
tcc "/include" ":/include:{B}/include\"")
"-D" (string-append "TCC_LIBGCC=\"" tcc "/lib/libc.a\"")
"-o" "tcc"
"tcc.c"))))
(replace 'check
(lambda _
;; FIXME: add sensible check target (without depending on make)
;; ./check.sh ?
(= 1 (status:exit-val (system* "./tcc" "--help")))))
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref %outputs "out"))
(tcc (assoc-ref %build-inputs "tcc")))
(and
(mkdir-p (string-append out "/bin"))
(copy-file "tcc" (string-append out "/bin/tcc"))
(mkdir-p (string-append out "/lib/tcc"))
(copy-recursively (string-append tcc "/include")
(string-append out "/include"))
(copy-recursively (string-append tcc "/lib")
(string-append out "/lib"))
(invoke "tcc" "-D" "TCC_TARGET_I386=1" "-c" "-o" "libtcc1.o" "lib/libtcc1.c")
(invoke "tcc" "-ar" "rc" "libtcc1.a" "libtcc1.o")
(copy-file "libtcc1.a" (string-append out "/lib/libtcc1.a"))
(delete-file (string-append out "/lib/tcc/libtcc1.a"))
(copy-file "libtcc1.a" (string-append out "/lib/tcc/libtcc1.a"))
#t)))))))))
(define diffutils-mesboot
;; The initial diffutils.
(package
(inherit diffutils)
(name "diffutils-mesboot")
(version "2.7")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/diffutils/diffutils-"
version ".tar.gz"))
(sha256
(base32
"1mirn5i825bn5w7rh6mgn0r8aj9xqanav95dwcl1b8sn82f4iwnm"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc0-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:tests? #f ; check is naive, also checks non-built PROGRAMS
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
(add-before 'configure 'remove-diff3-sdiff
(lambda* (#:key outputs #:allow-other-keys)
(substitute* "Makefile.in"
(("PROGRAMS = .*" all) "PROGRAMS = cmp diff"))))
(replace 'configure ; needs classic invocation of configure
(lambda* (#:key configure-flags #:allow-other-keys)
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(setenv "CONFIG_SHELL" shell)
(setenv "CC" "tcc")
(setenv "LD" "tcc")
(format (current-error-port)
"running ./configure ~a\n" (string-join configure-flags))
(apply invoke (cons "./configure" configure-flags)))))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(mkdir-p bin)
(install-file "cmp" bin)
(install-file "diff" bin)
#t))))))))
(define patch-mesboot
;; The initial patch.
(package
(inherit patch)
(name "patch-mesboot")
(version "2.5.9")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/patch/patch-"
version ".tar.gz"))
(sha256
(base32
"12nv7jx3gxfp50y11nxzlnmqqrpicjggw6pcsq0wyavkkm3cddgc"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc0-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:tests? #f ; check is naive, also checks non-built PROGRAMS
#:strip-binaries? #f ; no strip yet
#:configure-flags '("AR=tcc -ar" "CC=tcc" "LD-tcc")
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
;; avoid another segfault
(substitute* "pch.c"
(("while [(]p_end >= 0[)]" all)
"p_end = -1;\nwhile (0)"))
#t))
;; FIXME: no compressing gzip yet
(delete 'compress-documentation))))))
(define sed-mesboot0
;; The initial sed.
(package
(inherit sed)
(name "sed-mesboot0")
(version "1.18")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/sed/sed-"
version ".tar.gz"))
(sha256
(base32
"1hyv7i82jd0q18xcql51ylc8jwadp3gb3irgcqlis3v61p35jsv2"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc0-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:configure-flags '("CC=tcc")
#:make-flags '("CC=tcc" "extra_objs=" "DEFS=-D HAVE_BCOPY")
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(substitute* "configure"
(("/bin/sh") shell))
#t)))
(replace 'check
(lambda _
(invoke "./sed" "--version")))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(install-file "sed" bin)
#t))))))))
(define (%boot-tcc-inputs)
`(("bash" ,bash-mesboot0)
("bzip2" ,bzip2-mesboot)
("diffutils" ,diffutils-mesboot)
("gzip" ,gzip-mesboot)
("patch" ,patch-mesboot)
("sed" ,sed-mesboot0)
("tcc" ,tcc-boot)
,@(alist-delete "tcc" (%boot-tcc0-inputs))))
(define binutils-mesboot0
;; The initial Binutils
(package
(inherit binutils)
(name "binutils-mesboot0")
(version "2.14")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/binutils/binutils-"
version ".tar.gz"))
(sha256
(base32
"1w8xp7k44bkijr974x9918i4p1sw4g2fcd5mxvspkjpg38m214ds"))))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc-inputs))
(supported-systems '("i686-linux" "x86_64-linux"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f ; runtest: command not found
#:parallel-build? #f
#:strip-binaries? #f ; no strip yet
#:configure-flags
(let ((out (assoc-ref %outputs "out")))
`("--disable-nls"
"--disable-shared"
"--disable-werror"
"--build=i386-unknown-linux"
"--host=i386-unknown-linux"
"--target=i386-unknown-linux"
"--with-sysroot=/"
,(string-append "--prefix=" out)))
#:phases
(modify-phases %standard-phases
(add-before 'configure 'setenv
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(setenv "CONFIG_SHELL" shell)
(setenv "SHELL" shell)
(setenv "AR" "tcc -ar")
(setenv "RANLIB" "true")
(setenv "CC" "tcc -D __GLIBC_MINOR__=6")
#t)))
(add-after 'unpack 'scripted-patch
(lambda* (#:key inputs #:allow-other-keys)
(substitute* "bfd/configure"
(("^sed -e '/SRC-POTFILES.*" all)
"echo -e 'all:\\n\\ttrue\\n\\ninstall:\\n\\ttrue\\n' > po/Makefile\n"))
#t))
(replace 'configure ; needs classic invocation of configure
(lambda* (#:key configure-flags #:allow-other-keys)
(format (current-error-port)
"running ./configure ~a\n" (string-join configure-flags))
(apply system* "./configure" configure-flags)
(substitute* "config.status"
(("[.]//dev/null") "/dev/null"))
(invoke "sh" "./config.status"))))))))
(define gcc-core-mesboot0
;; Gcc-2.95.3 is the most recent GCC that is supported by what the Mes C
;; Library v0.16 offers. Gcc-3.x (and 4.x) place higher demands on a C
;; library, such as dir.h/struct DIR/readdir, locales, signals... Also,
;; with gcc-2.95.3, binutils (2.14.0, 2.20.1a) and glibc-2.2.5 we found a
;; GNU toolchain triplet "that works".
(package
(inherit gcc)
(name "gcc-core-mesboot0")
(version "2.95.3")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/gcc/gcc-2.95.3/gcc-core-"
version
".tar.gz"))
;; `patches' needs XZ
;; (patches (search-patches "gcc-boot-2.95.3.patch"))
(sha256
(base32
"1xvfy4pqhrd5v2cv8lzf63iqg92k09g6z9n2ah6ndd4h17k1x0an"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs `(("boot-patch" ,(search-patch "gcc-boot-2.95.3.patch"))
("binutils" ,binutils-mesboot0)
,@(%boot-tcc-inputs)))
(outputs '("out"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f
#:parallel-build? #f
#:strip-binaries? #f
#:configure-flags
(let ((out (assoc-ref %outputs "out")))
`("--enable-static"
"--disable-shared"
"--disable-werror"
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
,(string-append "--prefix=" out)))
#:make-flags
`("CC=tcc -static -D __GLIBC_MINOR__=6"
"OLDCC=tcc -static -D __GLIBC_MINOR__=6"
"CC_FOR_BUILD=tcc -static -D __GLIBC_MINOR__=6"
"AR=ar"
"RANLIB=ranlib"
,(string-append "LIBGCC2_INCLUDES=-I "
(assoc-ref %build-inputs "tcc")
"/include")
"LANGUAGES=c"
,(string-append "BOOT_LDFLAGS="
" -B" (assoc-ref %build-inputs "tcc")
"/lib/"))
#:modules ((guix build gnu-build-system)
(guix build utils)
(srfi srfi-1))
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'apply-boot-patch
(lambda* (#:key inputs #:allow-other-keys)
(let ((patch-file (assoc-ref inputs "boot-patch")))
(system* "patch" "--force" "-p1" "-i" patch-file)
#t)))
(add-before 'configure 'setenv
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash"))
(tcc (assoc-ref %build-inputs "tcc"))
(cppflags " -D __GLIBC_MINOR__=6"))
(setenv "CONFIG_SHELL" shell)
(setenv "CPPFLAGS" cppflags)
(setenv "CC" (string-append "tcc" cppflags))
(setenv "CC_FOR_BUILD" (string-append "tcc" cppflags))
(setenv "CPP" (string-append "tcc -E" cppflags))
(with-output-to-file "config.cache"
(lambda _
(display "
ac_cv_c_float_format='IEEE (little-endian)'
"))))))
;; gcc-2.95.3
(replace 'configure ; needs classic invocation of configure
(lambda* (#:key configure-flags #:allow-other-keys)
(format (current-error-port)
"running ./configure ~a\n" (string-join configure-flags))
(apply invoke "./configure" configure-flags)))
(add-after 'configure 'remove-info
(lambda _
;; no info at this stage
(delete-file-recursively "texinfo")
(invoke "touch" "gcc/cpp.info" "gcc/gcc.info")))
(add-after 'install 'install2
(lambda* (#:key outputs #:allow-other-keys)
(let* ((tcc (assoc-ref %build-inputs "tcc"))
(tcc-lib (string-append tcc "/lib/x86-mes-gcc"))
(out (assoc-ref outputs "out"))
(gcc-dir (string-append
out "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3")))
(mkdir-p "tmp")
(with-directory-excursion "tmp"
(invoke "ar" "x" (string-append "../gcc/libgcc2.a"))
(invoke "ar" "x" (string-append tcc "/lib/libtcc1.a"))
(apply invoke "ar" "r" (string-append gcc-dir "/libgcc.a")
(find-files "." "\\.o")))
(copy-file "gcc/libgcc2.a" (string-append out "/lib/libgcc2.a"))
(copy-file (string-append tcc "/lib/libtcc1.a")
(string-append out "/lib/libtcc1.a"))
(invoke "ar" "x" (string-append tcc "/lib/libtcc1.a"))
(invoke "ar" "x" (string-append tcc "/lib/libc.a"))
(invoke "ar" "r" (string-append gcc-dir "/libc.a")
"libc.o" "libtcc1.o")
#t))))))
(native-search-paths
(list (search-path-specification
(variable "C_INCLUDE_PATH")
(files '("include"
;; Needed to get things like GCC's <stddef.h>.
"lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include")))
(search-path-specification
(variable "LIBRARY_PATH")
(files '("lib")))))))
(define (%boot-mesboot-core-inputs)
`(("binutils" ,binutils-mesboot0)
("gawk" ,gawk-mesboot0)
("gcc" ,gcc-core-mesboot0)
,@(alist-delete "tcc" (%boot-tcc-inputs))))
(define mesboot-headers
(package
(inherit mes-boot)
(name "mesboot-headers")
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs `(("kernel-headers" ,%bootstrap-linux-libre-headers)
,@(%boot-tcc-inputs)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f
#:strip-binaries? #f
#:phases
(modify-phases %standard-phases
(delete 'configure)
(delete 'build)
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(include (string-append out "/include"))
(headers (assoc-ref %build-inputs "kernel-headers")))
(mkdir-p include)
(copy-recursively "include" out)
(copy-recursively headers out)
#t))))))))
(define gawk-mesboot0
;; The initial Gawk.
(package
(inherit gawk)
(name "gawk-mesboot0")
(version "3.0.0")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/gawk/gawk-"
version ".tar.gz"))
(sha256
(base32
"087s7vpc8zawn3l7bwv9f44bf59rc398hvaiid63klw6fkbvabr3"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-tcc-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:configure-flags '("--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--disable-nls")
#:make-flags '("gawk")
#:parallel-build? #f
#:parallel-tests? #f
#:strip-binaries? #f ; no strip yet
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
(substitute* "Makefile.in"
(("date ") "echo today ")
((" autoheader") "true")
((" -lm ") " "))
(substitute* "test/Makefile.in"
(("^bigtest:.*") "bigtest: basic\n")
(("( |\t)(childin|convfmt|fflush|longwrds|math|negexp)" all sep) sep))))
(add-before 'configure 'setenv
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(setenv "CONFIG_SHELL" shell)
(setenv "SHELL" shell)
(setenv "CC" "tcc")
(setenv "CPP" "tcc -E")
(setenv "LD" "tcc")
(setenv "ac_cv_func_getpgrp_void" "yes")
(setenv "ac_cv_func_tzset" "yes"))
#t))
(replace 'configure ; needs classic invocation of configure
(lambda* (#:key configure-flags #:allow-other-keys)
(let* ((out (assoc-ref %outputs "out"))
(configure-flags
`(,@configure-flags
,(string-append "--prefix=" out))))
(format (current-error-port) "running ./configure ~a\n" (string-join configure-flags))
(system* "touch" "configure") ; aclocal.m4 is newer than configure
(apply invoke (cons "./configure" configure-flags)))))
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bin (string-append out "/bin")))
(install-file "gawk" bin)
(symlink "gawk" (string-append bin "/awk"))
#t))))))))
(define glibc-mesboot0
;; GNU C Library 2.2.5 is the most recent glibc that we managed to build
;; using gcc-2.95.3. Newer versions (2.3.x, 2.6, 2.1x) seem to need a newer
;; gcc.
(package
(inherit glibc)
(name "glibc-mesboot0")
(version "2.2.5")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/glibc/glibc-"
version
".tar.gz"))
;; Patch needs XZ
;; (patches (search-patches "glibc-boot-2.2.5.patch"))
(sha256
(base32
"1vl48i16gx6h68whjyhgnn1s57vqq32f9ygfa2fls7pdkbsqvp2q"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs `(("boot-patch" ,(search-patch "glibc-boot-2.2.5.patch"))
("system-patch" ,(search-patch "glibc-bootstrap-system-2.2.5.patch"))
("headers" ,mesboot-headers)
,@(%boot-mesboot-core-inputs)))
(outputs '("out"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f
#:strip-binaries? #f
#:validate-runpath? #f ; no dynamic executables
#:parallel-build? #f ; gcc-2.95.3 ICEs on massively parallel builds
#:make-flags (list (string-append
"SHELL="
(assoc-ref %build-inputs "bash")
"/bin/sh"))
#:configure-flags
(let ((out (assoc-ref %outputs "out"))
(headers (assoc-ref %build-inputs "headers")))
`("--disable-shared"
"--enable-static"
"--disable-sanity-checks"
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
,(string-append "--with-headers=" headers "/include")
"--enable-static-nss"
"--without-__thread"
"--without-cvs"
"--without-gd"
"--without-tls"
,(string-append "--prefix=" out)))
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'apply-boot-patch
(lambda* (#:key inputs #:allow-other-keys)
(and (let ((patch (assoc-ref inputs "boot-patch")))
(invoke "patch" "--force" "-p1" "-i" patch))
(let ((patch (assoc-ref inputs "system-patch")))
(invoke "patch" "--force" "-p1" "-i" patch)))))
(add-before 'configure 'setenv
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash"))
(gcc (assoc-ref %build-inputs "gcc"))
(headers (assoc-ref %build-inputs "headers"))
(cppflags (string-append
;;" -D __STDC__=1"
" -D MES_BOOTSTRAP=1"
" -D BOOTSTRAP_GLIBC=1"))
(cflags (string-append " -L " (getcwd))))
(setenv "CONFIG_SHELL" shell)
(setenv "SHELL" shell)
(setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
(setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags))
#t)))
(replace 'configure ; needs classic invocation of configure
(lambda* (#:key configure-flags #:allow-other-keys)
(format (current-error-port)
"running ./configure ~a\n" (string-join configure-flags))
(apply invoke "./configure" configure-flags)))
(add-after 'configure 'fixup-configure
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(substitute* "config.make"
(("INSTALL = scripts/") "INSTALL = $(..)./scripts/"))
(substitute* "config.make"
(("INSTALL = scripts/") "INSTALL = $(..)./scripts/")
(("BASH = ") (string-append
"SHELL = " shell "
BASH = ")))
#t))))))))
(define gcc-mesboot0
(package
(inherit gcc-core-mesboot0)
(name "gcc-mesboot0")
(native-inputs `(("boot-patch" ,(search-patch "gcc-boot-2.95.3.patch"))
;; Packages are given in an order that's relevant for
;; #include_next purposes.
("libc" ,glibc-mesboot0)
("kernel-headers" ,%bootstrap-linux-libre-headers)
,@(%boot-mesboot-core-inputs)))
(arguments
(substitute-keyword-arguments (package-arguments gcc-core-mesboot0)
((#:phases phases)
`(modify-phases ,phases
(replace 'setenv
(lambda _
(setenv "CONFIG_SHELL" (which "sh"))
(with-output-to-file "config.cache"
(lambda _
(display "
ac_cv_c_float_format='IEEE (little-endian)'
")))
#t))
(replace 'install2
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(gcc-dir (string-append
out "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3")))
(and
(mkdir-p "tmp")
(zero? (system (string-append "set -x; cd tmp && ar x ../gcc/libgcc2.a")))
(zero? (system (string-append "set -x; cd tmp && ar r " gcc-dir "/libgcc.a *.o")))
(copy-file "gcc/libgcc2.a" (string-append out "/lib/libgcc2.a"))))))))
((#:configure-flags configure-flags)
`(let ((out (assoc-ref %outputs "out")))
`("--disable-shared"
"--disable-werror"
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
,(string-append "--prefix=" out))))
((#:make-flags make-flags)
`(let ((gcc (assoc-ref %build-inputs "gcc")))
`("RANLIB=true"
,(string-append "LIBGCC2_INCLUDES=-I " gcc "/include")
"LANGUAGES=c")))))))
(define (%boot-mesboot0-inputs)
`(("gcc" ,gcc-mesboot0)
("kernel-headers" ,%bootstrap-linux-libre-headers)
("libc" ,glibc-mesboot0)
,@(alist-delete "gcc" (%boot-mesboot-core-inputs))))
(define tar-mesboot
;; Initial tar with support for xz compression.
(package
(inherit tar)
(name "tar-mesboot")
(version "1.22")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/tar/tar-"
version ".tar.gz"))
(sha256
(base32
"19nvix64y95n5v6rr5g9g3fn08zz85cb5anzd7csfv4a4sz9lw4y"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-mesboot0-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:tests? #f ; check is naive, also checks non-built PROGRAMS
#:strip-binaries? #f ; no strip yet
#:configure-flags '("--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--disable-nls")
#:phases
(modify-phases %standard-phases
(replace 'configure
(lambda* (#:key configure-flags #:allow-other-keys)
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(setenv "CONFIG_SHELL" shell)
(setenv "SHELL" shell)
(setenv "LIBS" "-lc -lnss_files -lnss_dns -lresolv")
(setenv "gl_cv_func_rename_dest_works" "yes")
(format (current-error-port)
"running ./configure ~a\n" (string-join configure-flags))
(apply invoke (cons "./configure" configure-flags)))))
(add-after 'unpack 'scripted-patch
(lambda _
(let* ((bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(substitute* "configure"
((" /bin/sh") shell)))
(substitute* "Makefile.in"
(("^SUBDIRS = doc") "SUBDIRS ="))
#t))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(install-file "src/tar" bin)
#t))))))))
(define grep-mesboot
;; The initial grep.
(package
(inherit grep)
(name "grep-mesboot")
(version "2.0")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/grep/grep-"
version ".tar.gz"))
(sha256
(base32
"1w862l80lgc5mxvpiy4cfwk761d6xxavn0m3xd2l7xs2kmzvp6lq"))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-mesboot0-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:phases
(modify-phases %standard-phases
(add-before 'configure 'patch-configure
(lambda _
(let* ((bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(substitute* "configure"
((" [|][|] ./config.status") " || sh ./config.status")))))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(install-file "grep" bin)
(symlink "grep" (string-append bin "/egrep"))
(symlink "grep" (string-append bin "/fgrep"))
#t))))))))
(define binutils-mesboot1
(package
(inherit binutils-mesboot0)
(name "binutils-mesboot1")
(native-inputs (%boot-mesboot0-inputs))
(arguments
(substitute-keyword-arguments (package-arguments binutils-mesboot0)
((#:configure-flags configure-flags)
'(let ((out (assoc-ref %outputs "out")))
`("--disable-nls"
"--disable-shared"
"--disable-werror"
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--with-sysroot=/"
,(string-append "--prefix=" out))))
((#:phases phases)
`(modify-phases ,phases
(replace 'setenv
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(setenv "CONFIG_SHELL" shell)
#t)))))))))
(define coreutils-mesboot0
(package
(inherit coreutils)
(name "coreutils-mesboot0")
;; The latest .gz release of Coreutils is 8.13; which does not build with gcc-2.95.3:
;; randperm.c: In function `sparse_swap':
;; randperm.c:117: invalid lvalue in unary `&'
(version "5.0") ; 2003-04
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/coreutils/coreutils-"
version ".tar.gz"))
(sha256
(base32
"10wq6k66i8adr4k08p0xmg87ff4ypiazvwzlmi7myib27xgffz62"))))
(native-inputs (%boot-mesboot0-inputs))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(arguments
`(#:implicit-inputs? #f
#:tests? #f ; WARNING: `perl' is needed, ...
#:parallel-build? #f
#:strip-binaries? #f ; strip: unrecognized option `--only-keep-debug'
#:guile ,%bootstrap-guile
#:configure-flags
'("--disable-doc"
"LIBS=-lc -lnss_files -lnss_dns -lresolv"
"ac_cv_func_gethostbyname=no"
"gl_cv_func_rename_dest_works=yes")))))
(define gnu-make-mesboot
(package
(inherit gnu-make)
(name "make-mesboot")
(version "3.82")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/make/make-"
version ".tar.gz"))
(sha256
(base32
"1rs2f9hmvy3q6zkl15jnlmnpgffm0bhw5ax0h5c7q604wqrip69x"))))
(native-inputs (%boot-mesboot0-inputs))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(arguments
`(#:implicit-inputs? #f
#:parallel-build? #f
#:guile ,%bootstrap-guile
#:configure-flags '("LIBS=-lc -lnss_files -lnss_dns -lresolv")
#:phases
(modify-phases %standard-phases
(replace 'check
(lambda _
(invoke "./make" "--version")))
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bin (string-append out "/bin")))
(install-file "make" bin)
#t))))))))
(define gawk-mesboot
(package
(inherit gawk)
(name "gawk-mesboot")
(version "3.1.8")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/gawk/gawk-"
version ".tar.gz"))
(sha256
(base32
"03d5y7jabq7p2s7ys9alay9446mm7i5g2wvy8nlicardgb6b6ii1"))))
(native-inputs `(,@(%boot-mesboot0-inputs)
("mesboot-headers" ,mesboot-headers)))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(arguments
`(#:implicit-inputs? #f
#:parallel-build? #f
#:guile ,%bootstrap-guile
#:configure-flags '("ac_cv_func_connect=no")
#:make-flags '("gawk")
#:phases
(modify-phases %standard-phases
(replace 'check
(lambda _
(invoke "./gawk" "--version")))
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bin (string-append out "/bin")))
(install-file "gawk" bin)
(symlink "gawk" (string-append bin "/awk"))
#t))))))))
(define sed-mesboot
(package
(inherit sed)
(name "sed-mesboot")
(version "4.0.6") ; 2003-04
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/sed/sed-"
version ".tar.gz"))
(sha256
(base32
"0861ij94cqc4vaaki6r2wlapwcmhpx4ggp4r70f46mb21a8fkvf1"))))
(native-inputs (%boot-mesboot0-inputs))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(arguments
`(#:implicit-inputs? #f
#:parallel-build? #f
#:guile ,%bootstrap-guile
#:tests? #f ; 8to7 fails
#:phases
(modify-phases %standard-phases
(add-after 'unpack '/bin/sh
(lambda _
(let* ((bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(substitute* "testsuite/Makefile.tests"
(("^SHELL = /bin/sh")
(string-append "SHELL = " shell)))
#t))))))))
(define bash-mesboot
(package
(inherit bash-mesboot0)
(version "4.4")
(name "bash-mesboot")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/bash/bash-"
version ".tar.gz"))
(sha256
(base32
"1jyz6snd63xjn6skk7za6psgidsd53k05cr3lksqybi0q6936syq"))))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-mesboot0-inputs))
(outputs '("out"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:configure-flags
'("--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--without-bash-malloc"
"--disable-readline"
"--disable-history"
"--disable-help-builtin"
"--disable-progcomp"
"--disable-net-redirections"
"--disable-nls"
;; Pretend 'dlopen' is missing so we don't build loadable
;; modules and related code.
"ac_cv_func_dlopen=no")
#:make-flags '("bash")
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
(substitute* "shell.c"
((";;") ";"))
#t))
(add-before 'configure 'setenv
(lambda _
(setenv "AWK" "gawk")
(setenv "LIBS" "-lc -lnss_files -lnss_dns -lresolv")
(setenv "gl_cv_func_rename_dest_works" "yes")
#t))
(add-after 'configure 'configure-fixups
(lambda _
(let ((config.h (open-file "config.h" "a")))
(display (string-append "
#define enable_hostname_completion(on_or_off) 0
")
config.h)
(close config.h))
#t))
(replace 'check
(lambda _
(invoke "./bash" "--version")))
(replace 'install
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bin (string-append out "/bin")))
(mkdir-p bin)
(copy-file "bash" (string-append bin "/bash"))
(copy-file "bash" (string-append bin "/sh"))
#t))))))))
(define (%boot-mesboot1-inputs)
`(("bash" ,bash-mesboot)
("binutils" ,binutils-mesboot1)
("coreutils" ,coreutils-mesboot0)
("gawk" ,gawk-mesboot)
("grep" ,grep-mesboot)
("make" ,gnu-make-mesboot)
("sed" ,sed-mesboot)
("tar" ,tar-mesboot)
,@(fold alist-delete (%boot-mesboot0-inputs)
'("bash" "binutils" "bootar" "coreutils" "gash"
"gawk" "grep" "guile" "make" "sed" "tar"))))
(define gmp-boot
(package
(inherit gmp)
(version "4.3.2")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/gmp/gmp-" version
".tar.gz"))
(sha256 (base32
"15rwq54fi3s11izas6g985y9jklm3xprfsmym3v1g6xr84bavqvv"))))))
(define mpfr-boot
(package
(inherit mpfr)
(version "2.4.2")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/mpfr/mpfr-" version
".tar.gz"))
(sha256 (base32
"0dxn4904dra50xa22hi047lj8kkpr41d6vb9sd4grca880c7wv94"))))))
(define mpc-boot
(package
(inherit mpc)
(version "1.0.3")
(source (origin
(method url-fetch)
(uri (string-append
"mirror://gnu/mpc/mpc-" version ".tar.gz"))
(sha256
(base32
"1hzci2zrrd7v3g1jk35qindq05hbl0bhjcyyisq9z209xb3fqzb1"))))))
(define gcc-core-mesboot1
;; GCC 4.6.4 is the latest modular distribution. This package is not
;; stricly needed, but very helpful for development because it builds
;; relatively fast. If this configures and builds then gcc-mesboot1 also
;; builds.
(package
(inherit gcc-mesboot0)
(name "gcc-core-mesboot1")
(version "4.6.4")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/gcc/gcc-"
version "/gcc-core-" version ".tar.gz"))
(sha256
(base32
"173kdb188qg79pcz073cj9967rs2vzanyjdjyxy9v0xb0p5sad75"))
;; Patch needs XZ
;; (patches (search-patches "gcc-boot-4.6.4.patch"))
))
(inputs `(("gmp-source" ,(package-source gmp-boot))
("mpfr-source" ,(package-source mpfr-boot))
("mpc-source" ,(package-source mpc-boot))))
(native-inputs `(("boot-patch" ,(search-patch "gcc-boot-4.6.4.patch"))
,@(%boot-mesboot1-inputs)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f
#:modules ((guix build gnu-build-system)
(guix build utils)
(srfi srfi-1))
#:parallel-build? #f ; for debugging
#:make-flags
(let* ((libc (assoc-ref %build-inputs "libc"))
(ldflags (string-append
"-B" libc "/lib "
"-Wl,-dynamic-linker "
"-Wl," libc
,(glibc-dynamic-linker "i686-linux"))))
(list (string-append "LDFLAGS=" ldflags)
(string-append "LDFLAGS_FOR_TARGET=" ldflags)))
#:configure-flags
(let ((out (assoc-ref %outputs "out"))
(glibc (assoc-ref %build-inputs "libc")))
(list (string-append "--prefix=" out)
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
(string-append "--with-native-system-header-dir=" glibc "/include")
(string-append "--with-build-sysroot=" glibc "/include")
"--disable-bootstrap"
"--disable-decimal-float"
"--disable-libatomic"
"--disable-libcilkrts"
"--disable-libgomp"
"--disable-libitm"
"--disable-libmudflap"
"--disable-libquadmath"
"--disable-libsanitizer"
"--disable-libssp"
"--disable-libvtv"
"--disable-lto"
"--disable-lto-plugin"
"--disable-multilib"
"--disable-plugin"
"--disable-threads"
"--enable-languages=c"
"--enable-static"
"--disable-shared"
"--enable-threads=single"
"--disable-libstdcxx-pch"
"--disable-build-with-cxx"))
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'apply-boot-patch
(lambda* (#:key inputs #:allow-other-keys)
(let ((patch-file (assoc-ref inputs "boot-patch")))
(format (current-error-port) "patch file=~s\n" patch-file)
(system* "patch" "--force" "-p1" "-i" patch-file))
#t))
;; c&p from commencement.scm:gcc-boot0
(add-after 'unpack 'unpack-gmp&co
(lambda* (#:key inputs #:allow-other-keys)
(let ((gmp (assoc-ref %build-inputs "gmp-source"))
(mpfr (assoc-ref %build-inputs "mpfr-source"))
(mpc (assoc-ref %build-inputs "mpc-source")))
;; To reduce the set of pre-built bootstrap inputs, build
;; GMP & co. from GCC.
(for-each (lambda (source)
(or (invoke "tar" "xvf" source)
(error "failed to unpack tarball"
source)))
(list gmp mpfr mpc))
;; Create symlinks like `gmp' -> `gmp-x.y.z'.
,@(map (lambda (lib)
;; Drop trailing letters, as gmp-6.0.0a unpacks
;; into gmp-6.0.0.
`(symlink ,(string-trim-right
(package-full-name lib "-")
char-set:letter)
,(package-name lib)))
(list gmp-boot mpfr-boot mpc-boot))
#t)))
(add-before 'configure 'setenv
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(binutils (assoc-ref %build-inputs "binutils"))
(bash (assoc-ref %build-inputs "bash"))
(gcc (assoc-ref %build-inputs "gcc"))
(glibc (assoc-ref %build-inputs "libc"))
(kernel-headers (assoc-ref %build-inputs "kernel-headers")))
(setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
(setenv "C_INCLUDE_PATH" (string-append
gcc "/lib/gcc-lib/i686-unknown-linux-gnu/2.95.3/include"
":" kernel-headers "/include"
":" glibc "/include"
":" (getcwd) "/mpfr/src"))
(setenv "LIBRARY_PATH" (string-append glibc "/lib"
":" gcc "/lib"))
(format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
(format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
#t))))))))
(define gcc-mesboot1
(package
(inherit gcc-core-mesboot1)
(name "gcc-mesboot1")
(version "4.6.4")
(native-inputs
`(("gcc-g++"
,(origin
(method url-fetch)
(uri (string-append "mirror://gnu/gcc/gcc-"
version "/gcc-g++-" version ".tar.gz"))
(sha256
(base32
"1fqqk5zkmdg4vmqzdmip9i42q6b82i3f6yc0n86n9021cr7ms2k9"))))
,@(package-native-inputs gcc-core-mesboot1)))
(arguments
(substitute-keyword-arguments (package-arguments gcc-core-mesboot1)
((#:configure-flags configure-flags)
`(let ((out (assoc-ref %outputs "out")))
`("--enable-languages=c,c++"
,@(filter
(negate (lambda (x) (string-prefix? "--enable-languages=" x)))
,configure-flags))))
((#:phases phases)
`(modify-phases ,phases
(add-before 'unpack 'unpack-g++
(lambda _
(let ((source-g++ (assoc-ref %build-inputs "gcc-g++")))
(invoke "tar" "xvf" source-g++))
#t))
(replace 'setenv
(lambda _
(setenv "CONFIG_SHELL" (which "sh"))
;; Allow MPFR headers to be found.
(setenv "C_INCLUDE_PATH"
(string-append (getcwd) "/mpfr/src:"
(getenv "C_INCLUDE_PATH")))
;; Set the C++ search path so that C headers can be found as
;; libstdc++ is being compiled.
(setenv "CPLUS_INCLUDE_PATH" (getenv "C_INCLUDE_PATH"))
#t))))))))
(define (%boot-mesboot2-inputs)
`(("gcc" ,gcc-mesboot1)
,@(alist-delete "gcc" (%boot-mesboot1-inputs))))
(define xz-mesboot
;; Finally, we can build xz.
(package
(inherit xz)
(name "xz-mesboot")
(version "5.0.0")
(source (bootstrap-origin
(origin
(method url-fetch)
(uri (list (string-append "http://tukaani.org/xz/xz-" version
".tar.gz")
(string-append "http://multiprecision.org/guix/xz-"
version ".tar.gz")))
(sha256
(base32
"0kf40ggbs1vaaj5s9k4csycahzqcf65n20pa6lngqhm6j0cj3agb")))))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(outputs '("out"))
(propagated-inputs '())
(native-inputs (%boot-mesboot2-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
#:configure-flags
`("--disable-assembler"
"--disable-shared"
"--enable-small"
"--disable-threads"
"--disable-xzdec"
"--disable-lzmadec"
"--disable-lzmainfo"
"--disable-lzma-links"
"--disable-scripts"
"--disable-doc"
"--disable-nls"
"--disable-symbol-versions"
;; configure disqualifies BASH, CPP, GCC and GREP
;; all of which seem fine for the build
"ac_cv_prog_cc_c99=-std=gnu9x"
"ac_cv_path_GREP=grep"
"gl_cv_posix_shell=bash"
"ac_cv_have_decl_optreset=no"
"CPPFLAGS=-D__GNUC__=1")))))
(define hello-mesboot
;; Check for Scheme-only bootstrap.
(package
(inherit hello)
(name "hello-mesboot")
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(native-inputs (%boot-mesboot2-inputs))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:parallel-build? #f
;; checking for grep that handles long lines and -e...
;; configure: error: no acceptable grep could be found
#:configure-flags '("ac_cv_path_GREP=grep")
#:phases
(modify-phases %standard-phases
(replace 'check
(lambda _
(invoke "./hello"))))))))
(define binutils-mesboot
(package
(inherit binutils)
(name "binutils-mesboot")
(version "2.20.1a")
(source (bootstrap-origin
(origin
(method url-fetch)
(uri (string-append "mirror://gnu/binutils/binutils-"
version ".tar.bz2"))
(patches (search-patches "binutils-boot-2.20.1a.patch"))
(sha256
(base32
"0r7dr0brfpchh5ic0z9r4yxqn4ybzmlh25sbp30cacqk8nb7rlvi")))))
(inputs '())
(propagated-inputs '())
(native-inputs `(("xz" ,xz-mesboot)
,@(%boot-mesboot2-inputs)))
(supported-systems '("i686-linux" "x86_64-linux"))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f ; runtest: command not found
#:parallel-build? #f
#:strip-binaries? #f ; no strip yet
#:configure-flags
`("CC=gcc"
"CXX=false"
"RANLIB=true"
"--disable-doc"
"--disable-nls"
"--disable-shared"
"--disable-werror"
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--with-sysroot=/"
;; checking for grep that handles long lines and -e
"ac_cv_path_GREP=grep")
;; FIXME: ac_cv_path_GREP=grep doesn't seem to be forwarded to
;; cascading configure's?
#:make-flags '("ac_cv_path_GREP=grep")
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'scripted-patch
(lambda _
;; sed-mesboot0 cannot build these
(copy-file "binutils/Makefile.in" "binutils/Makefile.in.orig")
(substitute* "binutils/Makefile.in"
;; binutils/binutils uses an amazingly complex install
;; command, using FOR, SED, READ, IF, ECHO, SED, SED, AWK,
;; READ, and then LIBTOOL (to do something like
;; `mkdir $DESTDIR$bindir; cp readline $DESTDIR$bindir ...')
;; Some tool [debugme!] cannot handle two escaped newlines
;; (bash?), and the install stops after $(am__EXEEXT_11)
;; ("objcopy"), so $(am__EXEEXT_13) ("readelf") and others do
;; not get installed. Remove the stray newline:
(("^\t@BUILD_NLMCONV@ @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ .*") ""))
(substitute* "opcodes/Makefile.in"
(("^SUBDIRS = [.] po") "SUBDIRS = ."))
(substitute* "binutils/Makefile.in"
(("^SUBDIRS = doc po") "SUBDIRS ="))
(substitute* "gas/Makefile.in"
(("^SUBDIRS = doc po") "SUBDIRS ="))
(substitute* "gprof/Makefile.in"
(("^SUBDIRS = po") "SUBDIRS ="))
(substitute* "ld/Makefile.in"
(("^SUBDIRS = po") "SUBDIRS ="))
#t)))))))
(define (%boot-mesboot3-inputs)
`(("binutils" ,binutils-mesboot)
("xz" ,xz-mesboot)
,@(alist-delete "binutils" (%boot-mesboot2-inputs))))
(define glibc-headers-mesboot
(package
(inherit glibc-mesboot0)
(name "glibc-headers-mesboot")
(version "2.16.0")
(source (bootstrap-origin
(origin
(method url-fetch)
(uri (string-append "mirror://gnu/glibc/glibc-"
version
".tar.gz"))
(patches (search-patches "glibc-boot-2.16.0.patch"
"glibc-bootstrap-system-2.16.0.patch"))
(sha256
(base32
"0vlz4x6cgz7h54qq4528q526qlhnsjzbsvgc4iizn76cb0bfanx7")))))
(native-inputs `(("headers" ,mesboot-headers)
,@(%boot-mesboot3-inputs)))
(arguments
(substitute-keyword-arguments (package-arguments glibc-mesboot0)
((#:configure-flags configure-flags)
`(let ((out (assoc-ref %outputs "out"))
(headers (assoc-ref %build-inputs "headers")))
(list
(string-append "--prefix=" out)
"--disable-obsolete-rpc"
"--host=i686-unknown-linux-gnu"
(string-append "--with-headers=" headers "/include")
"--enable-static-nss"
"--with-pthread"
"--without-cvs"
"--without-gd"
"--enable-add-ons=nptl"
;; avoid: configure: error: confusing output from nm -u
"libc_cv_predef_stack_protector=no")))
((#:make-flags make-flags)
'(list "install-bootstrap-headers=yes" "install-headers"))
((#:phases phases)
`(modify-phases ,phases
(delete 'apply-boot-patch)
(delete 'fixup-configure)
(delete 'set-path)
(replace 'unpack
(lambda* (#:key source #:allow-other-keys)
(invoke "tar" "xvf" source)
(chdir (string-append "glibc-" ,version))
#t))
(replace 'setenv
(lambda* (#:key inputs #:allow-other-keys)
(let* ((headers (assoc-ref inputs "headers"))
(libc (assoc-ref inputs "libc"))
(gcc (assoc-ref inputs "gcc"))
(cppflags (string-append
" -I " (getcwd) "/nptl/sysdeps/pthread/bits"
" -D BOOTSTRAP_GLIBC=1"))
(cflags (string-append " -L " (getcwd)
" -L " libc "/lib")))
(setenv "libc_cv_friendly_stddef" "yes")
(setenv "CONFIG_SHELL" (which "sh"))
(setenv "SHELL" (which "sh"))
(setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
(setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags))
(setenv "LD" "gcc")
;; avoid -fstack-protector
(setenv "libc_cv_ssp" "false")
(substitute* "configure"
(("/bin/pwd") "pwd"))
#t)))
(replace 'install
(lambda* (#:key outputs make-flags #:allow-other-keys)
(let ((kernel-headers (assoc-ref %build-inputs "kernel-headers"))
(out (assoc-ref outputs "out")))
(and (apply invoke "make" make-flags)
(copy-recursively kernel-headers out)
#t))))
(replace 'configure
(lambda* (#:key configure-flags #:allow-other-keys)
(format (current-error-port) "running ../configure ~a\n" (string-join configure-flags))
(mkdir-p "build")
(chdir "build")
(apply invoke "../configure" configure-flags)))
(add-after 'configure 'remove-sunrpc
(lambda _
(let* ((out (assoc-ref %outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(shell (string-append bash "/bin/bash")))
(let ((Makefile (open-file "Makefile" "a")))
(display (string-append "
SHELL := " shell "
")
Makefile)
(close Makefile))
(substitute* "../Makefile"
(("^SHELL := /bin/sh") (string-append "SHELL := " shell)))
(substitute* "../Makeconfig"
(("^SHELL := /bin/sh") (string-append "SHELL := " shell)))
(substitute* "../elf/Makefile"
(("^SHELL := /bin/sh") (string-append "SHELL := " shell)))
(invoke "make" (string-append (getcwd) "/sysd-sorted" ))
(substitute* "sysd-sorted"
((" sunrpc") " ")
((" nis") " "))
#t)))))))))
(define glibc-mesboot
(package
(inherit glibc-headers-mesboot)
(name "glibc-mesboot")
(native-inputs `(("headers" ,glibc-headers-mesboot)
,@(%boot-mesboot3-inputs)))
(arguments
`(#:validate-runpath? #f ; fails when using --enable-shared
,@(substitute-keyword-arguments (package-arguments glibc-headers-mesboot)
((#:make-flags make-flags)
`(let ((bash (assoc-ref %build-inputs "bash")))
(list (string-append "SHELL=" bash "/bin/sh"))))
((#:phases phases)
`(modify-phases ,phases
(replace 'install
(lambda* (#:key outputs make-flags #:allow-other-keys)
(let* ((kernel-headers (assoc-ref %build-inputs "kernel-headers"))
(out (assoc-ref outputs "out"))
(install-flags (cons "install" make-flags)))
(and (apply invoke "make" install-flags)
(copy-recursively kernel-headers out)
#t)))))))))))
(define (%boot-mesboot4-inputs)
`(("libc" ,glibc-mesboot)
,@(alist-delete "libc" (%boot-mesboot3-inputs))))
(define gcc-mesboot1-wrapper
;; We need this so gcc-mesboot1 can be used to create shared binaries that
;; have the correct interpreter, otherwise configuring gcc-mesboot using
;; --enable-shared will fail.
(package
(inherit gcc-mesboot1)
(name "gcc-mesboot1-wrapper")
(source #f)
(inputs '())
(native-inputs `(("bash" ,bash-mesboot)
("coreutils" ,coreutils-mesboot0)
("libc" ,glibc-mesboot)
("gcc" ,gcc-mesboot1)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:phases
(modify-phases %standard-phases
(delete 'unpack)
(delete 'configure)
(delete 'install)
(replace 'build
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bash (assoc-ref %build-inputs "bash"))
(libc (assoc-ref %build-inputs "libc"))
(gcc (assoc-ref %build-inputs "gcc"))
(bin (string-append out "/bin")))
(mkdir-p bin)
(for-each
(lambda (program)
(let ((wrapper (string-append bin "/" program)))
(with-output-to-file wrapper
(lambda _
(display (string-append "#! " bash "/bin/bash
exec " gcc "/bin/" program
" -Wl,--dynamic-linker"
;; also for x86_64-linux, we are still on i686-linux
" -Wl," libc ,(glibc-dynamic-linker "i686-linux")
" -Wl,--rpath"
" -Wl," libc "/lib"
" \"$@\"
"))
(chmod wrapper #o555)))))
'("cpp"
"gcc"
"g++"
"i686-unknown-linux-gnu-cpp"
"i686-unknown-linux-gnu-gcc"
"i686-unknown-linux-gnu-g++"))
#t)))
(replace 'check
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bin (string-append out "/bin"))
(program (string-append bin "/gcc")))
(invoke program "--help")))))))))
(define gcc-mesboot
(package
(inherit gcc-mesboot1)
(name "gcc-mesboot")
(version (package-version gcc-4.9))
(source (bootstrap-origin (package-source gcc-4.9)))
(native-inputs `(("gcc-wrapper" ,gcc-mesboot1-wrapper)
("gcc" ,gcc-mesboot1)
("headers" ,glibc-headers-mesboot)
,@(%boot-mesboot4-inputs)))
(arguments
`(#:validate-runpath? #f
,@(substitute-keyword-arguments (package-arguments gcc-mesboot1)
((#:configure-flags configure-flags)
`(let ((out (assoc-ref %outputs "out"))
(glibc (assoc-ref %build-inputs "libc")))
(list (string-append "--prefix=" out)
"--build=i686-unknown-linux-gnu"
"--host=i686-unknown-linux-gnu"
"--with-host-libstdcxx=-lsupc++"
(string-append "--with-native-system-header-dir=" glibc "/include")
(string-append "--with-build-sysroot=" glibc "/include")
"--disable-bootstrap"
"--disable-decimal-float"
"--disable-libatomic"
"--disable-libcilkrts"
"--disable-libgomp"
"--disable-libitm"
"--disable-libmudflap"
"--disable-libquadmath"
"--disable-libsanitizer"
"--disable-libssp"
"--disable-libvtv"
"--disable-lto"
"--disable-lto-plugin"
"--disable-multilib"
"--disable-plugin"
"--disable-threads"
"--enable-languages=c,c++"
"--enable-static"
"--enable-shared"
"--enable-threads=single"
;; No pre-compiled libstdc++ headers, to save space.
"--disable-libstdcxx-pch"
;; for libcpp ...
"--disable-build-with-cxx")))
((#:phases phases)
`(modify-phases ,phases
(delete 'apply-boot-patch)
(delete 'unpack-g++) ; sadly, gcc-4.9.4 does not provide
; modular core/language downloads
(replace 'setenv
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(binutils (assoc-ref %build-inputs "binutils"))
(bash (assoc-ref %build-inputs "bash"))
(gcc (assoc-ref %build-inputs "gcc"))
(glibc (assoc-ref %build-inputs "libc"))
(kernel-headers (assoc-ref %build-inputs "kernel-headers")))
(setenv "CONFIG_SHELL" (string-append bash "/bin/sh"))
(setenv "C_INCLUDE_PATH" (string-append
gcc "/lib/gcc-lib/i686-unknown-linux-gnu/4.6.4/include"
":" kernel-headers "/include"
":" glibc "/include"
":" (getcwd) "/mpfr/src"))
(setenv "CPLUS_INCLUDE_PATH" (string-append
gcc "/lib/gcc-lib/i686-unknown-linux-gnu/4.6.4/include"
":" kernel-headers "/include"
":" glibc "/include"
":" (getcwd) "/mpfr/src"))
(setenv "LIBRARY_PATH" (string-append glibc "/lib"
":" gcc "/lib"))
(format (current-error-port) "C_INCLUDE_PATH=~a\n" (getenv "C_INCLUDE_PATH"))
(format (current-error-port) "CPLUS_INCLUDE_PATH=~a\n" (getenv "CPLUS_INCLUDE_PATH"))
(format (current-error-port) "LIBRARY_PATH=~a\n" (getenv "LIBRARY_PATH"))
#t))))))))))
(define gcc-mesboot-wrapper
;; We need this so gcc-mesboot can be used to create shared binaries that
;; have the correct interpreter and runpath to libc.
(package
(inherit gcc-mesboot1-wrapper)
(name "gcc-mesboot-wrapper")
(version (package-version gcc-mesboot))
(source #f)
(inputs '())
(native-inputs `(("bash" ,bash-mesboot)
("coreutils" ,coreutils-mesboot0)
("libc" ,glibc-mesboot)
("gcc" ,gcc-mesboot)))))
(define (%boot-mesboot5-inputs)
`(("gcc-wrapper" ,gcc-mesboot-wrapper)
("gcc" ,gcc-mesboot)
,@(fold alist-delete (%boot-mesboot4-inputs) '("gcc" "gcc-wrapper"))))
(define coreutils-mesboot
(package
(inherit coreutils)
(name "coreutils-mesboot")
(source (bootstrap-origin (package-source coreutils)))
(native-inputs (%boot-mesboot5-inputs))
(supported-systems '("i686-linux" "x86_64-linux"))
(inputs '())
(propagated-inputs '())
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:tests? #f))))
(define (%boot-mesboot6-inputs)
`(("coreutils" ,coreutils-mesboot)
,@(fold alist-delete (%boot-mesboot5-inputs)
'("coreutils" "kernel-headers"))))
(define (%bootstrap-inputs+toolchain)
;; The traditional bootstrap-inputs. For the i686-linux, x86_64-linux
;; Scheme-only bootstrap the actual reduced set with bootstrapped toolchain.
(match (%current-system)
((or "i686-linux" "x86_64-linux")
(%boot-mesboot6-inputs))
(_
(%bootstrap-inputs))))
(define gnu-make-boot0
(package
(inherit gnu-make)
(source (bootstrap-origin (package-source gnu-make)))
(name "make-boot0")
(arguments
`(#:guile ,%bootstrap-guile
#:implicit-inputs? #f
#:tests? #f ; cannot run "make check"
,@(substitute-keyword-arguments (package-arguments gnu-make)
((#:configure-flags flags ''())
;; The generated config.status has some problems due to the
;; bootstrap environment. Disable dependency tracking to work
;; around it.
`(cons "--disable-dependency-tracking" ,flags))
((#:phases phases)
`(modify-phases ,phases
(replace 'build
(lambda _
(invoke "./build.sh")))
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bin (string-append out "/bin")))
(install-file "make" bin)
#t))))))))
(native-inputs '()) ; no need for 'pkg-config'
(inputs (%bootstrap-inputs+toolchain))))
(define bzip2-boot0
(package
(inherit bzip2)
(name "bzip2-boot0")
(native-inputs `())
(inputs
`(("diffutils" ,diffutils-boot0)
("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:guile ,%bootstrap-guile
#:implicit-inputs? #f
,@(package-arguments bzip2)))))
(define coreutils-boot0
(package
(inherit coreutils)
(source (bootstrap-origin (package-source coreutils)))
(name "coreutils-boot0")
(native-inputs `())
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:tests? #f
#:implicit-inputs? #f
#:guile ,%bootstrap-guile
,@(package-arguments coreutils)))))
(define diffutils-boot0
(package
(inherit diffutils)
(name "diffutils-boot0")
(native-inputs `())
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:tests? #f ; the test suite needs diffutils
#:guile ,%bootstrap-guile
#:implicit-inputs? #f
,@(match (%current-system)
((or "arm-linux" "aarch64-linux")
(substitute-keyword-arguments (package-arguments diffutils)
((#:configure-flags flags ''())
;; The generated config.status has some problems due to the
;; bootstrap environment. Disable dependency tracking to work
;; around it.
`(cons "--disable-dependency-tracking" ,flags))))
(_ '()))))))
(define findutils-boot0
(package
(inherit findutils)
(name "findutils-boot0")
(source (bootstrap-origin (package-source findutils)))
(inputs
`(("make" ,gnu-make-boot0)
("diffutils" ,diffutils-boot0) ; for tests
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:implicit-inputs? #f
#:guile ,%bootstrap-guile
;; The build system assumes we have done a mistake when time_t is 32-bit
;; on a 64-bit system. Ignore that for our bootstrap toolchain.
,@(substitute-keyword-arguments (package-arguments findutils)
((#:configure-flags flags ''())
`(append
,(if (target-64bit?)
''("TIME_T_32_BIT_OK=yes")
''())
,(match (%current-system)
((or "arm-linux" "aarch64-linux")
''("--disable-dependency-tracking"))
(_ ''()))
,flags)))))))
(define file
(package
(inherit (@ (gnu packages file) file))
(arguments
`(#:configure-flags
`("--disable-bzlib"
,,@(match (%current-system)
((or "arm-linux" "aarch64-linux")
'("--disable-dependency-tracking"))
(_ '())))))))
(define file-boot0
(package
(inherit file)
(source (bootstrap-origin (package-source file)))
(name "file-boot0")
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:tests? #f ; merge test fails
#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:configure-flags '("--disable-bzlib")
#:strip-binaries? #f
#:validate-runpath? #f
,@(package-arguments file)))))
(define gawk-boot0
(package
(inherit patch)
(source (bootstrap-origin (package-source gawk)))
(name "gawk-boot0")
(native-inputs '())
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:tests? #f
#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:strip-binaries? #f
#:validate-runpath? #f))))
(define patch-boot0
(package
(inherit patch)
(source (bootstrap-origin (package-source patch)))
(name "patch-boot0")
(native-inputs '())
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:tests? #f ; merge test fails
#:implicit-inputs? #f
#:guile ,%bootstrap-guile
#:strip-binaries? #f
#:validate-runpath? #f))))
(define sed-boot0
(package
(inherit sed)
(name "sed-boot0")
(source (bootstrap-origin (package-source sed)))
(native-inputs '())
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:implicit-inputs? #f
#:tests? #f
#:guile ,%bootstrap-guile
,@(package-arguments sed)))))
(define tar-boot0
(package
(inherit tar)
(name "tar-boot0")
(source (bootstrap-origin (package-source tar)))
(native-inputs '())
(inputs
`(("make" ,gnu-make-boot0)
,@(%bootstrap-inputs+toolchain)))
(arguments
`(#:implicit-inputs? #f
#:tests? #f
#:guile ,%bootstrap-guile
,@(package-arguments tar)))))
(define (%boot0-inputs)
`(,@(match (%current-system)
((or "i686-linux" "x86_64-linux")
`(("bzip2" ,bzip2-boot0)
("coreutils" ,coreutils-boot0)
("gawk" ,gawk-boot0)
("patch" ,patch-boot0)
("sed" ,sed-boot0)
("tar" ,tar-boot0)))
(_ '()))
("make" ,gnu-make-boot0)
("diffutils" ,diffutils-boot0)
("findutils" ,findutils-boot0)
("file" ,file-boot0)
,@(%bootstrap-inputs+toolchain)))
(define* (boot-triplet #:optional (system (%current-system)))
;; Return the triplet used to create the cross toolchain needed in the
;; first bootstrapping stage.
(nix-system->gnu-triplet system "guix"))
;; Following Linux From Scratch, build a cross-toolchain in stage 0. That
;; toolchain actually targets the same OS and arch, but it has the advantage
;; of being independent of the libc and tools in
;; (%BOOTSTRAP-INPUTS+TOOLCHAIN), since GCC-BOOT0 (below) is built without any
;; reference to the target libc.
(define binutils-boot0