From a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 12 Jul 2026 01:19:32 +0000 Subject: 🌭 plan9-kencc-linux: кросс-Ρ‚ΡƒΠ»Ρ‡Π΅ΠΉΠ½ Plan9 (cc/as/ld) + EFI-Π±ΠΎΠ»Π²Π°Π½ΠΊΠ° MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- scripts/build_al.sh | 57 ++++++++++++++++++++++++++++++++++++++++++ scripts/build_all.sh | 19 ++++++++++++++ scripts/build_arch.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/setup.sh | 30 +++++++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 scripts/build_al.sh create mode 100644 scripts/build_all.sh create mode 100644 scripts/build_arch.sh create mode 100644 scripts/setup.sh (limited to 'scripts') 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 ' not in s2: s2='#include \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 "; 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 +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" -- cgit v1.2.3