summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorclaude <[email protected]>2026-07-12 01:19:32 +0000
committerclaude <[email protected]>2026-07-12 01:19:32 +0000
commita4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 (patch)
treeb0a0ad513792f5c0ddc524d67f6ab89e2044c642 /scripts
downloadplan9-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.sh57
-rw-r--r--scripts/build_all.sh19
-rw-r--r--scripts/build_arch.sh68
-rw-r--r--scripts/setup.sh30
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"