tools: group scripts by what runs them
tools/windows/ .ps1 (pwsh, so usable from Linux and macOS too)
tools/posix/ .sh
tools/python/ .py
tools/ .c and .pl
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.
Call sites updated in the Makefile, ports/mk/port.mk, docs and the
project memory. The one thing that does not survive a move on its own is
a script deriving the repo root from its own location -- all nine
PowerShell tools used Split-Path $PSScriptRoot -Parent, and memory-sync.sh
used dirname/.., both of which quietly become tools/ one level deeper.
Two levels now.
Two pre-existing Windows failures surfaced while verifying, both real and
neither caused by the move:
- schfs_fsck.c did not compile under mingw at all: --extract uses
POSIX mkdir(path,mode), symlink() and link(), none of which mingw
has. That took the whole tool with it, and `make schfs-check` with
it. mkdir maps to _mkdir; symlink and link fail loudly rather than
writing a regular file in their place, because an extracted tree
that differs from the image while reporting success defeats the
point of --extract.
- the round-trip test then failed at `ln -s`, since Git Bash cannot
create symlinks without developer mode. It skips with a message now.
Not a fudge: mkschfs's mingw build cannot see a symlink either, so
the test would have compared a tree with none against an image with
none and called it a pass -- coverage reporting itself as present
while being absent.
Verified on Windows: build clean, all seven bootcheck suites green,
make schfs-check passes.
This commit is contained in:
parent
531ef120ef
commit
754d96ebc5
26 changed files with 127 additions and 39 deletions
12
Makefile
12
Makefile
|
|
@ -366,7 +366,7 @@ iso:
|
||||||
$(MAKE) RAMROOT=1 schos.iso
|
$(MAKE) RAMROOT=1 schos.iso
|
||||||
|
|
||||||
schos.iso: $(BUILD)/boot/cdboot $(BUILD)/boot/stage2 $(BUILD)/kernel/kernel
|
schos.iso: $(BUILD)/boot/cdboot $(BUILD)/boot/stage2 $(BUILD)/kernel/kernel
|
||||||
STAGE2_SECTORS=$(STAGE2_SECTORS) sh tools/mkiso.sh $@
|
STAGE2_SECTORS=$(STAGE2_SECTORS) sh tools/posix/mkiso.sh $@
|
||||||
|
|
||||||
# Boot the ISO the way a machine booting off a disc would: no hard disk at
|
# Boot the ISO the way a machine booting off a disc would: no hard disk at
|
||||||
# all, so a kernel that still secretly depends on one fails here rather than
|
# all, so a kernel that still secretly depends on one fails here rather than
|
||||||
|
|
@ -644,7 +644,7 @@ schfs-fsck: $(SCHFS_FSCK)
|
||||||
# the *filesystem* matches a tree that exists independently of it, so a writer
|
# the *filesystem* matches a tree that exists independently of it, so a writer
|
||||||
# and reader that agree on something wrong are still caught.
|
# and reader that agree on something wrong are still caught.
|
||||||
schfs-image-test: $(MKSCHFS) $(SCHFS_FSCK)
|
schfs-image-test: $(MKSCHFS) $(SCHFS_FSCK)
|
||||||
@sh tools/schfs_roundtrip.sh $(MKSCHFS) $(SCHFS_FSCK)
|
@sh tools/posix/schfs_roundtrip.sh $(MKSCHFS) $(SCHFS_FSCK)
|
||||||
|
|
||||||
# Every SchFS suite. Run this after touching anything under kernel/fs/schfs.
|
# Every SchFS suite. Run this after touching anything under kernel/fs/schfs.
|
||||||
schfs-check: schfs-test schfs-objtest schfs-image-test
|
schfs-check: schfs-test schfs-objtest schfs-image-test
|
||||||
|
|
@ -655,7 +655,7 @@ schfs-check: schfs-test schfs-objtest schfs-image-test
|
||||||
# the system, which is exactly why it rots. This makes "does it still render"
|
# the system, which is exactly why it rots. This makes "does it still render"
|
||||||
# a question with a thirty-second answer. Needs a ramroot build first.
|
# a question with a thirty-second answer. Needs a ramroot build first.
|
||||||
crashshot:
|
crashshot:
|
||||||
pwsh -File tools/crashshot.ps1
|
pwsh -File tools/windows/crashshot.ps1
|
||||||
|
|
||||||
# Read the QR code back off a captured crash screen. End-to-end on purpose: it
|
# Read the QR code back off a captured crash screen. End-to-end on purpose: it
|
||||||
# reads the pixels that were painted, so payload construction in panic context,
|
# reads the pixels that were painted, so payload construction in panic context,
|
||||||
|
|
@ -663,7 +663,7 @@ crashshot:
|
||||||
# text comes back. Run `make crashshot` first. Needs the same Python packages
|
# text comes back. Run `make crashshot` first. Needs the same Python packages
|
||||||
# as `qrcheck`.
|
# as `qrcheck`.
|
||||||
crashqr:
|
crashqr:
|
||||||
$(PYTHON) tools/crashqr.py
|
$(PYTHON) tools/python/crashqr.py
|
||||||
|
|
||||||
$(MKFS): tools/mkfs.c include/fs.h include/stat.h include/param.h
|
$(MKFS): tools/mkfs.c include/fs.h include/stat.h include/param.h
|
||||||
@mkdir -p $(BUILD)/tools
|
@mkdir -p $(BUILD)/tools
|
||||||
|
|
@ -773,7 +773,7 @@ LOGO_SRC = Assets/SchOS Small Logo.png
|
||||||
LOGO_PX = 128
|
LOGO_PX = 128
|
||||||
|
|
||||||
logo:
|
logo:
|
||||||
$(PYTHON) tools/mklogo.py "$(LOGO_SRC)" include/logo.h $(LOGO_PX)
|
$(PYTHON) tools/python/mklogo.py "$(LOGO_SRC)" include/logo.h $(LOGO_PX)
|
||||||
|
|
||||||
# The USB vendor/product name database, from linux-usb.org.
|
# The USB vendor/product name database, from linux-usb.org.
|
||||||
#
|
#
|
||||||
|
|
@ -826,7 +826,7 @@ qrtest: $(QRTEST)
|
||||||
# pip install --target build/pylibs opencv-python-headless numpy segno
|
# pip install --target build/pylibs opencv-python-headless numpy segno
|
||||||
# PYTHONPATH=build/pylibs make qrcheck
|
# PYTHONPATH=build/pylibs make qrcheck
|
||||||
qrcheck: $(QRTEST)
|
qrcheck: $(QRTEST)
|
||||||
$(PYTHON) tools/qrcheck.py
|
$(PYTHON) tools/python/qrcheck.py
|
||||||
|
|
||||||
.PHONY: all kernel ramroot cmd ports sysroot-install qemu \
|
.PHONY: all kernel ramroot cmd ports sysroot-install qemu \
|
||||||
schfs-test schfs-objtest schfs-image-test schfs-check mkschfs \
|
schfs-test schfs-objtest schfs-image-test schfs-check mkschfs \
|
||||||
|
|
|
||||||
|
|
@ -483,7 +483,7 @@ the user is looking at. That single fact is most of what separates a hobby
|
||||||
project from a product; every shipping system puts that behind a flag.
|
project from a product; every shipping system puts that behind a flag.
|
||||||
|
|
||||||
`cons_serial_only` already existed for panic, so the fix was to start it *set*.
|
`cons_serial_only` already existed for panic, so the fix was to start it *set*.
|
||||||
Everything still goes out the UART — which is where `tools/bootcheck.ps1` reads
|
Everything still goes out the UART — which is where `tools/windows/bootcheck.ps1` reads
|
||||||
it from, so all five suites kept passing untouched — and `console_takeover()`
|
it from, so all five suites kept passing untouched — and `console_takeover()`
|
||||||
clears it on the first `exec()`, the moment userspace genuinely starts.
|
clears it on the first `exec()`, the moment userspace genuinely starts.
|
||||||
`vga_init` no longer clears the screen, so the splash survives the whole of
|
`vga_init` no longer clears the screen, so the splash survives the whole of
|
||||||
|
|
|
||||||
|
|
@ -324,9 +324,9 @@ tools/mkschfs.c build an image from a directory tree
|
||||||
tools/schfs_fsck.c verify, list, extract
|
tools/schfs_fsck.c verify, list, extract
|
||||||
tools/schfs_test.c B-tree torture harness
|
tools/schfs_test.c B-tree torture harness
|
||||||
tools/schfs_objtest.c object layer: files, directories, space accounting
|
tools/schfs_objtest.c object layer: files, directories, space accounting
|
||||||
tools/schfs_roundtrip.sh end-to-end filesystem test
|
tools/posix/schfs_roundtrip.sh end-to-end filesystem test
|
||||||
tools/mutate.sh mutation-tests the suites themselves
|
tools/posix/mutate.sh mutation-tests the suites themselves
|
||||||
tools/bootcheck.ps1 boots under QEMU and drives the shell
|
tools/windows/bootcheck.ps1 boots under QEMU and drives the shell
|
||||||
```
|
```
|
||||||
|
|
||||||
Everything except `kmount.c` is compiled *both* into the kernel and into the
|
Everything except `kmount.c` is compiled *both* into the kernel and into the
|
||||||
|
|
@ -357,7 +357,7 @@ is the least glamorous: after deleting everything, free space must be back to
|
||||||
exactly what it was on an empty volume. Every other test in the suite still
|
exactly what it was on an empty volume. Every other test in the suite still
|
||||||
passes on a filesystem that leaks a block on every delete.
|
passes on a filesystem that leaks a block on every delete.
|
||||||
|
|
||||||
`tools/mutate.sh` injects six deliberate bugs and fails if any of them goes
|
`tools/posix/mutate.sh` injects six deliberate bugs and fails if any of them goes
|
||||||
undetected. It is how the suites are kept honest; see the note in §9.
|
undetected. It is how the suites are kept honest; see the note in §9.
|
||||||
|
|
||||||
### Verifying on real hardware
|
### Verifying on real hardware
|
||||||
|
|
|
||||||
|
|
@ -46,8 +46,8 @@ make USE_GNU=1 TOOLPREFIX=x86_64-elf-
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
tools/bootcheck.ps1 # boots, drives the shell, asserts on output
|
tools/windows/bootcheck.ps1 # boots, drives the shell, asserts on output
|
||||||
tools/bootcheck.ps1 -Tty -Ps # plus terminal behaviour and process listing
|
tools/windows/bootcheck.ps1 -Tty -Ps # plus terminal behaviour and process listing
|
||||||
make schfs-check # SchFS unit, object and image suites
|
make schfs-check # SchFS unit, object and image suites
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -67,6 +67,27 @@ not work on a Windows host** — `make` prints `ports: skipped` and uses whateve
|
||||||
is already staged in `sysroot/`. Building them needs a Linux host (or any other
|
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.
|
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
|
## Known host differences, already handled
|
||||||
|
|
||||||
Listed because they are the shape of the next such bug, not because anything is
|
Listed because they are the shape of the next such bug, not because anything is
|
||||||
|
|
@ -75,7 +96,7 @@ outstanding:
|
||||||
- `<sys/sysmacros.h>` is glibc/musl only. macOS and the BSDs take `major()` and
|
- `<sys/sysmacros.h>` is glibc/musl only. macOS and the BSDs take `major()` and
|
||||||
`minor()` from `<sys/types.h>`.
|
`minor()` from `<sys/types.h>`.
|
||||||
- `sha256sum` exists on Linux and Git Bash; macOS has `shasum -a 256`,
|
- `sha256sum` exists on Linux and Git Bash; macOS has `shasum -a 256`,
|
||||||
FreeBSD/NetBSD `sha256`, OpenBSD `cksum -a sha256`. `tools/sha256check.sh`
|
FreeBSD/NetBSD `sha256`, OpenBSD `cksum -a sha256`. `tools/posix/sha256check.sh`
|
||||||
finds whichever is present.
|
finds whichever is present.
|
||||||
- `nproc` is coreutils, so absent on macOS and BSD, where it is
|
- `nproc` is coreutils, so absent on macOS and BSD, where it is
|
||||||
`sysctl -n hw.ncpu`.
|
`sysctl -n hw.ncpu`.
|
||||||
|
|
@ -88,7 +109,7 @@ outstanding:
|
||||||
Claude Code's project memory is kept in the repo and moved with:
|
Claude Code's project memory is kept in the repo and moved with:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
tools/memory-sync.sh status
|
tools/posix/memory-sync.sh status
|
||||||
tools/memory-sync.sh export # after a session that learned something; then commit
|
tools/posix/memory-sync.sh export # after a session that learned something; then commit
|
||||||
tools/memory-sync.sh import # after cloning or pulling elsewhere
|
tools/posix/memory-sync.sh import # after cloning or pulling elsewhere
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ schos/
|
||||||
│ suites, sign.pl, vectors.pl, and the PowerShell harnesses.
|
│ suites, sign.pl, vectors.pl, and the PowerShell harnesses.
|
||||||
│ Their binaries build into build/tools/ -- this directory
|
│ Their binaries build into build/tools/ -- this directory
|
||||||
│ used to hold both, which is the one rule this layout has.
|
│ used to hold both, which is the one rule this layout has.
|
||||||
│ tools/loc.ps1 counts how much of the tree is first-party.
|
│ tools/windows/loc.ps1 counts how much of the tree is first-party.
|
||||||
├─ sysroot/ Staging for the disk image. etc/ is hand-maintained;
|
├─ sysroot/ Staging for the disk image. etc/ is hand-maintained;
|
||||||
│ bin/ lib/ sbin/ are populated by `make sysroot-install`.
|
│ bin/ lib/ sbin/ are populated by `make sysroot-install`.
|
||||||
├─ dist/ Upstream tarball cache. Survives `make clean`.
|
├─ dist/ Upstream tarball cache. Survives `make clean`.
|
||||||
|
|
@ -156,7 +156,7 @@ match or the kernel fails to link.
|
||||||
|
|
||||||
**`STAGE2_SECTORS` now lives in exactly one place: the root `Makefile`.** It used
|
**`STAGE2_SECTORS` now lives in exactly one place: the root `Makefile`.** It used
|
||||||
to be written out by hand in five — `boot/bootasm.S`, `boot/stage2main.c`'s
|
to be written out by hand in five — `boot/bootasm.S`, `boot/stage2main.c`'s
|
||||||
`readseg()`, the `dd ... seek=` offset, and twice more inside `tools/mkiso.sh`
|
`readseg()`, the `dd ... seek=` offset, and twice more inside `tools/posix/mkiso.sh`
|
||||||
(its stage2 size assertion and `-boot-load-size`). This note used to warn you to
|
(its stage2 size assertion and `-boot-load-size`). This note used to warn you to
|
||||||
keep three of them in step and did not know about the other two.
|
keep three of them in step and did not know about the other two.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -281,13 +281,13 @@ into `sysroot/`, which is linked into the kernel binary for a ramdisk-root
|
||||||
build. That combination is a licensing accident waiting to happen, for a test
|
build. That combination is a licensing accident waiting to happen, for a test
|
||||||
that was passing every time.
|
that was passing every time.
|
||||||
|
|
||||||
**What replaced it:** `tools/bootcheck.ps1` with its `-Sock`, `-Evdev` and `-Ps`
|
**What replaced it:** `tools/windows/bootcheck.ps1` with its `-Sock`, `-Evdev` and `-Ps`
|
||||||
modes, plus `tools/splashshot.ps1` for the boot path. These are narrower and do
|
modes, plus `tools/windows/splashshot.ps1` for the boot path. These are narrower and do
|
||||||
not prove the whole stack composes, which is the honest cost of the removal.
|
not prove the whole stack composes, which is the honest cost of the removal.
|
||||||
|
|
||||||
**The lesson worth keeping** is the shape of the test, not the program: the next
|
**The lesson worth keeping** is the shape of the test, not the program: the next
|
||||||
full-stack test should be something large that we did not write, driven to a
|
full-stack test should be something large that we did not write, driven to a
|
||||||
real pixel-level assertion rather than a log line. `tools/splashshot.ps1`'s
|
real pixel-level assertion rather than a log line. `tools/windows/splashshot.ps1`'s
|
||||||
colour counting exists because a log-only harness once passed on a blank screen.
|
colour counting exists because a log-only harness once passed on a blank screen.
|
||||||
|
|
||||||
### Phase 8 — The system layer: `schinit`, firmware, and a crash channel
|
### Phase 8 — The system layer: `schinit`, firmware, and a crash channel
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ BUILDROOT := $(TOPDIR)/build/ports
|
||||||
# Verifying a downloaded tarball. Not `sha256sum -c -`: that command does not
|
# Verifying a downloaded tarball. Not `sha256sum -c -`: that command does not
|
||||||
# exist on macOS or the BSDs, and each of them spells it differently. The
|
# exist on macOS or the BSDs, and each of them spells it differently. The
|
||||||
# helper picks whichever of the five possibilities the host actually has.
|
# helper picks whichever of the five possibilities the host actually has.
|
||||||
SHA256CHECK := $(TOPDIR)/tools/sha256check.sh
|
SHA256CHECK := $(TOPDIR)/tools/posix/sha256check.sh
|
||||||
|
|
||||||
# Port name is the directory name — no per-port boilerplate needed.
|
# Port name is the directory name — no per-port boilerplate needed.
|
||||||
PORT := $(notdir $(CURDIR))
|
PORT := $(notdir $(CURDIR))
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Move Claude Code's project memory between this repo and the local machine.
|
# Move Claude Code's project memory between this repo and the local machine.
|
||||||
#
|
#
|
||||||
# tools/memory-sync.sh export memory on this machine -> .claude/memory/
|
# tools/posix/memory-sync.sh export memory on this machine -> .claude/memory/
|
||||||
# tools/memory-sync.sh import .claude/memory/ -> this machine
|
# tools/posix/memory-sync.sh import .claude/memory/ -> this machine
|
||||||
# tools/memory-sync.sh status show both sides, change nothing
|
# tools/posix/memory-sync.sh status show both sides, change nothing
|
||||||
#
|
#
|
||||||
# Why this exists
|
# Why this exists
|
||||||
# ---------------
|
# ---------------
|
||||||
|
|
@ -36,9 +36,9 @@ usage() {
|
||||||
|
|
||||||
[ $# -eq 1 ] || usage
|
[ $# -eq 1 ] || usage
|
||||||
|
|
||||||
# Repo root: this script lives in tools/, so the parent of its directory.
|
# Repo root: this script lives in tools/posix/, so two levels up.
|
||||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||||
repo=$(CDPATH= cd -- "$script_dir/.." && pwd)
|
repo=$(CDPATH= cd -- "$script_dir/../.." && pwd)
|
||||||
repo_mem="$repo/.claude/memory"
|
repo_mem="$repo/.claude/memory"
|
||||||
|
|
||||||
# The absolute path Claude Code itself sees. Under Git Bash `pwd` gives
|
# The absolute path Claude Code itself sees. Under Git Bash `pwd` gives
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Build a bootable SchOS ISO.
|
# Build a bootable SchOS ISO.
|
||||||
#
|
#
|
||||||
# tools/mkiso.sh [output.iso]
|
# tools/posix/mkiso.sh [output.iso]
|
||||||
#
|
#
|
||||||
# The disc boots through El Torito's "no emulation" mode, which is the only
|
# The disc boots through El Torito's "no emulation" mode, which is the only
|
||||||
# one of the three that fits how SchOS actually loads itself.
|
# one of the three that fits how SchOS actually loads itself.
|
||||||
|
|
@ -32,6 +32,27 @@ TREE=$3
|
||||||
WORK=$(mktemp -d)
|
WORK=$(mktemp -d)
|
||||||
trap 'rm -rf "$WORK"' EXIT
|
trap 'rm -rf "$WORK"' EXIT
|
||||||
|
|
||||||
|
# Symlinks are load-bearing here, so a host that cannot create them cannot run
|
||||||
|
# this test at all.
|
||||||
|
#
|
||||||
|
# Windows is that host. Git Bash needs developer mode or MSYS=winsymlinks to
|
||||||
|
# make one, and even where it can, mkschfs's mingw build cannot *see* one --
|
||||||
|
# lstat degrades to stat and S_ISLNK is always false, by design and with a
|
||||||
|
# comment saying so. The round-trip would therefore be comparing a tree with no
|
||||||
|
# symlinks against an image with no symlinks and calling that a pass, which is
|
||||||
|
# worse than not running: it is coverage that reports itself as present and is
|
||||||
|
# not.
|
||||||
|
#
|
||||||
|
# Skipping with exit 0 so `make schfs-check` still means something on Windows
|
||||||
|
# -- the B-tree, object and space suites are all host-independent and do run.
|
||||||
|
if ! ln -s target "$WORK/.symlink-probe" 2>/dev/null; then
|
||||||
|
echo "SchFS round-trip: SKIPPED -- this host cannot create symlinks."
|
||||||
|
echo " The generated tree needs them, and mkschfs cannot see them here"
|
||||||
|
echo " anyway. Run this on Linux, macOS or BSD for real coverage."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
rm -f "$WORK/.symlink-probe"
|
||||||
|
|
||||||
if [ -z "$TREE" ]; then
|
if [ -z "$TREE" ]; then
|
||||||
# Generated by a separate script so the same tree can be rebuilt by hand
|
# Generated by a separate script so the same tree can be rebuilt by hand
|
||||||
# when debugging a failure, without running the whole round-trip.
|
# when debugging a failure, without running the whole round-trip.
|
||||||
|
|
@ -32,6 +32,43 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/* --extract on Windows.
|
||||||
|
*
|
||||||
|
* mingw has no POSIX mkdir(path, mode), no symlink() and no link(), because
|
||||||
|
* Windows has no equivalent that can be created without either a privilege or
|
||||||
|
* a reparse point. Everything else here -- --info, --check, --ls, --stat,
|
||||||
|
* --cat, --tree -- is pure reading and works unchanged; it was only --extract
|
||||||
|
* that would not compile, which took the whole tool with it and with it
|
||||||
|
* `make schfs-check`.
|
||||||
|
*
|
||||||
|
* Directories map cleanly: _mkdir takes no mode, and Windows has no POSIX
|
||||||
|
* permission bits to apply anyway. Symlinks and hard links do not map, so they
|
||||||
|
* fail loudly and say why. Silently writing a regular file in their place would
|
||||||
|
* produce an extracted tree that differs from the image while reporting
|
||||||
|
* success, which is worse than not extracting at all -- the entire point of
|
||||||
|
* --extract is comparing the result against what produced it.
|
||||||
|
*/
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <direct.h>
|
||||||
|
#define mkdir(path, mode) _mkdir(path)
|
||||||
|
|
||||||
|
static int symlink(const char *target, const char *path)
|
||||||
|
{
|
||||||
|
(void)target;
|
||||||
|
fprintf(stderr, "schfs_fsck: %s: cannot create a symlink on Windows\n", path);
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int link(const char *from, const char *to)
|
||||||
|
{
|
||||||
|
(void)from;
|
||||||
|
fprintf(stderr, "schfs_fsck: %s: cannot create a hard link on Windows\n", to);
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "../kernel/fs/schfs/btree.c"
|
#include "../kernel/fs/schfs/btree.c"
|
||||||
#include "../kernel/fs/schfs/space.c"
|
#include "../kernel/fs/schfs/space.c"
|
||||||
#include "../kernel/fs/schfs/vol.c"
|
#include "../kernel/fs/schfs/vol.c"
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$hda = Join-Path $root 'schos.img'
|
$hda = Join-Path $root 'schos.img'
|
||||||
# The root filesystem. SchFS is the only root there is, so this is not a
|
# The root filesystem. SchFS is the only root there is, so this is not a
|
||||||
# choice -- a kernel handed anything else on device 1 panics in forkret().
|
# choice -- a kernel handed anything else on device 1 panics in forkret().
|
||||||
|
|
@ -41,7 +41,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$hda = Join-Path $root 'schos.img'
|
$hda = Join-Path $root 'schos.img'
|
||||||
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
||||||
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
||||||
|
|
@ -46,7 +46,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$hda = Join-Path $root 'schos.img'
|
$hda = Join-Path $root 'schos.img'
|
||||||
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
||||||
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
||||||
|
|
@ -40,7 +40,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$hda = Join-Path $root 'schos.img'
|
$hda = Join-Path $root 'schos.img'
|
||||||
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
||||||
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
||||||
|
|
@ -22,7 +22,8 @@ param(
|
||||||
)
|
)
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
|
|
||||||
# What counts as ours. Everything else in the tree is either somebody else's
|
# What counts as ours. Everything else in the tree is either somebody else's
|
||||||
# source or generated output, and mixing either in makes the total meaningless.
|
# source or generated output, and mixing either in makes the total meaningless.
|
||||||
|
|
@ -41,7 +41,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
Push-Location $root
|
Push-Location $root
|
||||||
|
|
||||||
function Fail($msg) {
|
function Fail($msg) {
|
||||||
|
|
@ -44,7 +44,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$log = Join-Path $root 'build/splashshot.log'
|
$log = Join-Path $root 'build/splashshot.log'
|
||||||
$dir = Join-Path $root $OutDir
|
$dir = Join-Path $root $OutDir
|
||||||
|
|
||||||
|
|
@ -46,7 +46,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$hda = Join-Path $root 'schos.img'
|
$hda = Join-Path $root 'schos.img'
|
||||||
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
||||||
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
||||||
|
|
@ -39,7 +39,8 @@ function Find-Qemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path $PSScriptRoot -Parent
|
# Repo root is two levels up: this script lives in tools/windows/.
|
||||||
|
$root = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||||
$hda = Join-Path $root 'schos.img'
|
$hda = Join-Path $root 'schos.img'
|
||||||
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
# The root filesystem. SchFS is the only root there is: the kernel mounts
|
||||||
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
# device 1 in forkret() and panics if it is not a SchFS volume, so this is
|
||||||
Loading…
Reference in a new issue