对于我的构建系统,如果任何构建脚本发生更改,我会导出批处理文件以重新生成构建图。批处理脚本不按预期运行,命令似乎被截断,或者分成两部分。
@cd C:\Users\niklas\Repositories\craftr-build\craftr4
@call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --project C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr --variant debug -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:speed=true --project examples/c\build.craftr --build-root build --pywarn none
@if %errorlevel% neq 0 exit %errorlevel%
这给了我
[.. output of command, WITH the flags below ..]
C:\Users\niklas\Repositories\craftr-build\craftr4>ld-root build --pywarn none
'ld-root' is not recognized as an internal or external command,
operable program or batch file.
--build-root build --pywarn none
选项实际上传递给命令,但由于某种原因,批处理器也尝试将ld-root build --pywarn none
作为命令运行。这是为什么?
更新:-O...
标志中的双冒号似乎是一个问题。用另一个字符替换这些双冒号使它“工作”(显然命令不正确,但批处理按预期执行)。
在参数周围添加双引号无济于事。
更新:批处理是一个谜 - 由于某些原因,我确保-Oninja:_internal_regen=true
标志没有多次添加并删除了第一个--project ...
参数(无论如何也被错误地添加)。
更新:在尝试更多时,我发现了另一种奇怪的行为。以下运行正常:
cd C:\Users\niklas\Repositories\craftr-build\craftr4
call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=true --project examples/c\build.craftr
if %errorlevel% neq 0 exit %errorlevel%
并给出
C:\Users\niklas\Repositories\craftr-build\craftr4>cd C:\Users\niklas\Repositories\craftr-build\craftr4
C:\Users\niklas\Repositories\craftr-build\craftr4>call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr
Microsoft Visual C++ v141 (msvc) 19.14.26433 for x64
note: writing "C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja"
C:\Users\niklas\Repositories\craftr-build\craftr4>\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\craftr.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\ninja_syntax.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build_server.py C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\cxx.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\base.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\msvc.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\msvc.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\batchvars.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\cache.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\llvm.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\mingw.craftr OUTPUTS: C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja COMMAND: c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr
C:\Users\niklas\Repositories\craftr-build\craftr4>if 0 NEQ 0 exit 0
但是将-Oninja:_internal_regen=true
改为-Oninja:_internal_regen=false
并将其分开。
C:\Users\niklas\Repositories\craftr-build\craftr4>cd C:\Users\niklas\Repositories\craftr-build\craftr4
C:\Users\niklas\Repositories\craftr-build\craftr4>call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr
Microsoft Visual C++ v141 (msvc) 19.14.26433 for x64
note: writing "C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja"
C:\Users\niklas\Repositories\craftr-build\craftr4>\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\craftr.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\ninja_syntax.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build_server.py C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\cxx.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\base.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\msvc.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\msvc.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\batchvars.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\cache.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\llvm.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\mingw.craftr OUTPUTS: C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja COMMAND: c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr
C:\Users\niklas\Repositories\craftr-build\craftr4>if 0 NEQ 0 exit 0
注意第三个调用是垃圾。
事实证明它与Batch语法无关,但是从批处理文件运行的命令实际上会重写批处理文件本身的内容。
确保文件在执行时不被覆盖使其工作。每次调用它时,我通过两个不同文件名之间的“ping-ponging”来解决它(调用者也知道要调用的正确文件)。
试试这个没有电话。
@echo off
cd "C:\Users\niklas\Repositories\craftr-build\craftr4"
"c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe" -m craftr.main -c --project "C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr" --variant debug -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:speed=true --project examples/c\build.craftr --build-root build --pywarn none