docs: four directories, and a rule for when a thing leaves the roadmap
docs/ was ten files where a plan, a description, a guide and a bug report all
sat next to each other. It is now architecture/ (what SchOS is), plan/ (what it
will be), guides/ (how to work on it) and history/ (why it is like this), with
an index that states the one rule holding it together: when something is
finished it moves from plan/ to architecture/ and is rewritten as a description
of the thing rather than a record of building it.
A ticked checkbox says the work happened. It does not say what the work
*produced*, and six months later the checkbox is all that is left. The network
stack proved the point: finished, verified end to end, and for a month the only
description of it anywhere was a checkbox four levels of indentation deep.
So roadmap.md went from 534 lines to 181 -- nothing deleted, the done work
graduated. Seven subsystems that were finished and undescribed now have
descriptions: boot, kernel, syscalls, filesystem, networking, graphics, usb,
init. Every one ends with "What it does not do", which is the section that pays;
a document listing only strengths is marketing, and the reader who needs it most
is the one about to trip over a limitation nobody wrote down.
schfs.md still opened with "phases 1 through 3 1/2 are done, phase 4 is next"
long after all five had landed. It is a description now, with the phase record
and the hard-won bugs moved to history/.
Three corrections found on the way, all load-bearing:
* projects/schcom/README.md claimed SCM_RIGHTS was done. There is no
sendmsg/recvmsg in the kernel at all, and an entire GUI plan rested on it.
* The root README said "No TCP/IP" months after the stack landed.
* history/kernel.md sec.7 was marked "in progress" on a problem that process
groups solved.
Also adds plan/1.0.md, which draws a finish line so the open list stops being
infinite, and marks schwm/ and schde/ superseded: in Wayland the compositor is
the window manager, so that split dissolves rather than being abandoned.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQ7Qx8E1q1M1bbCq8QLHS2
This commit is contained in:
parent
817d666068
commit
57aff40228
59 changed files with 3981 additions and 1124 deletions
125
docs/building.md
125
docs/building.md
|
|
@ -1,125 +0,0 @@
|
|||
<!-- SPDX-License-Identifier: Apache-2.0 -->
|
||||
# Building SchOS
|
||||
|
||||
Supported hosts: **Linux, macOS, FreeBSD/OpenBSD/NetBSD, and Windows** (under
|
||||
Git Bash or MSYS2). The build is developed from both Windows and Linux, so a
|
||||
change that only works on one of them is a bug.
|
||||
|
||||
```sh
|
||||
make # kernel + UEFI loader + root filesystem
|
||||
make qemu # build and boot it
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
| Need | Why | Windows | Linux | macOS | BSD |
|
||||
|---|---|---|---|---|---|
|
||||
| `clang`, `ld.lld`, `llvm-objcopy`, `llvm-objdump` | cross-compiles the kernel, the 16/32-bit boot code, and musl userland | LLVM installer | `clang lld llvm` | `brew install llvm` | `pkg install llvm` |
|
||||
| `make` | — | Git Bash | `make` | Xcode CLT | `gmake` |
|
||||
| `perl` | generates the interrupt vector table | Git Bash | usually present | present | `pkg install perl5` |
|
||||
| `python3` | boot logo, crash-screen QR | python.org (`python`) | `python3` | `brew install python` | `pkg install python3` |
|
||||
| `qemu-system-x86_64` | running and testing | `scoop install qemu` | `qemu-system-x86` | `brew install qemu` | `pkg install qemu` |
|
||||
| `curl`, `tar` | fetching ports | Git Bash | present | present | present |
|
||||
| `xorriso` **or** `mkisofs` | `make iso` only | `scoop install cdrtools` | `xorriso` | `brew install xorriso` | `pkg install xorriso` |
|
||||
|
||||
A host C compiler (`cc`) is also needed, for the tools that build the disk
|
||||
images. On Windows that must be **mingw-w64's gcc**, not clang: clang defaults
|
||||
to an MSVC target there, and `tools/mkfs.c` needs `<unistd.h>` and `<dirent.h>`,
|
||||
which the Windows SDK does not have.
|
||||
|
||||
## Why clang rather than a cross-gcc
|
||||
|
||||
clang is a cross-compiler by construction, so one ordinary LLVM install targets
|
||||
everything this tree needs — bare-metal ELF, code linked below one megabyte, and
|
||||
Linux/musl userland — from any host. A cross binutils+gcc would be a day of
|
||||
setup per platform that then rots, and on macOS it means brewing
|
||||
`x86_64-elf-gcc` before anything builds at all.
|
||||
|
||||
The Makefile selects clang+lld whenever both are on `PATH`. To force the GNU
|
||||
toolchain instead:
|
||||
|
||||
```sh
|
||||
make USE_GNU=1 # needs a cross toolchain that emits x86_64 ELF
|
||||
make USE_GNU=1 TOOLPREFIX=x86_64-elf-
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
```sh
|
||||
tools/windows/bootcheck.ps1 # boots, drives the shell, asserts on output
|
||||
tools/windows/bootcheck.ps1 -Tty -Ps # plus terminal behaviour and process listing
|
||||
make schfs-check # SchFS unit, object and image suites
|
||||
```
|
||||
|
||||
`bootcheck` is PowerShell, and PowerShell 7 (`pwsh`) runs on Linux, macOS and
|
||||
the BSDs as well as Windows — `brew install powershell`, or your distribution's
|
||||
`powershell` package. It finds QEMU on `PATH`.
|
||||
|
||||
Booting to a prompt proves nothing on its own: a filesystem can mount and still
|
||||
fail the first real command, which has happened here. `bootcheck` types commands
|
||||
at the serial console and greps the transcript for the answers they should
|
||||
produce.
|
||||
|
||||
## Ports
|
||||
|
||||
`musl`, `toybox` and `mksh` are built from source into `sysroot/`. **This does
|
||||
not work on a Windows host** — `make` prints `ports: skipped` and uses whatever
|
||||
is already staged in `sysroot/`. Building them needs a Linux host (or any other
|
||||
Unix); do it once and the staged result serves the Windows builds.
|
||||
|
||||
## Where the tools live
|
||||
|
||||
`tools/` is grouped by what runs the file, so it is obvious at a glance which
|
||||
tools a given host can use:
|
||||
|
||||
```
|
||||
tools/
|
||||
windows/ .ps1 PowerShell (pwsh runs these on Linux and macOS too)
|
||||
posix/ .sh shell
|
||||
python/ .py
|
||||
*.c host programs -- compiled by the build, run everywhere
|
||||
*.pl perl, likewise
|
||||
```
|
||||
|
||||
The `.c` and `.pl` files stay at the top level because they are not
|
||||
host-specific: the build compiles or invokes them on every platform.
|
||||
|
||||
A script that needs the repo root derives it from its own location, so anything
|
||||
moved between these directories has to have that adjusted — the PowerShell tools
|
||||
use `Split-Path (Split-Path $PSScriptRoot -Parent) -Parent`, two levels up.
|
||||
|
||||
## Known host differences, already handled
|
||||
|
||||
Listed because they are the shape of the next such bug, not because anything is
|
||||
outstanding:
|
||||
|
||||
- `<sys/sysmacros.h>` is glibc/musl only. macOS and the BSDs take `major()` and
|
||||
`minor()` from `<sys/types.h>`.
|
||||
- `sha256sum` exists on Linux and Git Bash; macOS has `shasum -a 256`,
|
||||
FreeBSD/NetBSD `sha256`, OpenBSD `cksum -a sha256`. `tools/posix/sha256check.sh`
|
||||
finds whichever is present.
|
||||
- `nproc` is coreutils, so absent on macOS and BSD, where it is
|
||||
`sysctl -n hw.ncpu`.
|
||||
- In the PowerShell tools, path literals must use forward slashes:
|
||||
`Join-Path $root 'build\x'` produces a *filename containing a backslash* on a
|
||||
Unix host.
|
||||
|
||||
## Fedora, in one command
|
||||
|
||||
```sh
|
||||
tools/posix/setup-fedora.sh --check # what is missing
|
||||
tools/posix/setup-fedora.sh # install it
|
||||
```
|
||||
|
||||
Moving an existing checkout to a Linux machine: see
|
||||
[moving-to-linux.md](moving-to-linux.md).
|
||||
|
||||
## Working on two machines
|
||||
|
||||
Claude Code's project memory is kept in the repo and moved with:
|
||||
|
||||
```sh
|
||||
tools/posix/memory-sync.sh status
|
||||
tools/posix/memory-sync.sh export # after a session that learned something; then commit
|
||||
tools/posix/memory-sync.sh import # after cloning or pulling elsewhere
|
||||
```
|
||||
Loading…
Reference in a new issue