directive-export-gmake.mk revision 1.7 1 1.7 rillig # $NetBSD: directive-export-gmake.mk,v 1.7 2023/08/20 20:48:32 rillig Exp $
2 1.1 rillig #
3 1.1 rillig # Tests for the export directive (without leading dot), as in GNU make.
4 1.1 rillig
5 1.1 rillig # The "export" directive only affects the environment of the make process
6 1.1 rillig # and its child processes. It does not affect the global variables or any
7 1.1 rillig # other variables.
8 1.1 rillig VAR= before
9 1.1 rillig export VAR=exported
10 1.1 rillig .if ${VAR} != "before"
11 1.1 rillig . error
12 1.1 rillig .endif
13 1.1 rillig
14 1.1 rillig # Ensure that the name-value pair is actually exported.
15 1.1 rillig .if ${:!echo "\$VAR"!} != "exported"
16 1.1 rillig . error
17 1.1 rillig .endif
18 1.1 rillig
19 1.1 rillig # This line looks like it would export 2 variables, but it doesn't.
20 1.1 rillig # It only exports VAR and appends everything else as the variable value.
21 1.1 rillig export VAR=exported VAR2=exported-as-well
22 1.1 rillig .if ${:!echo "\$VAR"!} != "exported VAR2=exported-as-well"
23 1.1 rillig . error ${:!echo "\$VAR"!}
24 1.1 rillig .endif
25 1.1 rillig
26 1.1 rillig # Contrary to the usual variable assignments, spaces are significant
27 1.1 rillig # after the '=' sign and are prepended to the value of the environment
28 1.1 rillig # variable.
29 1.1 rillig export VAR= leading spaces
30 1.1 rillig .if ${:!echo "\$VAR"!} != " leading spaces"
31 1.1 rillig . error
32 1.1 rillig .endif
33 1.1 rillig
34 1.1 rillig # Contrary to the usual variable assignments, spaces are significant
35 1.1 rillig # before the '=' sign and are appended to the name of the environment
36 1.1 rillig # variable.
37 1.2 rillig #
38 1.2 rillig # Depending on the shell, environment variables with such exotic names
39 1.2 rillig # may be silently discarded. One such shell is dash, which is the default
40 1.2 rillig # shell on Ubuntu and Debian.
41 1.1 rillig export VAR =trailing space in varname
42 1.3 rillig .if ${:!env | grep trailing || true!} != "VAR =trailing space in varname"
43 1.3 rillig . if ${:!env | grep trailing || true!} != "" # for dash
44 1.2 rillig . error
45 1.2 rillig . endif
46 1.1 rillig .endif
47 1.1 rillig
48 1.1 rillig # The right-hand side of the exported variable is expanded exactly once.
49 1.1 rillig TWICE= expanded twice
50 1.1 rillig ONCE= expanded once, leaving $${TWICE} as-is
51 1.1 rillig export VAR=${ONCE}
52 1.1 rillig .if ${:!echo "\$VAR"!} != "expanded once, leaving \${TWICE} as-is"
53 1.1 rillig . error
54 1.1 rillig .endif
55 1.1 rillig
56 1.1 rillig # Undefined variables are allowed on the right-hand side, they expand
57 1.1 rillig # to an empty string, as usual.
58 1.1 rillig export VAR=an ${UNDEF} variable
59 1.1 rillig .if ${:!echo "\$VAR"!} != "an variable"
60 1.1 rillig . error
61 1.1 rillig .endif
62 1.1 rillig
63 1.4 rillig
64 1.4 rillig # The body of the .for loop expands to 'export VAR=${:U1}', and the 'export'
65 1.4 rillig # directive is only recognized if the line does not contain a ':', to allow
66 1.4 rillig # 'export' to be a regular target.
67 1.4 rillig .for value in 1
68 1.6 rillig # XXX: The ':' in this line is inside an expression and should thus not be
69 1.6 rillig # interpreted as a dependency operator.
70 1.6 rillig # expect+1: Invalid line 'export VAR=${:U1}'
71 1.4 rillig export VAR=${value}
72 1.4 rillig .endfor
73 1.7 rillig
74 1.7 rillig
75 1.7 rillig # The 'export' directive expands expressions, but the expressions must not
76 1.7 rillig # contain a ':', due to the overly strict parser. The indirect expressions
77 1.7 rillig # may contain a ':', though.
78 1.7 rillig #
79 1.7 rillig # As a side effect, this test demonstrates that the 'export' directive exports
80 1.7 rillig # the environment variable immediately, other than the '.export' directive,
81 1.7 rillig # which defers that action if the variable value contains a '$'.
82 1.7 rillig INDIRECT_TZ= ${:UAmerica/Los_Angeles}
83 1.7 rillig export TZ=${INDIRECT_TZ}
84 1.7 rillig # expect+1: 16:00:00
85 1.7 rillig .info ${%T:L:localtime=86400}
86