freebsd-dev/contrib/bmake/unit-tests/deptgt-end.mk
Simon J. Gerraty 956e45f6fb Update to bmake-20201101
Lots of new unit-tests increase code coverage.

Lots of refactoring, cleanup and simlpification to reduce
code size.

Fixes for Bug 223564 and 245807

Updates to dirdeps.mk and meta2deps.py
2020-11-07 21:46:27 +00:00

46 lines
1.4 KiB
Makefile

# $NetBSD: deptgt-end.mk,v 1.6 2020/10/23 19:28:17 rillig Exp $
#
# Tests for the special target .END in dependency declarations,
# which is run after making the desired targets.
VAR= Should not be expanded.
.BEGIN:
: $@ '$${VAR}'
...
: $@ '$${VAR}' deferred
# Oops: The deferred command must not be expanded twice.
# The Var_Subst in Compat_RunCommand looks suspicious.
# The Var_Subst in JobSaveCommand looks suspicious.
.END:
: $@ '$${VAR}'
...
: $@ '$${VAR}' deferred
# The .END node can define dependencies, just like a regular target.
.END: end-action
end-action: .NOTMAIN
: $@ '$${VAR}'
...
: $@ '$${VAR}' deferred
all:
: $@ '$${VAR}'
...
: $@ '$${VAR}' deferred
# Oops: The deferred command must not be expanded twice.
# The Var_Subst in Compat_RunCommand looks suspicious.
# The Var_Subst in JobSaveCommand looks suspicious.
# The deferred commands are run in the order '.END .BEGIN all'.
# This may be unexpected at first since the natural order would be
# '.BEGIN all .END', but it is implemented correctly.
#
# At the point where the commands of a node with deferred commands are run,
# the deferred commands are appended to the commands of the .END node.
# This happens in Compat_RunCommand, and to prevent an endless loop, the
# deferred commands of the .END node itself are not appended to itself.
# Instead, the deferred commands of the .END node are run as if they were
# immediate commands.