diff options
| author | claude <[email protected]> | 2026-07-12 01:19:32 +0000 |
|---|---|---|
| committer | claude <[email protected]> | 2026-07-12 01:19:32 +0000 |
| commit | a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 (patch) | |
| tree | b0a0ad513792f5c0ddc524d67f6ab89e2044c642 /scripts | |
| download | plan9-kencc-linux-a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1.tar.gz plan9-kencc-linux-a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1.zip | |
π plan9-kencc-linux: ΠΊΡΠΎΡΡ-ΡΡΠ»ΡΠ΅ΠΉΠ½ Plan9 (cc/as/ld) + EFI-Π±ΠΎΠ»Π²Π°Π½ΠΊΠ°
- build_arch.sh / build_al.sh: ΡΠ±ΠΎΡΠΊΠ° kencc-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ², Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠ²,
Π»ΠΈΠ½ΠΊΠ΅ΡΠΎΠ² Π²ΡΠ΅Ρ
Π°ΡΠΎΠΊ (5/6/8/v/q/k) Π½Π° Linux-Ρ
ΠΎΡΡΠ΅ ΡΠ΅ΡΠ΅Π· plan9port.
- ΠΏΠ°ΡΡΠΈ ΠΏΠΎΠ΄ musl/gcc: sbrk->mmap, round/log2->p9*, Runemask, swcmp const,
-fcommon, machcap/omachcap, /sys ΡΠ°Π½ΡΠ°ΠΉΠΌ-ΡΠ°ΠΉΠ»Ρ. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π² PATCHES.md.
- bin/: Π³ΠΎΡΠΎΠ²ΡΠ΅ 8c 6c 5c vc qc kc + 6a 6l (Linux/musl x86_64).
- efi/: Π±ΠΎΠ»Π²Π°Π½ΠΎΡΠ½ΡΠΉ bootx64.efi (PE32+) ΡΠ΅ΠΌ ΠΆΠ΅ ΡΡΠ»ΡΠ΅ΠΉΠ½ΠΎΠΌ (6a+6c+6l+dd),
ΡΠ΅ΡΠ΅ΡΠ΅Π½Ρ β 9legacy nboot/efi; ESP-ΠΎΠ±ΡΠ°Π· ΡΠ΅ΡΠ΅Π· mkesp.py.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/build_al.sh | 57 | ||||
| -rw-r--r-- | scripts/build_all.sh | 19 | ||||
| -rw-r--r-- | scripts/build_arch.sh | 68 | ||||
| -rw-r--r-- | scripts/setup.sh | 30 |
4 files changed, 174 insertions, 0 deletions
diff --git a/scripts/build_al.sh b/scripts/build_al.sh new file mode 100644 index 0000000..750f9e0 --- /dev/null +++ b/scripts/build_al.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ Plan9 Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ (Xa) ΠΈΠ»ΠΈ Π»ΠΈΠ½ΠΊΠ΅Ρ (Xl) Π½Π° Linux-Ρ
ΠΎΡΡΠ΅. +# ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: PLAN9SRC=... PLAN9PORT=... build_al.sh 6a | build_al.sh 6l +set -e +T="$1"; [ -z "$T" ] && { echo "usage: $0 <Π½Π°ΠΏΡ. 6a|6l|8a|8l>"; exit 1; } +X="${T:0:1}"; K="${T:1:1}" + +: "${PLAN9SRC:?ΡΠΊΠ°ΠΆΠΈ PLAN9SRC}"; : "${PLAN9PORT:?ΡΠΊΠ°ΠΆΠΈ PLAN9PORT}" +[ -n "$MUSL_ENV" ] && . "$MUSL_ENV" +export PLAN9="$PLAN9PORT"; export PATH="$PLAN9/bin:$PATH" +SRC="$PLAN9SRC/sys/src/cmd" +OUT="${OUT:-$PWD/build}"; B="$OUT/$T" + +rm -rf "$B"; mkdir -p "$B"; cd "$B" +cp "$SRC/$T"/* "$B"/ 2>/dev/null || true +cp "$SRC/${X}c"/*.h "$B"/ 2>/dev/null || true # X.out.h +cp "$SRC"/cc/compat "$SRC"/cc/macbody "$SRC"/cc/lexbody "$SRC"/cc/cc.h "$B"/ 2>/dev/null || true +if [ "$K" = "l" ]; then # Π»ΠΈΠ½ΠΊΠ΅ΡΡ: ΠΈΠΌΠ΅Π½Π° ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ² + ΠΎΠ±ΡΠΈΠΉ ELF-Π²ΡΠ²ΠΎΠ΄ + cp "$SRC/${X}c"/enam.c "$B"/ 2>/dev/null || true + cp "$SRC"/8l/elf.c "$SRC"/8l/elf.h "$B"/ 2>/dev/null || true +fi + +# ---- ΠΏΠ°ΡΡΠΈ (ΡΠ΅ ΠΆΠ΅, ΡΡΠΎ ΠΈ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ²) ---- +for c in *.c; do grep -qE '#include[ \t]*[<"]/sys/' "$c" 2>/dev/null && { echo " ΠΏΡΠΎΠΏΡΡΠΊ: $c"; rm -f "$c"; }; done +sed -i 's|"\.\./[a-zA-Z0-9]*/|"|g' *.c *.h 2>/dev/null || true +sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' *.c *.h compat macbody lexbody 2>/dev/null || true +python3 - <<'PY' +import glob,re +pat=re.compile(r'\{\s*return\s+sbrk\s*\(\s*(\w+)\s*\)\s*;\s*\}') +mm='''{ +\tvoid *p; +\tp = mmap(0, %s, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); +\tif(p == MAP_FAILED) return (void*)-1; +\treturn p; +}''' +for f in glob.glob('*')+['compat']: + try: s=open(f).read() + except: continue + if 'sbrk(' in s and 'mmap' not in s: + m=pat.search(s) + if m: + s2=pat.sub(mm%m.group(1), s, count=1) + if '#include <sys/mman.h>' not in s2: s2='#include <sys/mman.h>\n'+s2 + open(f,'w').write(s2); print(" mmap-ΠΏΠ°ΡΡ:",f) +PY +[ -f a.y ] && { yacc -d a.y; sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' y.tab.c 2>/dev/null || true; } + +ok=0; fail=0; errf=""; rm -f *.o +for f in *.c; do + if 9c -fcommon -I. "$f" >/tmp/al_$$ 2>&1; then ok=$((ok+1)); else fail=$((fail+1)); [ -z "$errf" ] && errf="$f" && cp /tmp/al_$$ /tmp/alf_$$; fi +done +echo "[$T] ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ: OK=$ok FAIL=$fail" +[ "$fail" != 0 ] && { echo "ΠΏΠ΅ΡΠ²Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ($errf):"; head -10 /tmp/alf_$$; exit 2; } + +if [ "$K" = "l" ]; then EXTRA="-lmach"; else EXTRA=""; fi # Π»ΠΈΠ½ΠΊΠ΅ΡΡ Π½ΡΠΆΠ΅Π½ libmach +9l -o "$T" *.o $EXTRA +echo "[$T] Π±ΠΈΠ½Π°ΡΡ: $(ls -la $T | awk '{print $5}') Π±Π°ΠΉΡ -> $B/$T" diff --git a/scripts/build_all.sh b/scripts/build_all.sh new file mode 100644 index 0000000..7f058aa --- /dev/null +++ b/scripts/build_all.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΠΠ‘Π¬ ΠΊΡΠΎΡΡ-ΠΊΠΈΡ: C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ + Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΡ + Π»ΠΈΠ½ΠΊΠ΅ΡΡ Π²ΡΠ΅Ρ
Π°ΡΠΎΠΊ. +# Π’ΡΠ΅Π±ΡΠ΅Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
PLAN9SRC ΠΈ PLAN9PORT (ΡΠΌ. setup.sh). +set -e +here="$(cd "$(dirname "$0")" && pwd)" +: "${PLAN9SRC:?export PLAN9SRC (ΡΠΌ. scripts/setup.sh)}" +: "${PLAN9PORT:?export PLAN9PORT (ΡΠΌ. scripts/setup.sh)}" +export OUT="${OUT:-$PWD/build}" + +echo "=== C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ===" +for X in 5 6 8 v q k; do bash "$here/build_arch.sh" $X; done +echo "=== Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΡ ===" +for X in 5 6 8 v q k; do bash "$here/build_al.sh" ${X}a || echo " (${X}a β ΠΏΡΠΎΠΏΡΡΠ΅Π½/ΠΎΡΠΈΠ±ΠΊΠ°)"; done +echo "=== Π»ΠΈΠ½ΠΊΠ΅ΡΡ ===" +for X in 5 6 8 v q k; do bash "$here/build_al.sh" ${X}l || echo " (${X}l β ΠΏΡΠΎΠΏΡΡΠ΅Π½/ΠΎΡΠΈΠ±ΠΊΠ°)"; done + +echo +echo "=== ΡΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ Π±ΠΈΠ½Π°ΡΠΈ ($OUT) ===" +find "$OUT" -maxdepth 2 -type f -perm -u+x \( -name '[0-9kvq][cal]' \) -printf '%f %s Π±Π°ΠΉΡ\n' 2>/dev/null | sort diff --git a/scripts/build_arch.sh b/scripts/build_arch.sh new file mode 100644 index 0000000..3cdc4fb --- /dev/null +++ b/scripts/build_arch.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ Plan9 kencc C-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π»Ρ Π°ΡΠΊΠΈ X (5,6,8,v,q,k) Π½Π° Linux-Ρ
ΠΎΡΡΠ΅. +# ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: PLAN9SRC=.../plan9foundation PLAN9PORT=.../plan9port build_arch.sh 6 +# ΠΠΏΡ.: MUSL_ENV=.../env.sh (Π°ΠΊΡΠΈΠ²Π°ΡΠΎΡ musl-ΡΡΠ»ΡΠ΅ΠΉΠ½Π°), OUT=ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΡΠ±ΠΎΡΠΊΠΈ. +set -e +X="$1"; [ -z "$X" ] && { echo "usage: $0 <arch: 5|6|8|v|q|k>"; exit 1; } +A="${X}c" + +: "${PLAN9SRC:?ΡΠΊΠ°ΠΆΠΈ PLAN9SRC β Π΄Π΅ΡΠ΅Π²ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² plan9 (plan9foundation)}" +: "${PLAN9PORT:?ΡΠΊΠ°ΠΆΠΈ PLAN9PORT β ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ plan9port (bin/9c,9l,9ar,yacc + lib/)}" +[ -n "$MUSL_ENV" ] && . "$MUSL_ENV" +export PLAN9="$PLAN9PORT"; export PATH="$PLAN9/bin:$PATH" +SRC="$PLAN9SRC/sys/src/cmd" +OUT="${OUT:-$PWD/build}" +B="$OUT/$A" + +rm -rf "$B"; mkdir -p "$B"; cd "$B" +# ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½ Π°ΡΠΊΠΈ Π‘ΠΠΠ§ΠΠΠ, ΠΏΠΎΡΠΎΠΌ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ cc/ β cc/ Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ΅Π½ ΠΏΡΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΠΈΠΌΡΠ½ +# (Ρ kc ΡΠ²ΠΎΠΉ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ bits.c Ρ Fconv β Π±Π΅ΡΡΠΌ cc/bits.c) +cp "$SRC/$A"/*.c "$SRC/$A"/*.h "$B"/ +cp "$SRC"/cc/*.c "$SRC"/cc/*.h "$B"/ +cp "$SRC"/cc/compat "$SRC"/cc/macbody "$SRC"/cc/lexbody "$B"/ 2>/dev/null || true + +# ---- ΠΠΠ’Π§Π ΠΏΠΎΠ΄ Π»ΠΈΠ½ΡΠΊΡ-Ρ
ΠΎΡΡ ---- +# 0) Π²ΡΠΊΠΈΠ½ΡΡΡ ΠΏΠ»Π°Π½ΠΎΠ²ΡΠΊΠΈΠ΅ ΡΠ°Π½ΡΠ°ΠΉΠΌ-ΡΠ°ΠΉΠ»Ρ (ΡΡΠ½ΡΡ /sys/... Ρ
Π΅Π΄Π΅ΡΡ, Π½Π΅ ΡΠ°ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°) +for c in *.c; do grep -qE '#include[ \t]*[<"]/sys/' "$c" 2>/dev/null && { echo " ΠΏΡΠΎΠΏΡΡΠΊ ΡΠ°Π½ΡΠ°ΠΉΠΌ: $c"; rm -f "$c"; }; done +# 1) ΠΏΠ»ΠΎΡΠΊΠ°Ρ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΊΠ°: ΡΠ±ΡΠ°ΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ../cc/ ../Xc/ +sed -i "s|\"\.\./cc/|\"|g; s|\"\.\./${A}/|\"|g" *.c *.h 2>/dev/null || true +# 2) round/log2 ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡ Ρ musl math.h -> p9round/p9log2 +sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' *.c *.h compat macbody lexbody 2>/dev/null || true +# 3) Runemask Π½Π΅Ρ Π² plan9port +grep -q 'define Runemask' lex.c || sed -i '/#include[ \t]*"y.tab.h"/a #ifndef Runemask\n#define Runemask 0x1FFFFF\n#endif' lex.c +# 3b) ΠΏΡΠΎΡΠΎΡΠΈΠΏ swcmp -> const (musl qsort-ΠΊΠΎΠΌΠΏΠ°ΡΠ°ΡΠΎΡ) +sed -i 's/swcmp(void\*, *void\*)/swcmp(const void*, const void*)/' gc.h *.h 2>/dev/null || true +# 4) mysbrk: sbrk() Π½Π° musl ΠΎΡΠ΄Π°ΡΡ -1 -> mmap +python3 - "$B/compat" <<'PY' +import sys +p=sys.argv[1]; s=open(p).read() +old='void*\nmysbrk(ulong size)\n{\n\treturn sbrk(size);\n}' +new='''#include <sys/mman.h> +void* +mysbrk(ulong size) +{ +\tvoid *p; +\tp = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); +\tif(p == MAP_FAILED) return (void*)-1; +\treturn p; +}''' +if old in s: open(p,'w').write(s.replace(old,new)); print(" mmap-ΠΏΠ°ΡΡ: ΠΎΠΊ") +else: print(" mmap-ΠΏΠ°ΡΡ: ΠΏΠ°ΡΡΠ΅ΡΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½") +PY + +# ---- yacc: cc.y -> y.tab.c / y.tab.h ---- +yacc -d cc.y 2>/dev/null || yacc -d "$SRC/cc/cc.y" +sed -i -E 's/\bround\b/p9round/g; s/\blog2\b/p9log2/g' y.tab.c 2>/dev/null || true + +# ---- ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ (-fcommon: tentative-Π³Π»ΠΎΠ±Π°Π»Ρ ΠΏΠΎΠ΄ gcc -fno-common) ---- +ok=0; fail=0; errf=""; rm -f *.o +for f in *.c; do + if 9c -fcommon -I. "$f" >/tmp/ba_$$ 2>&1; then ok=$((ok+1)); else fail=$((fail+1)); [ -z "$errf" ] && errf="$f" && cp /tmp/ba_$$ /tmp/baf_$$; fi +done +echo "[$A] ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ: OK=$ok FAIL=$fail" +[ "$fail" != 0 ] && { echo "ΠΏΠ΅ΡΠ²Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ($errf):"; head -8 /tmp/baf_$$; exit 2; } + +# ---- Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ°: ΡΠ²ΠΎΠΉ machcap.o -> Π²ΡΠΊΠΈΠ½ΡΡΡ omachcap.o; ΠΈΠ½Π°ΡΠ΅ omachcap ΠΈ Π΅ΡΡΡ machcap ---- +if [ -f machcap.o ]; then LINK=$(ls *.o | grep -v '^omachcap.o$'); else LINK=$(ls *.o); fi +9l -o "$A" $LINK +echo "[$A] Π±ΠΈΠ½Π°ΡΡ: $(ls -la $A | awk '{print $5}') Π±Π°ΠΉΡ -> $B/$A" diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100644 index 0000000..2d693f0 --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# ΠΠΎΡΠΎΠ²ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΡΡΠ»ΡΠ΅ΠΉΠ½Π°: ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ plan9 + ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ plan9port. +# Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ: git, gcc/clang, make, yacc (ΠΈΠ»ΠΈ plan9port-ΠΎΠ²ΡΠΊΠΈΠΉ). ΠΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΊΠ»Π°Π΄ΡΡΡΡ +# ΡΡΠ΄ΠΎΠΌ ΡΠΎ ΡΠΊΡΠΈΠΏΡΠΎΠΌ (ΠΈΠ»ΠΈ Π² $DEPS). ΠΠΎΡΠ»Π΅ β ΡΠΊΡΠΏΠΎΡΡΠ½ΠΈ PLAN9SRC/PLAN9PORT (ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ Π² ΠΊΠΎΠ½ΡΠ΅). +set -e +DEPS="${DEPS:-$PWD/deps}" +mkdir -p "$DEPS"; cd "$DEPS" + +# 1) Π΄Π΅ΡΠ΅Π²ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² plan9 (plan9foundation β ΡΡΡ ΠΆΠΈΠ²ΡΡ cc/ ΠΈ Xc/Xa/Xl) +if [ ! -d plan9foundation ]; then + echo ">> ΠΊΠ»ΠΎΠ½ΠΈΡΡΡ plan9foundation ..." + git clone --depth 1 https://github.com/plan9foundation/plan9.git plan9foundation \ + || git clone --depth 1 https://git.9front.org/plan9front/plan9front plan9foundation +fi + +# 2) plan9port (Π΄Π°ΡΡ 9c/9l/9ar/yacc + lib9/libbio/libmach β ΠΈΠΌΠΈ ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ kencc) +if [ ! -d plan9port ]; then + echo ">> ΠΊΠ»ΠΎΠ½ΠΈΡΡΡ plan9port ..." + git clone --depth 1 https://github.com/9fans/plan9port.git plan9port +fi +if [ ! -x plan9port/bin/9c ]; then + echo ">> ΡΠΎΠ±ΠΈΡΠ°Ρ plan9port (ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ ΠΏΠ°ΡΡ ΠΌΠΈΠ½ΡΡ) ..." + ( cd plan9port && ./INSTALL -b ) # -b: ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ±ΡΠ°ΡΡ, Π±Π΅Π· ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΡ +fi + +echo +echo "ΠΠΎΡΠΎΠ²ΠΎ. ΠΠΊΡΠΏΠΎΡΡΠ½ΠΈ:" +echo " export PLAN9SRC=$DEPS/plan9foundation" +echo " export PLAN9PORT=$DEPS/plan9port" +echo " # Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡ musl-ΡΡΠ»ΡΠ΅ΠΉΠ½: export MUSL_ENV=/path/to/env.sh" |
