summaryrefslogtreecommitdiff
path: root/unit-tests/deptgt-end.mk
blob: 1240d6714a25cece4aa6371ef83f22efbcc58ea2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# $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.