fix(build): init副本命名修正(副本名=目录名,独立initout输出目录)+增量跳过(产物新于源码不重编)——首跑44个init全FAIL实抓:点号进模块名AssertionError+子包mv名不符

This commit is contained in:
yumoqing 2026-09-17 17:32:39 +08:00
parent 7e310ec653
commit 3ef5e43554

View File

@ -62,24 +62,33 @@ voucher:voucher
tenant:tenant
"
# 生成编译任务src dest mode stem
# 生成编译任务src dest mode stem cout
# init 分支2026-09-17 首跑实抓两处 bug 的修正):
# ① 副本名必须**恰好等于目录名**(顶层=包名/子包=子包名)——曾拼成 init_<pkg>_<dir>.py
# dir="." 时点号进模块名触发 Nuitka AssertionError子包副本名带前缀则产物 .so 名与
# mv 目标不符 FAIL(mv)。实验定型形态cp 成 <目录名>.py。
# ② init 的编译输出目录用独立 $WORK/initout/<pkg>(不能直接进最终 destNuitka 按
# 副本 stem 命名产物,需 mv 成 __init__.<tag>.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