Я пишу командный файл, который проверяет политику заголовка (каждый заголовок должен включать/разрешать свои собственные зависимости), но, похоже, cl.exe возвращает успех даже хотя на самом деле провал ..Ошибка пакетного файла или cl.exe для компиляции result/exit
Script без комментариев:
@echo off
set FNAME=temp
set OBJFILE=%FNAME%.obj
set SRCFILE=%FNAME%.cc
for /f "delims=|" %%i in ('dir /b /s ..\include\*.h') do (
(echo #include "%%i" & echo void test^(^){}) > %SRCFILE%
echo %%i
"%VCINSTALLDIR%\bin\cl.exe" /c /W4 %SRCFILE% > NUL 2>&1
if not ERRORLEVEL 0 goto failed
)
goto success
:failed
echo.
echo Compile failed.
goto fin
:success
echo.
echo Success.
goto fin
:fin
if exist %OBJFILE% del %OBJFILE% > NUL
if exist %SRCFILE% del %SRCFILE% > NUL
Я подозреваю, что вина лежит обнаружение Равно (я прочитал raymond chens article, а также другие SO сообщения о его предостережениях), но все попытки вариации также потерпели неудачу таким же образом, заставив меня думать cl.exe is lying. Я мог быть совершенно неправым, поэтому я собирался проверить с ProcMon, но, к сожалению, сейчас он рушится.
Является ли это просто тем, что я глуп?
В настоящее время я принуждая неудачу в заголовочном файле с помощью FakeType blah;
, который cl.exe делает вывод, если перенаправить в файл:
...\include\fail.h(1) : error C2146: syntax error : missing ';' before identifier 'blah'
...\include\fail.h(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Попробуйте 'if! ERRORLEVEL! neq 0 goto failed' с 'setlocal EnableDelayedExpansion', потому что' if not ERRORLEVEL 0 ...' означает: «Если уровень ошибок меньше 0». Внимательно прочитайте описание в 'if /?' – Aacini
Попробуйте 'if ERRORLEVEL 1 goto failed', поскольку, вероятно, нет [Delayed Expansion] (http://ss64.com/nt/delayedexpansion.html). – JosefZ
@ Аасини Это тот! Нюансы с 'if' ... вы можете выразить это как ответ, и я соглашусь, спасибо. – ZXcvbnM