]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bmake/unit-tests/deptgt-end-jobs.mk
zfs: merge OpenZFS master-436ab35a5
[FreeBSD/FreeBSD.git] / contrib / bmake / unit-tests / deptgt-end-jobs.mk
1 # $NetBSD: deptgt-end-jobs.mk,v 1.1 2020/09/23 03:06:38 rillig Exp $
2 #
3 # Tests for the special target .END in dependency declarations,
4 # which is run after making the desired targets.
5 #
6 # This test is very similar to deptgt-end.mk, except for the -j option.
7 # This option enables parallel mode, in which the code from job.c partially
8 # replaces the code from compat.c.
9 #
10 # Before 2020-08-22, this test crashed with a null pointer dereference.
11 # Before 2020-09-23, this test crashed with an assertion failure.
12 .MAKEFLAGS: -j 8
13
14 VAR=    Should not be expanded.
15
16 .BEGIN:
17         : $@ '$${VAR}'
18         ...
19         : $@ '$${VAR}' deferred
20 # Oops: The deferred command must not be expanded twice.
21 # The Var_Subst in Compat_RunCommand looks suspicious.
22 # The Var_Subst in JobSaveCommand looks suspicious.
23
24 .END:
25         : $@ '$${VAR}'
26         ...
27         : $@ '$${VAR}' deferred
28
29 all:
30         : $@ '$${VAR}'
31         ...
32         : $@ '$${VAR}' deferred
33 # Oops: The deferred command must not be expanded twice.
34 # The Var_Subst in Compat_RunCommand looks suspicious.
35 # The Var_Subst in JobSaveCommand looks suspicious.
36
37 # The deferred commands are run in the order '.END .BEGIN all'.
38 # This may be unexpected at first since the natural order would be
39 # '.BEGIN all .END', but it is implemented correctly.
40 #
41 # At the point where the commands of a node with deferred commands are run,
42 # the deferred commands are appended to the commands of the .END node.
43 # This happens in Compat_RunCommand, and to prevent an endless loop, the
44 # deferred commands of the .END node itself are not appended to itself.
45 # Instead, the deferred commands of the .END node are run as if they were
46 # immediate commands.