diff --git a/scripts/build_binary.sh b/scripts/build_binary.sh index 44a8b9b..64bb5e7 100644 --- a/scripts/build_binary.sh +++ b/scripts/build_binary.sh @@ -62,24 +62,33 @@ voucher:voucher tenant:tenant " -# 生成编译任务:src dest mode stem +# 生成编译任务:src dest mode stem cout +# init 分支(2026-09-17 首跑实抓两处 bug 的修正): +# ① 副本名必须**恰好等于目录名**(顶层=包名/子包=子包名)——曾拼成 init__.py, +# dir="." 时点号进模块名触发 Nuitka AssertionError;子包副本名带前缀则产物 .so 名与 +# mv 目标不符 FAIL(mv)。实验定型形态:cp 成 <目录名>.py。 +# ② init 的编译输出目录用独立 $WORK/initout/(不能直接进最终 dest:Nuitka 按 +# 副本 stem 命名产物,需 mv 成 __init__..so)。 gen_jobs() { local pkgdir=$1 outpkg=$2 find "$pkgdir" -name "*.py" -not -path "*__pycache__*" -not -name "test_*" \ -not -path "*/tests/*" -not -path "*/.git/*" | while read -r f; do - local rel=${f#$pkgdir/} dir stem src mode + local rel=${f#$pkgdir/} dir stem src mode cout dir=$(dirname "$rel"); stem=$(basename "$f" .py) local destdir="$OUT/$outpkg"; [ "$dir" != "." ] && destdir="$OUT/$outpkg/$dir" if [ "$stem" = "__init__" ]; then - # 改名 trick:副本名=该包目录最后一段(顶层=包名,子包=子包名) local comp; comp=$(basename "$dir"); [ "$dir" = "." ] && comp=$outpkg - src="$WORK/init_${outpkg}_${dir//\//_}.py" + src="$WORK/initcopy/$outpkg/$comp.py" + mkdir -p "$(dirname "$src")" "$WORK/initout/$outpkg" cp "$f" "$src" - mode=init; stem=$comp + mode=init; stem=$comp; cout="$WORK/initout/$outpkg" else - src=$f; mode=mod + src=$f; mode=mod; cout=$destdir fi - printf "%s\t%s\t%s\t%s\n" "$src" "$destdir" "$mode" "$stem" >> "$JOBS" + # 增量:产物 .so 比源码新则跳过(重跑只补缺/失败项) + local sofinal="$destdir/$stem.$TAG.so"; [ "$mode" = init ] && sofinal="$destdir/__init__.$TAG.so" + if [ -f "$sofinal" ] && [ "$sofinal" -nt "$f" ]; then continue; fi + printf "%s\t%s\t%s\t%s\t%s\n" "$src" "$destdir" "$mode" "$stem" "$cout" >> "$JOBS" done # 包内数据文件原样进覆盖层(不用 rsync:目标机可能没装) mkdir -p "$OUT/$outpkg" @@ -105,14 +114,16 @@ for f in "$ROOT"/app/*.py; do done cat > "$WORK/worker.sh" <<'EOS' -src=$1; dest=$2; mode=$3; stem=$4 +src=$1; dest=$2; mode=$3; stem=$4; cout=$5 tag="cpython-310-x86_64-linux-gnu" -mkdir -p "$dest" -out=$("$PYBIN" -m nuitka --module "$src" --output-dir="$dest" --remove-output 2>&1) +mkdir -p "$dest" "$cout" +out=$("$PYBIN" -m nuitka --module "$src" --output-dir="$cout" --remove-output 2>&1) rc=$? if [ $rc -ne 0 ]; then echo "FAIL $src :: $(echo "$out" | tail -2)" >> "$FAILLOG"; exit 0; fi if [ "$mode" = init ]; then - mv "$dest/$stem.$tag.so" "$dest/__init__.$tag.so" 2>/dev/null || { echo "FAIL(mv) $src" >> "$FAILLOG"; exit 0; } + mv "$cout/$stem.$tag.so" "$dest/__init__.$tag.so" 2>/dev/null || { echo "FAIL(mv) $src" >> "$FAILLOG"; exit 0; } +else + [ -f "$cout/$stem.$tag.so" ] || { echo "FAIL(no-so) $src" >> "$FAILLOG"; exit 0; } fi echo "OK $src" >> "$OKLOG" EOS @@ -120,7 +131,11 @@ export PYBIN=$PY export FAILLOG OKLOG total=$(wc -l < "$JOBS") echo "编译任务 $total 个,并行 4 …" -xargs -a "$JOBS" -P 4 -n 4 bash "$WORK/worker.sh" +xargs -a "$JOBS" -P 4 -n 5 bash "$WORK/worker.sh" +# 清理 .build 残留(NFS 上 rm -rf 偶发 Directory not empty;--remove-output 只删自己那轮) +find "$OUT" -maxdepth 4 -type d -name "*.build" -exec rm -rf {} + 2>/dev/null +find "$OUT" -maxdepth 4 -type d -name "*.build" -exec rm -rf {} + 2>/dev/null +find "$OUT" -maxdepth 4 -type d -name "*.build" | while read -r d; do rm -rf "$d" 2>/dev/null; done ok=$(wc -l < "$OKLOG"); fail=$(wc -l < "$FAILLOG") echo "完成: OK=$ok FAIL=$fail" if [ "$fail" -gt 0 ]; then echo "== 失败清单 =="; cat "$FAILLOG"; exit 1; fi