mescc: Mes C Library: Fix ungetc.
[mes.git] / BOOTSTRAP
1                                                               -*- org -*-
2 #+TITLE: bootstrappable.org project
3
4 Copyright © 2016, 2017, 2018 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 GuixSD
12
13 A package in GuixSD is can be uniquely identified by the hash of its
14 source 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 GuixSD 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 **** GuixSD bootstrap tarballs
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 * Why?
48 ** Reproducibility is essential to Software Freedom
49
50 Reproducible builds are a set of software development practices that
51 create a verifiable path from human readable source code to the binary
52 code used by computers.
53
54 *** What about the bootstrap binaries and the compilers?
55
56 We have the sources: they always lead to bitwise-same binary, but what
57 about the bootstrap binaries and compilers?
58
59 *** The current way out: Ignore the problem
60
61  ``recipe for yogurt: add yogurt to milk''
62
63 *** New solution: Full source bootstrapping path
64
65 * How?
66 ** Software: MesCC-tools, M2-Planet, GNU Mes and MesCC
67 ** MesCC-tools
68
69     https://github.com/oriansj/mescc-tools
70
71 *** hex.0: ~500 byte well-documented, self-hosting hex assembler
72
73 This 500 byte program is written in ASCII hex.  When converted
74 byte-for-byte from ASCCI to binary we have the only binary seed that
75 our full source bootstrap path needs.
76
77 We bless this simple and easily verifyable binary and consider it to
78 be source.
79
80 *** hex1: next level hex assembler written in hex.0
81 *** M0: a macro assembler written in hex.1
82 *** M1: a macro assembler written in M0
83 *** hex2: a hex2 linker written in M0
84 *** M2-Planet: a self-hosting M2 (C-with-structs) transpiler written in M1
85 *** GNU Mes: A Scheme interpreter written in C, with cpp transformed into M2
86 *** MesCC: A C compiler written in Scheme
87 *** tcc-boot: a patched version of TinyCC
88
89 ** GNU Mes and MesCC
90
91     https://www.gnu.org/software/mes
92
93 *** mes.c: a Scheme interpreter in ~5,000LOC of simple C
94 *** mescc: a C compiler written in Scheme (uses Nyacc C99 parser in Scheme)
95 *** mes.M2: this Scheme interpreter in preprocessed M2
96
97 ** TinyCC
98
99     https://gitlab.com/janneke/tinycc
100
101 * TODO
102 ** remove or upstream patches from tcc-boot
103 ** prepare src/mes.c for M2-Planet transpiler.
104 ** arm, the Hurd
105 ** fix bootstrap-loops: (Nyacc?, mes.M2, psyntax.pp?)
106 ** make GNU gcc (8.0?) bootstrappable again, remove [need for] tcc stage
107 * DONE
108 ** upstream mes-boot to GuixSD.
109 ** replace GuixSD bootstrap for x86_64.
110 ** replace GuixSD bootstrap for x86.
111 ** add full source gcc-4.7 package build.
112 ** bootstrap gcc+glibc-built binutils-20.1, gcc-4.1.0.
113 ** have tcc-boot compile gnutools triplet: binutils-2.14, gcc-2.95.3, glibc-2.2.5.
114 ** have tcc-boot's mes-tcc compile a fully functional tcc
115 ** hex.0, hex.1, M0
116 ** M1, hex2_linker in simple C
117 ** M2-Planet is now self-hosting, written in M2
118 ** mes+mescc are mutual self-hosting
119 ** patched tcc compiled with mes+mescc
120 ** during development we run mescc on Guile (mes is ~30 times slower)
121 ** tcc compiled with gcc is known to compile gcc
122
123 * Contact
124 ** #bootstrappable, #guix on freenode
125 ** bootstrappable.org