mirror of
https://github.com/freebsd/freebsd-src
synced 2024-07-21 10:19:04 +00:00
![Simon J. Gerraty](/assets/img/avatar_default.png)
Lots more unit tests and code cleanup Relevant changes from ChangeLog o job.c: Print -de error information when running multiple jobs o var.c: only report error for unmatched regex subexpression when linting (-dL) since we cannot tell when an unmatched subexpression is an expected result. reduce memory allocations in the modifiers ':D' and ':U' reduce memory allocation and strlen calls in modifier ':from=to' in the ':Q' modifier, only allocate memory if necessary improve performance for LazyBuf reduce debug logging and memory allocation for ${:U...} reduce verbosity of the -dv debug logging for standard cases fix double varname expansion in the variable modifier '::=' o var.c: avoid evaluating many modifiers in parse only mode in strict mode (-dL) many variable references are parsed twice, the first time just to report parse errors early, so we want to avoid side effects and wasted effort to the extent possible.
97 lines
3.3 KiB
Makefile
97 lines
3.3 KiB
Makefile
# $NetBSD: var-op-assign.mk,v 1.8 2021/03/15 19:15:04 rillig Exp $
|
|
#
|
|
# Tests for the = variable assignment operator, which overwrites an existing
|
|
# variable or creates it.
|
|
|
|
# This is a simple variable assignment.
|
|
# To the left of the assignment operator '=' there is the variable name,
|
|
# and to the right is the variable value. The variable value is stored as-is,
|
|
# it is not expanded in any way.
|
|
#
|
|
VAR= value
|
|
|
|
# This condition demonstrates that whitespace around the assignment operator
|
|
# is discarded. Otherwise the value would start with a single tab.
|
|
#
|
|
.if ${VAR} != "value"
|
|
. error
|
|
.endif
|
|
|
|
# Whitespace to the left of the assignment operator is ignored as well.
|
|
# The variable value can contain arbitrary characters.
|
|
#
|
|
# The '#' needs to be escaped with a backslash, this happens in a very
|
|
# early stage of parsing and applies to all line types, except for the
|
|
# commands, which are indented with a tab.
|
|
#
|
|
# The '$' needs to be escaped with another '$', otherwise it would refer to
|
|
# another variable.
|
|
#
|
|
VAR= new value and \# some $$ special characters # comment
|
|
|
|
# When a string literal appears in a condition, the escaping rules are
|
|
# different. Run make with the -dc option to see the details.
|
|
.if ${VAR} != "new value and \# some \$ special characters"
|
|
. error ${VAR}
|
|
.endif
|
|
|
|
# The variable value may contain references to other variables.
|
|
# In this example, the reference is to the variable with the empty name,
|
|
# which is never defined.
|
|
#
|
|
# This alone would not produce any side-effects, therefore the variable has
|
|
# a :!...! modifier that executes a shell command. The :!...! modifier turns
|
|
# an undefined expression into a defined one, see ApplyModifier_ShellCommand,
|
|
# the call to Expr_Define.
|
|
#
|
|
# Since the right-hand side of a '=' assignment is not expanded at the time
|
|
# when the variable is defined, the first command is not run at all.
|
|
VAR= ${:! echo 'not yet evaluated' 1>&2 !}
|
|
VAR= ${:! echo 'this will be evaluated later' 1>&2 !}
|
|
|
|
# Now force the variable to be evaluated.
|
|
# This outputs the line to stderr.
|
|
.if ${VAR}
|
|
.endif
|
|
|
|
# In a variable assignment, the variable name must consist of a single word.
|
|
# The following line therefore generates a parse error.
|
|
VARIABLE NAME= variable value
|
|
|
|
# But if the whitespace appears inside parentheses or braces, everything is
|
|
# fine.
|
|
#
|
|
# XXX: This was not an intentional decision, as variable names typically
|
|
# neither contain parentheses nor braces. This is only a side-effect from
|
|
# the implementation of the parser, which cheats when parsing a variable
|
|
# name. It only counts parentheses and braces instead of properly parsing
|
|
# nested variable expressions such as VAR.${param}.
|
|
#
|
|
VAR(spaces in parentheses)= ()
|
|
VAR{spaces in braces}= {}
|
|
|
|
# Be careful and use indirect variable names here, to prevent accidentally
|
|
# accepting the test in case the parser just uses "VAR" as the variable name,
|
|
# ignoring all the rest.
|
|
#
|
|
VARNAME_PAREN= VAR(spaces in parentheses)
|
|
VARNAME_BRACES= VAR{spaces in braces}
|
|
|
|
.if ${${VARNAME_PAREN}} != "()"
|
|
. error
|
|
.endif
|
|
|
|
.if ${${VARNAME_BRACES}} != "{}"
|
|
. error
|
|
.endif
|
|
|
|
# In safe mode, parsing would stop immediately after the "VARIABLE NAME="
|
|
# line, since any commands run after that are probably working with
|
|
# unexpected variable values.
|
|
#
|
|
# Therefore, just output an info message.
|
|
.info Parsing still continues until here.
|
|
|
|
all:
|
|
@:;
|