]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bmake/unit-tests/deptgt-end.mk
Update to bmake-20201101
[FreeBSD/FreeBSD.git] / contrib / bmake / unit-tests / deptgt-end.mk
1 # $NetBSD: deptgt-end.mk,v 1.6 2020/10/23 19:28:17 rillig Exp $
2 #
3 # Tests for the special target .END in dependency declarations,
4 # which is run after making the desired targets.
5
6 VAR=    Should not be expanded.
7
8 .BEGIN:
9         : $@ '$${VAR}'
10         ...
11         : $@ '$${VAR}' deferred
12 # Oops: The deferred command must not be expanded twice.
13 # The Var_Subst in Compat_RunCommand looks suspicious.
14 # The Var_Subst in JobSaveCommand looks suspicious.
15
16 .END:
17         : $@ '$${VAR}'
18         ...
19         : $@ '$${VAR}' deferred
20
21 # The .END node can define dependencies, just like a regular target.
22 .END: end-action
23 end-action: .NOTMAIN
24         : $@ '$${VAR}'
25         ...
26         : $@ '$${VAR}' deferred
27
28 all:
29         : $@ '$${VAR}'
30         ...
31         : $@ '$${VAR}' deferred
32 # Oops: The deferred command must not be expanded twice.
33 # The Var_Subst in Compat_RunCommand looks suspicious.
34 # The Var_Subst in JobSaveCommand looks suspicious.
35
36 # The deferred commands are run in the order '.END .BEGIN all'.
37 # This may be unexpected at first since the natural order would be
38 # '.BEGIN all .END', but it is implemented correctly.
39 #
40 # At the point where the commands of a node with deferred commands are run,
41 # the deferred commands are appended to the commands of the .END node.
42 # This happens in Compat_RunCommand, and to prevent an endless loop, the
43 # deferred commands of the .END node itself are not appended to itself.
44 # Instead, the deferred commands of the .END node are run as if they were
45 # immediate commands.