Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make/unit-tests make(1): explain the shuffled messag...



details:   https://anonhg.NetBSD.org/src/rev/3b67ecb60c01
branches:  trunk
changeset: 937976:3b67ecb60c01
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sat Aug 29 16:13:27 2020 +0000

description:
make(1): explain the shuffled messages in the test output

diffstat:

 usr.bin/make/unit-tests/depsrc-ignore.mk |  56 +++++++++++++++++++++++++------
 1 files changed, 45 insertions(+), 11 deletions(-)

diffs (72 lines):

diff -r a917a418b872 -r 3b67ecb60c01 usr.bin/make/unit-tests/depsrc-ignore.mk
--- a/usr.bin/make/unit-tests/depsrc-ignore.mk  Sat Aug 29 16:07:11 2020 +0000
+++ b/usr.bin/make/unit-tests/depsrc-ignore.mk  Sat Aug 29 16:13:27 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: depsrc-ignore.mk,v 1.3 2020/08/29 15:06:33 rillig Exp $
+# $NetBSD: depsrc-ignore.mk,v 1.4 2020/08/29 16:13:27 rillig Exp $
 #
 # Tests for the special source .IGNORE in dependency declarations,
 # which ignores any command failures for that target.
@@ -7,18 +7,52 @@
 # Since the all target is not marked with .IGNORE, it stops at the
 # first failing command.
 #
-# XXX: The messages in the output are confusing.
+# XXX: The ordering of the messages in the output is confusing.
 # The "ignored" comes much too late to be related to the "false
-# ignore-errors".
-# The "continuing" is confusing as well since it doesn't answer the
-# question "continuing with what?".
+# ignore-errors".  This is due to stdout being buffered.
+#
+# The "continuing" message comes from the -k option.  If there had been
+# other targets independent of "all", these would be built as well.
+#
+# Enabling the debugging option -de changes the order in which the messages
+# appear.  Now the "ignored" message is issued in the correct position.
+# The explanation for the output reordering is that the output is buffered.
+# As the manual page says, in debugging mode stdout is line buffered.
+# In these tests the output is redirected to a file, therefore stdout is
+# fully buffered.
+#
+# This is what actually happens, as of 2020-08-29.  To verify it, set the
+# following breakpoints in CompatRunCommand:
+#
+# * the "!silent" line, to see all commands.
+# * the "fflush" line, to see stdout being flushed.
+# * the "status = WEXITSTATUS" line
+# * the "(continuing)" line
+# * the "(ignored)" line
 #
-# Even more interestingly, enabling the debugging option -de changes
-# the order in which the messages appear.  Now the "ignored" message
-# is issued in the correct position.  The manual page even defines the
-# buffering of debug_file and stdout, so there should be no variance.
-
-#.MAKEFLAGS: -de
+# The breakpoints are visited in the following order:
+#
+# "ignore-errors begin"
+#      Goes directly to STDOUT_FILENO since it is run in a child process.
+# "false ignore-errors"
+#      Goes to the stdout buffer (CompatRunCommand, keyword "!silent") and
+#      the immediate call to fflush(stdout) copies it to STDOUT_FILENO.
+# "*** Error code 1 (ignored)"
+#      Goes to the stdout buffer but is not flushed (CompatRunCommand, near
+#      the end).
+# "ignore-errors end"
+#      Goes directly to STDOUT_FILENO.
+# "all begin"
+#      Goes directly to STDOUT_FILENO.
+# "false all"
+#      Goes to the stdout buffer, where the "*** Error code 1 (ignored)" is
+#      still waiting to be flushed.  These two lines are flushed now.
+# "*** Error code 1 (continuing)"
+#      Goes to the stdout buffer.
+# "Stop."
+#      Goes to the stdout buffer.
+# exit(1)
+#      Flushes the stdout buffer to STDOUT_FILENO.
 
 all: ignore-errors
 



Home | Main Index | Thread Index | Old Index