summaryrefslogtreecommitdiff
path: root/unit-tests/depsrc-ignore.mk
diff options
context:
space:
mode:
Diffstat (limited to 'unit-tests/depsrc-ignore.mk')
-rw-r--r--unit-tests/depsrc-ignore.mk67
1 files changed, 67 insertions, 0 deletions
diff --git a/unit-tests/depsrc-ignore.mk b/unit-tests/depsrc-ignore.mk
new file mode 100644
index 000000000000..1be3eabe8806
--- /dev/null
+++ b/unit-tests/depsrc-ignore.mk
@@ -0,0 +1,67 @@
+# $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.
+#
+# Even though ignore-errors fails, the all target is still made.
+# Since the all target is not marked with .IGNORE, it stops at the
+# first failing command.
+#
+# 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". 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
+#
+# 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
+
+ignore-errors: .IGNORE
+ @echo $@ begin
+ false $@
+ @echo $@ end
+
+all:
+ @echo $@ begin
+ false $@
+ @echo $@ end