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