mirror of
https://github.com/mirror/make.git
synced 2026-08-12 22:16:11 +00:00
Support --output-sync on MS-Windows.
w32/compat/posixfcn.c: New file, with emulations of Posix functions and Posix functionality for MS-Windows. w32/subproc/sub_proc.c: Include io.h. (process_noinherit): New function, forces a file descriptor to not be inherited by child processes. (process_easy): Accept two additional arguments, and use them to set up the standard output and standard error handles of the child process. w32/include/sub_proc.h (process_easy): Adjust prototype. (process_noinherit): Add prototype. read.c [WINDOWS32]: Include windows.h and sub_proc.h. makeint.h (LOCALEDIR) [WINDOWS32}: Define to NULL if not defined. This is needed because the MS-Windows build doesn't have a canonical place for LOCALEDIR. (WIN32_LEAN_AND_MEAN) [WINDOWS32]: Define, to avoid getting from windows.h header too much stuff that could conflict with the code. main.c <sync_mutex>: New static variable. <switches>: Add support for "--sync-mutex" switch. (decode_output_sync_flags): Decode the --sync-mutex= switch. (prepare_mutex_handle_string) [WINDOWS32]: New function. (main): Add "output-sync" to .FEATURES. job.h (CLOSE_ON_EXEC) [WINDOWS32]: Define to call process_noinherit. (F_GETFD, F_SETLKW, F_WRLCK, F_UNLCK, struct flock) [WINDOWS32]: New macros. (RECORD_SYNC_MUTEX): New macro, a no-op for Posix platforms. (sync_handle_t): New typedef. job.c <sync_handle>: Change type to sync_handle_t. (FD_NOT_EMPTY): Seek to the file's end. Suggested by Frank Heckenbach <f.heckenbach@fh-soft.de>. (pump_from_tmp_fd) [WINDOWS32]: Switch to_fd to binary mode for the duration of this function, and then change back before returning. (start_job_command) [WINDOWS32]: Support output_sync mode on MS-Windows. Use a system-wide mutex instead of locking stdout/stderr. Call process_easy with two additional arguments: child->outfd and child->errfd. (exec_command) [WINDOWS32]: Pass two additional arguments, both -1, to process_easy, to adjust for the changed function signature. function.c (windows32_openpipe) [WINDOWS32]: This function now returns an int, which is -1 if it fails and zero otherwise. It also calls 'error' instead of 'fatal', to avoid exiting prematurely. (func_shell_base) [WINDOWS32]: Call perror_with_name if windows32_openpipe fails, now that it always returns. This avoids a compiler warning that error_prefix is not used in the MS-Windows build. config.h.W32.template (OUTPUT_SYNC): Define. build_w32.bat: Add w32/compat/posixfcn.c to compilation and linking commands. From Frank Heckenbach <f.heckenbach@fh-soft.de>: job.c (sync_output): Don't discard the output if acquire_semaphore fails; instead, dump the output unsynchronized.
This commit is contained in:
36
function.c
36
function.c
@@ -1431,7 +1431,7 @@ int shell_function_pid = 0, shell_function_completed;
|
||||
#include "sub_proc.h"
|
||||
|
||||
|
||||
void
|
||||
int
|
||||
windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp)
|
||||
{
|
||||
SECURITY_ATTRIBUTES saAttr;
|
||||
@@ -1442,6 +1442,10 @@ windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp
|
||||
HANDLE hProcess, tmpIn, tmpErr;
|
||||
DWORD e;
|
||||
|
||||
/* Set status for return. */
|
||||
pipedes[0] = pipedes[1] = -1;
|
||||
*pid_p = (pid_t)-1;
|
||||
|
||||
saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);
|
||||
saAttr.bInheritHandle = TRUE;
|
||||
saAttr.lpSecurityDescriptor = NULL;
|
||||
@@ -1472,8 +1476,10 @@ windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp
|
||||
DUPLICATE_SAME_ACCESS) == FALSE)
|
||||
CloseHandle(tmpIn);
|
||||
}
|
||||
if (hIn == INVALID_HANDLE_VALUE)
|
||||
fatal (NILF, _("windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"), e);
|
||||
if (hIn == INVALID_HANDLE_VALUE) {
|
||||
error (NILF, _("windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"), e);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
tmpErr = GetStdHandle(STD_ERROR_HANDLE);
|
||||
if (DuplicateHandle(GetCurrentProcess(),
|
||||
@@ -1497,17 +1503,23 @@ windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp
|
||||
DUPLICATE_SAME_ACCESS) == FALSE)
|
||||
CloseHandle(tmpErr);
|
||||
}
|
||||
if (hErr == INVALID_HANDLE_VALUE)
|
||||
fatal (NILF, _("windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"), e);
|
||||
if (hErr == INVALID_HANDLE_VALUE) {
|
||||
error (NILF, _("windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"), e);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0))
|
||||
fatal (NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
|
||||
if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0)) {
|
||||
error (NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
hProcess = process_init_fd(hIn, hChildOutWr, hErr);
|
||||
|
||||
if (!hProcess)
|
||||
fatal (NILF, _("windows32_openpipe(): process_init_fd() failed\n"));
|
||||
if (!hProcess) {
|
||||
error (NILF, _("windows32_openpipe(): process_init_fd() failed\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* make sure that CreateProcess() has Path it needs */
|
||||
sync_Path_environment();
|
||||
@@ -1527,6 +1539,7 @@ windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp
|
||||
|
||||
/* this will be closed almost right away */
|
||||
pipedes[1] = _open_osfhandle((intptr_t) hChildOutWr, O_APPEND);
|
||||
return 0;
|
||||
} else {
|
||||
/* reap/cleanup the failed process */
|
||||
process_cleanup(hProcess);
|
||||
@@ -1541,9 +1554,7 @@ windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp
|
||||
CloseHandle(hChildOutRd);
|
||||
CloseHandle(hChildOutWr);
|
||||
|
||||
/* set status for return */
|
||||
pipedes[0] = pipedes[1] = -1;
|
||||
*pid_p = (pid_t)-1;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1698,6 +1709,7 @@ func_shell_base (char *o, char **argv, int trim_newlines)
|
||||
{
|
||||
/* Open of the pipe failed, mark as failed execution. */
|
||||
shell_function_completed = -1;
|
||||
perror_with_name (error_prefix, "pipe");
|
||||
return o;
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user