doc: Release udpate.
[mes.git] / BOOTSTRAP
1 bootstrappable.org project                                           -*- org -*-
2
3 * What?
4 ** Full source bootstrapping for GuixSD
5 * Why?
6 ** Reproducibility is essential to Software Freedom
7 Reproducible builds are a set of software development practices that
8 create a verifiable path from human readable source code to the binary
9 code used by computers.
10 *** What about the compiler?
11 We have the sources: they always lead to bitwise-same binary, but what
12 about the compiler?
13 *** The current way out: Ignore the problem
14
15  ``recipe for yoghurt: add yoghurt to milk''
16
17 *** From the GuixSD manual
18
19    The distribution is fully “bootstrapped” and “self-contained”: each
20 package is built based solely on other packages in the distribution.
21
22 The root of this dependency graph is a small set of “bootstrap
23 binaries”, provided by the ‘(gnu packages bootstrap)’ module.  For more
24 information on bootstrapping, *note Bootstrapping::.
25
26 *** New solution: Full source bootstrapping path, Stage0 and Mes
27 * How?
28 ** Software: Stage0 and Mes
29 ** Stage0
30
31 *** hex.0: amazing ~300 byte self-hosting hex assembler that we consider to be source
32 *** a M0 macro assembler written in .0
33 *** a M1 macro assembler written in M0
34 *** a hex2 linker written in M0
35
36 Look:
37     https://git.savannah.nongnu.org/cgit/stage0.git/tree/Linux%20Bootstrap/hex0.hex
38
39 Do:
40     git clone https://git.savannah.nongnu.org/git/stage0.git
41     cd stage0
42     make
43     bin/hex < Linux\ Bootstrap/hex0.hex > hex-1
44     chmod +x hex-1  # later: bin/exec_enable hex-1
45     ./hex-1 < Linux\ Bootstrap/hex0.hex > hex-2
46
47 ** Mes
48
49     https://gitlab.com/janneke/mes
50
51 *** mes.c: a scheme interpreter prototyped in C ~1400 Lines
52 *** mescc.scm: a C compiler written in Scheme (uses Nyacc C99 parser in Scheme)
53 *** mes.M1: this scheme interpreter in annotated M1 assembly
54
55 ** Naive recipe
56     hex + hex.0 => hex-1
57     hex-1 + M0.0 -> M0
58     M0 + M1.M0 -> M1.0
59     M0 + hex2_linker.M0 -> hex2_linker
60     M1 + mes.M1 -> mes.hex2
61         hex2_linker + stage0/elf32-header.hex2 + mes.hex2 + elf32-footer.hex2 -> mes
62     mes + mescc.scm + tcc.c -> tcc.M1 -> tcc.hex2 -> mes-tcc
63     mes-tcc + gcc.c -> gcc
64     *done*
65 ** Less naive recipe
66 *** Use hex2_linker, M1 prototyped in C from
67     https://github.com/oriansj/mescc-tools
68 *** Remember that mes.M1 is compiled by mescc from prototyped src/mes.c in C.
69 *** stage0/mescc-tools: TODO
70 *** Mes
71    M1 -f stage0/x86.M1 -f mlibc/crt1.M1 --LittleEndian --Architecture=1 > mlibc/crt1.hex2
72    M1 -f stage0/x86.M1 -f mlibc/mini-libc-mes.M1 --LittleEndian --Architecture=1  > mlibc/libc-mes.hex2
73    M1 -f stage0/x86.M1 -f src/mes.M1 --LittleEndian --Architecture=1 > src/mes.hex2
74    hex2 --LittleEndian --Architecture=1 --BaseAddress=0x1000000 -f stage0/elf32-header.hex2 -f mlibc/crt1.hex2 -f mlibc/libc-mes.hex2 -f src/mes.hex2 -f stage0/elf32-footer-single-main.hex2 > src/mes-mes
75    exec_enable src/mes-mes
76 *** Tinycc
77    ./build.sh
78    ./link.sh
79 * DONE
80 ** stage0: hex.0, M0 done; M1, hex2_linker prototyped in C
81 ** tcc compiled with mescc correctly compiles: int main () {return 42;}
82 ** mes+mescc.scm are mutual self hosting
83 ** during development we run mescc.scm on Guile (mes is slooowww)
84 ** tcc compiled with gcc is known to compile gcc
85
86 * TODO
87 ** fix mescc.scm so that tcc can correctly compile gcc
88 ** fix bootstrap-loops: (Nyacc?, mes.M1?, psyntax.pp?)
89 ** make GNU gcc (8.0?) bootstrappable again, remove [need for] tcc stage
90 ** stage1/2 LISP, FORTH?
91 ** rain1's LISP compiler?
92 ** integrate with GuixSD
93 ** x86_64, arm?
94 * Contact
95 ** #bootstrappable, #guix on freenode
96 ** bootstrappable.org