From 3242c794fa408737d9d24290b543b4e5db5dbdde Mon Sep 17 00:00:00 2001 From: Brett Vickers Date: Tue, 20 Aug 2019 14:53:13 -0700 Subject: Improve error messages when ninja commands fail on Windows. When a call to the Win32 API CreateProcessA fails, ninja now outputs the exact command string that caused it to fail. It also detects when the command contained leading whitespace and outputs a hint that lets the user know why the command failed. --- src/subprocess-win32.cc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/subprocess-win32.cc b/src/subprocess-win32.cc index a4a7669..d221476 100644 --- a/src/subprocess-win32.cc +++ b/src/subprocess-win32.cc @@ -124,12 +124,20 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { buf_ = "CreateProcess failed: The system cannot find the file " "specified.\n"; return true; - } else if (error == ERROR_INVALID_PARAMETER) { - // This generally means that the command line was too long. Give extra - // context for this case. - Win32Fatal("CreateProcess", "is the command line too long?"); } else { - Win32Fatal("CreateProcess"); // pass all other errors to Win32Fatal + fprintf(stderr, "\nCreateProcess failed. Command attempted:\n\"%s\"\n", + command.c_str()); + const char* hint = NULL; + // ERROR_INVALID_PARAMETER means the command line was formatted + // incorrectly. This can be caused by a command line being too long or + // leading whitespace in the command. Give extra context for this case. + if (error == ERROR_INVALID_PARAMETER) { + if (command.length() > 0 && (command[0] == ' ' || command[0] == '\t')) + hint = "command contains leading whitespace"; + else + hint = "is the command line too long?"; + } + Win32Fatal("CreateProcess", hint); } } -- cgit v1.2.1