fix(tpv): phase2command 模式 Phase C 不再因 .obj 缺失中止——链接命令正确写入 bat - 根因:phase2command 模式下 llc 未执行(命令写入 bat),Phase C 的'可达模块 .obj 存在性检查'对所有实现模块触发 VLogger.error→sys.exit(1),进程在调用 link_objs_to_exe 之前终止,clang 链接命令永远写不进 bat - 修复:Phase C 可达收集在 _phase2_cmd_path 非空时跳过缺失报错,并把可达 includes .obj 路径照常加入 final_obj_paths(bat 手工执行后即存在),保证链接命令完整 - 附带:--run 在 phase2command 模式下跳过(exe 尚未链接,多文件+单文件两处);BuildPipeline._phase2_write_cmd 补 global _phase2_bat_init,避免每次调用重复写 header

This commit is contained in:
TermiNexus committed 2026-08-23 15:52:15 +08:00
1 parent 146b9a9652
commit 347998664e
3 files changed
+45 -26

No files matched your search

+24 -23
View File
@@ -485,29 +485,30 @@ def free_llc_task(task: LlcTask | t.CPtr):
task.ModuleSha1 = None
def _phase2_write_cmd(cmd: str) -> None:
"""--phase2command 模式:把命令追加写入 bat(不执行)
首次调用写入 header(@echo off + 说明),后续命令以 \r\n 分行追加,
与 cmd.exe 批处理格式一致。bat 路径由模块级 _phase2_cmd_path 指定。
"""
if _phase2_cmd_path is None or cmd is None:
return
f: fileio.File | t.CPtr = fileio.File(_phase2_cmd_path, fileio.MODE.A)
if f.closed:
VLogger.error("phase2command: bat 打开失败", "phase2cmd")
return
if _phase2_bat_init == 0:
_phase2_bat_init = 1
hdr1: str = "@echo off\r\n"
hdr2: str = "rem TransPyV --phase2command generated commands\r\n"
f.write(hdr1, string.strlen(hdr1))
f.write(hdr2, string.strlen(hdr2))
f.write(cmd, string.strlen(cmd))
f.write("\r\n", 2)
f.close()
def _phase2_write_cmd(cmd: str) -> None:
"""--phase2command 模式:把命令追加写入 bat(不执行)
首次调用写入 header(@echo off + 说明),后续命令以 \r\n 分行追加,
与 cmd.exe 批处理格式一致。bat 路径由模块级 _phase2_cmd_path 指定。
"""
global _phase2_bat_init
if _phase2_cmd_path is None or cmd is None:
return
f: fileio.File | t.CPtr = fileio.File(_phase2_cmd_path, fileio.MODE.A)
if f.closed:
VLogger.error("phase2command: bat 打开失败", "phase2cmd")
return
if _phase2_bat_init == 0:
_phase2_bat_init = 1
hdr1: str = "@echo off\r\n"
hdr2: str = "rem TransPyV --phase2command generated commands\r\n"
f.write(hdr1, string.strlen(hdr1))
f.write(hdr2, string.strlen(hdr2))
f.write(cmd, string.strlen(cmd))
f.write("\r\n", 2)
f.close()
def _run_cmd_wait(cmd: str) -> int:
"""CreateProcessA 同步执行命令并等待退出,返回退出码。