Home | History | Annotate | Line # | Download | only in unit-tests
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