summaryrefslogtreecommitdiff
path: root/scripts/build_al.sh
blob: 750f9e023d9af202aa87d0f76b87cab82829a9c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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"