URL: <http://savannah.gnu.org/bugs/?45476>
Summary: cygwin: stderr redirect append does not work with native Windows programs Project: make Submitted by: matzeri Submitted on: Sun 05 Jul 2015 08:36:11 PM GMT Severity: 3 - Normal Item Group: Bug Status: None Privacy: Public Assigned to: None Open/Closed: Open Discussion Lock: Any Component Version: 4.1 Operating System: MS Windows Fixed Release: None Triage Status: None _______________________________________________________ Details: First reported at https://cygwin.com/ml/cygwin/2015-05/msg00140.html I was not able to bisect make code to identify when the issue was introduced. Attached test case --- original message ---- Using 32-bit cygwin 2.0.2 and make 4.1-1, in a recipe, redirecting stderr in append mode does not work if the program being invoked on a shell line is a native Windows executable. Instead of appending, the stderr output is written to the top of the file, corrupting it. This happens only if the 'make' process has its own stdout/err redirected to a pipe. Example recipe: all: echo first > output echo secondxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >> output /cygdrive/c/Windows/System32/sort.exe nonexist 2>> output; true When "make" is run, the "output" file should be: first secondxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nonexistThe system cannot find the file specified. and in fact it is. But when "make 2>&1 | cat" is run, the output is: nonexistThe system cannot find the file specified. xxxxxxxxxxxxxx even though it should be the same as before. The error message written by sort.exe went to the top of the file instead of the end. The problem does not happen if 'sort.exe' is replaced with a cygwin program such as /usr/bin/sort. The problem does not happen if stdout is redirected instead of stderr. The problem does not happen if the output of 'make' is redirected to a file instead of a pipe. The problem does not happen if the sequence of commands in the recipe is copied into a shell script and the shell invoked with its output redirected to a pipe. That is why I am filing this against 'make'. However, it is possible the bug is in the shell (or a different shell?) and I just don't know how to invoke it properly to imitate what 'make' does. I am attaching a reproducer Makefile. Run "make 2>&1 | cat" to see the incorrect output: $ make 2>&1 | cat echo first > output echo secondxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >> output /cygdrive/c/Windows/System32/sort.exe nonexist 2>> output; true ----- BEGIN output ----- nonexistThe system cannot find the file specified. xxxxxxxxxxxxxx ----- END output ----- The bug happens with both make 4.1 and make 4.0 on cygwin 2.0.2. It does not happen with make 3.82.90 and cygwin 1.7.23. _______________________________________________________ File Attachments: ------------------------------------------------------- Date: Sun 05 Jul 2015 08:36:11 PM GMT Name: Makefile Size: 293B By: matzeri <http://savannah.gnu.org/bugs/download.php?file_id=34383> _______________________________________________________ Reply to this item at: <http://savannah.gnu.org/bugs/?45476> _______________________________________________ Message sent via/by Savannah http://savannah.gnu.org/ _______________________________________________ Bug-make mailing list Bug-make@gnu.org https://lists.gnu.org/mailman/listinfo/bug-make