doc: Migration to Libera Chat.
[mes.git] / BOOTSTRAP
1                                                               -*- org -*-
2 #+TITLE: bootstrappable.org project
3
4 Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
5
6   Copying and distribution of this file, with or without modification,
7   are permitted in any medium without royalty provided the copyright
8   notice and this notice are preserved.
9
10 * What?
11 ** Full source bootstrapping for the GNU System
12
13 A package in GNU Guix is uniquely identified by the hash of its source
14 code, its dependencies, and its build recipe.
15
16 Every package can be built from source, except for the bootstrap
17 binaries.
18
19 *** From the GNU Guix manual
20
21 The distribution is fully “bootstrapped” and “self-contained”: each
22 package is built based solely on other packages in the distribution.
23
24 The root of this dependency graph is a small set of “bootstrap
25 binaries”, provided by the ‘(gnu packages bootstrap)’ module.  For more
26 information on bootstrapping, *note Bootstrapping::.
27
28 **** Guix v1.0 bootstrap binary seed
29
30 $ du -schx $(readlink $(guix build bootstrap-tarballs)/*)
31 2.1M    /gnu/store/9623n4bq6iq5c8cwwdq99qb7d0xj93ym-binutils-static-stripped-tarball-2.28.1/binutils-static-stripped-2.28.1-x86_64-linux.tar.xz
32 18M     /gnu/store/437xwygmmwwpkddcyy1qvjcv4hak89pb-gcc-stripped-tarball-5.5.0/gcc-stripped-5.5.0-x86_64-linux.tar.xz
33 1.8M    /gnu/store/55ccx18a0d1x5y6a575jf1yr0ywizvdg-glibc-stripped-tarball-2.26.105-g0890d5379c/glibc-stripped-2.26.105-g0890d5379c-x86_64-linux.tar.xz
34 5.7M    /gnu/store/bqf0ajclbvnbm0a46819f30804y3ilx0-guile-static-stripped-tarball-2.2.3/guile-static-stripped-2.2.3-x86_64-linux.tar.xz
35 5.8M    /gnu/store/j8yzjmh9sy4gbdfwjrhw46zca43aah6x-static-binaries-tarball-0/static-binaries-0-x86_64-linux.tar.xz
36 33M     total
37 $ for i in $(readlink $(guix build bootstrap-tarballs)/*);\
38   do sudo tar xf $i; done
39 $ du -schx *
40 130M    bin
41 13M     include
42 54M     lib
43 51M     libexec
44 5.2M    share
45 252M    total
46
47 **** Guix Reduced Binary Seed bootstrap binary seed
48
49 $ du -schx $(readlink $(guix build bootstrap-tarballs)/*)
50 5.7M    /gnu/store/9f8gi8raqfx9j3l9d00qrrc0jg3r1kyj-guile-static-stripped-tarball-2.2.6/guile-static-stripped-2.2.6-x86_64-linux.tar.xz
51 80K     /gnu/store/b6rjl52hibhmvyw4dg8678pwryhla0h2-linux-libre-headers-stripped-tarball-4.19.56/linux-libre-headers-stripped-4.19.56-x86_64-linux.tar.xz
52 12K     /gnu/store/d7zlxsjcnqilmvqwx7scija9x9bjw8cw-mescc-tools-static-stripped-tarball-0.5.2-0.bb062b0/mescc-tools-static-stripped-0.5.2-0.bb062b0-x86_64-linux.tar.xz
53 428K    /gnu/store/n7zc4kpi8ny6jlfaikkzxlwhc5fvr1vr-mes-minimal-stripped-tarball-0.19/mes-minimal-stripped-0.19-x86_64-linux.tar.xz
54 6.0M    /gnu/store/nv4djwlrljfqmynqr2cqvfwz0ydx7kxb-static-binaries-tarball-0/static-binaries-0-x86_64-linux.tar.xz
55 13M     total
56 $ for i in $(readlink $(guix build bootstrap-tarballs)/*);\
57   do sudo tar xf $i; done
58 Password:
59 $ du -schx *
60 93M     bin
61 700K    include
62 38M     lib
63 14M     share
64 145M    total
65
66 **** Guix Scheme-only bootstrap binary seed
67
68 $ du -schx $(readlink $(~/src/guix/wip-bootstrap/pre-inst-env guix build bootstrap-tarballs)/*)
69 5.7M    /gnu/store/1mq2pcd2h7g54xpi2jrgj6ibbi4lgi3c-guile-static-stripped-tarball-2.2.6/guile-static-stripped-2.2.6-x86_64-linux.tar.xz
70 80K     /gnu/store/bl1r2bpk6fam8r2gjvr5mvr48i3dm2hn-linux-libre-headers-stripped-tarball-4.19.56/linux-libre-headers-stripped-4.19.56-x86_64-linux.tar.xz
71 12K     /gnu/store/w0dlz486dhb8aiq8pxm5akllz628fqin-mescc-tools-static-stripped-tarball-0.5.2-0.bb062b0/mescc-tools-static-stripped-0.5.2-0.bb062b0-x86_64-linux.tar.xz
72 428K    /gnu/store/15j6l18q44ymlrh1cfp4s4hc9835xic5-mes-minimal-stripped-tarball-0.19/mes-minimal-stripped-0.19-x86_64-linux.tar.xz
73 6.2M    total
74 $ for i in $(readlink $(~/src/guix/wip-bootstrap/pre-inst-env guix build bootstrap-tarballs)/*);\
75   do sudo tar xf $i; done
76 $ du -schx *
77 4.9M    bin
78 700K    include
79 38M     lib
80 14M     share
81 57M     total
82
83 * Why?
84 ** Reproducibility is essential to Software Freedom
85
86 Reproducible builds are a set of software development practices that
87 create a verifiable path from human readable source code to the binary
88 code used by computers.
89
90 *** What about the bootstrap binaries and the compilers?
91
92 We have the sources: they always lead to bitwise-same binary, but what
93 about the bootstrap binaries and compilers?
94
95 *** The current way out: Ignore the problem
96
97  ``recipe for yogurt: add yogurt to milk''
98
99 *** New solution: Full source bootstrapping path
100
101 * How?
102 ** Software: MesCC-tools, M2-Planet, GNU Mes and MesCC
103 ** MesCC-tools
104
105     https://savannah.gnu.org/projects/mescc-tools
106
107 *** hex.0: ~500 byte well-documented, self-hosting hex assembler
108
109 This 500 byte program is written in ASCII hex.  When converted
110 byte-for-byte from ASCCI to binary we have the only binary seed that
111 our full source bootstrap path needs.
112
113 We bless this simple and easily verifyable binary and consider it to
114 be source.
115
116 *** hex1: next level hex assembler written in hex.0
117 *** M0: a macro assembler written in hex.1
118 *** M1: a macro assembler written in M0
119 *** hex2: a hex2 linker written in M0
120 *** M2-Planet: a self-hosting M2 (C-with-structs) transpiler written in M1
121 *** GNU Mes: A Scheme interpreter written in C, with cpp transformed into M2
122 *** MesCC: A C compiler written in Scheme
123 *** tcc-boot: a patched version of TinyCC
124
125 ** GNU Mes and MesCC
126
127     https://www.gnu.org/software/mes
128
129 *** mes.c: a Scheme interpreter in ~5,000LOC of simple C
130 *** mescc: a C compiler written in Scheme (uses Nyacc C99 parser in Scheme)
131 *** mes.M2: this Scheme interpreter in bootstrappable M2
132
133 ** TinyCC
134
135     https://gitlab.com/janneke/tinycc
136
137 * TODO
138 ** merge scheme-only bootstrap into Guix.
139 ** reduced binary seed bootstrap into NixOS, Debian.
140 ** remove or upstream patches from tcc-boot
141 ** prepare src/mes.c for M2-Planet transpiler.
142 ** ARM, the Hurd
143 ** fix bootstrap-loops: (Nyacc?, mes.M2, psyntax.pp?)
144 ** make GNU gcc (8.0?) bootstrappable again, remove [need for] tcc stage
145 * DONE
146 ** reduced binary seed bootstrap into Guix.
147 ** replace Guix bootstrap for x86_64.
148 ** replace Guix bootstrap for x86.
149 ** add full source gcc-4.7 package build.
150 ** bootstrap gcc+glibc-built binutils-20.1, gcc-4.1.0.
151 ** have tcc-boot compile gnutools triplet: binutils-2.14, gcc-2.95.3, glibc-2.2.5.
152 ** have tcc-boot's mes-tcc compile a fully functional tcc
153 ** hex.0, hex.1, M0
154 ** M1, hex2_linker in simple C
155 ** M2-Planet is now self-hosting, written in M2
156 ** mes+mescc are mutual self-hosting
157 ** patched tcc compiled with mes+mescc
158 ** during development we run mescc on Guile (mes is ~30 times slower)
159 ** tcc compiled with gcc is known to compile gcc
160
161 * Contact
162 ** bug-mes@gnu.org
163 ** #bootstrappable, #guix on libera.chat
164 ** bootstrappable.org