Import bmake-20220330
Most relevant change: o parse.c: try to include 'posix.mk' the first time .POSIX: is encountered, to allow for beter POSIX compliance. Others o cond.c: make debug logging for comparisons less technical o lst.c: fix mem leak in Lst_Remove o job.c: fix echoing of command with '-' in silent target in jobs mode o var.c: make debug logs more readable prefer 'long long' over 'long' on 32-bit C99 platforms fix crash on .undef of an environment variable
This commit is contained in:
parent
535c59a6a9
commit
a052cb4320
38
ChangeLog
38
ChangeLog
@ -1,3 +1,41 @@
|
|||||||
|
2022-03-30 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* VERSION (_MAKE_VERSION): 20220330
|
||||||
|
Merge with NetBSD make, pick up
|
||||||
|
o var.c: fix spacing, and a typo in a test
|
||||||
|
|
||||||
|
2022-03-26 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* VERSION (_MAKE_VERSION): 20220326
|
||||||
|
Merge with NetBSD make, pick up
|
||||||
|
o parse.c: try to include 'posix.mk' the first time
|
||||||
|
.POSIX: is encountered, to allow for beter POSIX compliance.
|
||||||
|
o var.c: make debug logs more readable
|
||||||
|
prefer 'long long' over 'long' on 32-bit C99 platforms
|
||||||
|
fix crash on .undef of an environment variable
|
||||||
|
|
||||||
|
2022-03-03 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* VERSION (_MAKE_VERSION): 20220303
|
||||||
|
Merge with NetBSD make, pick up
|
||||||
|
o tell meta mode unit tests not to expect filemon
|
||||||
|
o cond.c: make debug logging for comparisons less technical
|
||||||
|
o lst.c: fix mem leak in Lst_Remove
|
||||||
|
o str.c: make code for string matching syntactically more consistent
|
||||||
|
o var.c: simplify ParseModifier_Match
|
||||||
|
|
||||||
|
2022-02-14 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* unit-tests/Makefile: control MAKESYSPATH for deptgt-phony
|
||||||
|
|
||||||
|
* VERSION (_MAKE_VERSION): 20220214
|
||||||
|
Merge with NetBSD make, pick up
|
||||||
|
o cond.c: simplify control flow in CondParser_Comparison
|
||||||
|
o job.c: fix echoing of command with '-' in silent target in jobs mode
|
||||||
|
o main.c: prefix the warning about read-only .OBJDIR with a colon
|
||||||
|
o parse.c: remove redundant conditions
|
||||||
|
o var.c: simplify control flow in ModifyWord_SysVSubst
|
||||||
|
|
||||||
2022-02-08 Simon J Gerraty <sjg@beast.crufty.net>
|
2022-02-08 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
* unit-tests/Makefile: disable opt-debug-x-trace on Linux if there
|
* unit-tests/Makefile: disable opt-debug-x-trace on Linux if there
|
||||||
|
4
FILES
4
FILES
@ -278,6 +278,8 @@ unit-tests/deptgt-precious.exp
|
|||||||
unit-tests/deptgt-precious.mk
|
unit-tests/deptgt-precious.mk
|
||||||
unit-tests/deptgt-shell.exp
|
unit-tests/deptgt-shell.exp
|
||||||
unit-tests/deptgt-shell.mk
|
unit-tests/deptgt-shell.mk
|
||||||
|
unit-tests/deptgt-silent-jobs.exp
|
||||||
|
unit-tests/deptgt-silent-jobs.mk
|
||||||
unit-tests/deptgt-silent.exp
|
unit-tests/deptgt-silent.exp
|
||||||
unit-tests/deptgt-silent.mk
|
unit-tests/deptgt-silent.mk
|
||||||
unit-tests/deptgt-stale.exp
|
unit-tests/deptgt-stale.exp
|
||||||
@ -502,6 +504,8 @@ unit-tests/opt-jobs-no-action.exp
|
|||||||
unit-tests/opt-jobs-no-action.mk
|
unit-tests/opt-jobs-no-action.mk
|
||||||
unit-tests/opt-jobs.exp
|
unit-tests/opt-jobs.exp
|
||||||
unit-tests/opt-jobs.mk
|
unit-tests/opt-jobs.mk
|
||||||
|
unit-tests/opt-keep-going-indirect.exp
|
||||||
|
unit-tests/opt-keep-going-indirect.mk
|
||||||
unit-tests/opt-keep-going-multiple.exp
|
unit-tests/opt-keep-going-multiple.exp
|
||||||
unit-tests/opt-keep-going-multiple.mk
|
unit-tests/opt-keep-going-multiple.mk
|
||||||
unit-tests/opt-keep-going.exp
|
unit-tests/opt-keep-going.exp
|
||||||
|
2
VERSION
2
VERSION
@ -1,2 +1,2 @@
|
|||||||
# keep this compatible with sh and make
|
# keep this compatible with sh and make
|
||||||
_MAKE_VERSION=20220208
|
_MAKE_VERSION=20220330
|
||||||
|
35
bmake.1
35
bmake.1
@ -1,4 +1,4 @@
|
|||||||
.\" $NetBSD: make.1,v 1.304 2022/01/29 20:54:58 sjg Exp $
|
.\" $NetBSD: make.1,v 1.307 2022/03/26 15:39:58 sjg Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1990, 1993
|
.\" Copyright (c) 1990, 1993
|
||||||
.\" The Regents of the University of California. All rights reserved.
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
@ -29,7 +29,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
||||||
.\"
|
.\"
|
||||||
.Dd January 28, 2022
|
.Dd March 24, 2022
|
||||||
.Dt BMAKE 1
|
.Dt BMAKE 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -692,15 +692,15 @@ Variables that are defined specific to a certain target.
|
|||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Local variables can be set on a dependency line, if
|
Local variables can be set on a dependency line, if
|
||||||
.Va .MAKE.TARGET_LOCAL_VARIABLES ,
|
.Va .MAKE.TARGET_LOCAL_VARIABLES
|
||||||
is not set to
|
is not set to
|
||||||
.Ql false .
|
.Ql false .
|
||||||
The rest of the line
|
The rest of the line
|
||||||
(which will already have had Global variables expanded),
|
(which will already have had global variables expanded)
|
||||||
is the variable value.
|
is the variable value.
|
||||||
For example:
|
For example:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
COMPILER_WRAPPERS+= ccache distcc icecc
|
COMPILER_WRAPPERS= ccache distcc icecc
|
||||||
|
|
||||||
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
||||||
.Ed
|
.Ed
|
||||||
@ -708,17 +708,17 @@ ${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
|||||||
Only the targets
|
Only the targets
|
||||||
.Ql ${OBJS}
|
.Ql ${OBJS}
|
||||||
will be impacted by that filter (in "meta" mode) and
|
will be impacted by that filter (in "meta" mode) and
|
||||||
simply enabling/disabling any of the wrappers will not render all
|
simply enabling/disabling any of the compiler wrappers will not render all
|
||||||
of those targets out-of-date.
|
of those targets out-of-date.
|
||||||
.Pp
|
.Pp
|
||||||
.Em NOTE :
|
.Em NOTE :
|
||||||
target local variable assignments behave differently in that;
|
target-local variable assignments behave differently in that;
|
||||||
.Bl -tag -width Ds -offset indent
|
.Bl -tag -width Ds -offset indent
|
||||||
.It Ic \&+=
|
.It Ic \&+=
|
||||||
Only appends to a previous local assignment
|
Only appends to a previous local assignment
|
||||||
for the same target and variable.
|
for the same target and variable.
|
||||||
.It Ic \&:=
|
.It Ic \&:=
|
||||||
Is redundant with respect to Global variables,
|
Is redundant with respect to global variables,
|
||||||
which have already been expanded.
|
which have already been expanded.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
@ -2290,6 +2290,25 @@ The suffix must have been previously declared with
|
|||||||
Apply the
|
Apply the
|
||||||
.Ic .PHONY
|
.Ic .PHONY
|
||||||
attribute to any specified sources.
|
attribute to any specified sources.
|
||||||
|
.It Ic .POSIX
|
||||||
|
This should be the first non-comment line in a Makefile.
|
||||||
|
It results in the variable
|
||||||
|
.Va %POSIX
|
||||||
|
being defined with the value
|
||||||
|
.Ql 1003.2 .
|
||||||
|
The first time
|
||||||
|
.Ic .POSIX
|
||||||
|
is encountered, the makefile
|
||||||
|
.Ql posix.mk
|
||||||
|
will be included if possible,
|
||||||
|
to provide POSIX compatible default rules.
|
||||||
|
If
|
||||||
|
.Nm
|
||||||
|
is run with the
|
||||||
|
.Fl r
|
||||||
|
flag, then only
|
||||||
|
.Ql posix.mk
|
||||||
|
will contribute to the default rules.
|
||||||
.It Ic .PRECIOUS
|
.It Ic .PRECIOUS
|
||||||
Apply the
|
Apply the
|
||||||
.Ic .PRECIOUS
|
.Ic .PRECIOUS
|
||||||
|
25
bmake.cat1
25
bmake.cat1
@ -444,24 +444,24 @@ BMAKE(1) FreeBSD General Commands Manual BMAKE(1)
|
|||||||
Variables that are defined specific to a certain target.
|
Variables that are defined specific to a certain target.
|
||||||
|
|
||||||
Local variables can be set on a dependency line, if
|
Local variables can be set on a dependency line, if
|
||||||
[4m.MAKE.TARGET_LOCAL_VARIABLES[24m, is not set to `false'. The rest of the
|
[4m.MAKE.TARGET_LOCAL_VARIABLES[24m is not set to `false'. The rest of the line
|
||||||
line (which will already have had Global variables expanded), is the
|
(which will already have had global variables expanded) is the variable
|
||||||
variable value. For example:
|
value. For example:
|
||||||
|
|
||||||
COMPILER_WRAPPERS+= ccache distcc icecc
|
COMPILER_WRAPPERS= ccache distcc icecc
|
||||||
|
|
||||||
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
||||||
|
|
||||||
Only the targets `${OBJS}' will be impacted by that filter (in "meta"
|
Only the targets `${OBJS}' will be impacted by that filter (in "meta"
|
||||||
mode) and simply enabling/disabling any of the wrappers will not render
|
mode) and simply enabling/disabling any of the compiler wrappers will not
|
||||||
all of those targets out-of-date.
|
render all of those targets out-of-date.
|
||||||
|
|
||||||
[4mNOTE[24m: target local variable assignments behave differently in that;
|
[4mNOTE[24m: target-local variable assignments behave differently in that;
|
||||||
|
|
||||||
[1m+= [22mOnly appends to a previous local assignment for the same
|
[1m+= [22mOnly appends to a previous local assignment for the same
|
||||||
target and variable.
|
target and variable.
|
||||||
|
|
||||||
[1m:= [22mIs redundant with respect to Global variables, which have
|
[1m:= [22mIs redundant with respect to global variables, which have
|
||||||
already been expanded.
|
already been expanded.
|
||||||
|
|
||||||
The seven built-in local variables are as follows:
|
The seven built-in local variables are as follows:
|
||||||
@ -1468,6 +1468,13 @@ BMAKE(1) FreeBSD General Commands Manual BMAKE(1)
|
|||||||
|
|
||||||
[1m.PHONY [22mApply the [1m.PHONY [22mattribute to any specified sources.
|
[1m.PHONY [22mApply the [1m.PHONY [22mattribute to any specified sources.
|
||||||
|
|
||||||
|
[1m.POSIX [22mThis should be the first non-comment line in a Makefile. It re-
|
||||||
|
sults in the variable [4m%POSIX[24m being defined with the value
|
||||||
|
`1003.2'. The first time [1m.POSIX [22mis encountered, the makefile
|
||||||
|
`posix.mk' will be included if possible, to provide POSIX com-
|
||||||
|
patible default rules. If [1mbmake [22mis run with the [1m-r [22mflag, then
|
||||||
|
only `posix.mk' will contribute to the default rules.
|
||||||
|
|
||||||
[1m.PRECIOUS[0m
|
[1m.PRECIOUS[0m
|
||||||
Apply the [1m.PRECIOUS [22mattribute to any specified sources. If no
|
Apply the [1m.PRECIOUS [22mattribute to any specified sources. If no
|
||||||
sources are specified, the [1m.PRECIOUS [22mattribute is applied to ev-
|
sources are specified, the [1m.PRECIOUS [22mattribute is applied to ev-
|
||||||
@ -1622,4 +1629,4 @@ BMAKE(1) FreeBSD General Commands Manual BMAKE(1)
|
|||||||
|
|
||||||
There is no way of escaping a space character in a filename.
|
There is no way of escaping a space character in a filename.
|
||||||
|
|
||||||
FreeBSD 13.0 January 28, 2022 FreeBSD 13.0
|
FreeBSD 13.0 March 24, 2022 FreeBSD 13.0
|
||||||
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 83 KiB |
50
cond.c
50
cond.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: cond.c,v 1.327 2022/01/29 01:12:36 rillig Exp $ */
|
/* $NetBSD: cond.c,v 1.333 2022/03/03 19:46:31 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||||
@ -95,7 +95,7 @@
|
|||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
|
||||||
/* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */
|
/* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */
|
||||||
MAKE_RCSID("$NetBSD: cond.c,v 1.327 2022/01/29 01:12:36 rillig Exp $");
|
MAKE_RCSID("$NetBSD: cond.c,v 1.333 2022/03/03 19:46:31 rillig Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Conditional expressions conform to this grammar:
|
* Conditional expressions conform to this grammar:
|
||||||
@ -140,7 +140,9 @@ typedef struct CondParser {
|
|||||||
/*
|
/*
|
||||||
* The plain '.if ${VAR}' evaluates to true if the value of the
|
* The plain '.if ${VAR}' evaluates to true if the value of the
|
||||||
* expression has length > 0. The other '.if' variants delegate
|
* expression has length > 0. The other '.if' variants delegate
|
||||||
* to evalBare instead.
|
* to evalBare instead, for example '.ifdef ${VAR}' is equivalent to
|
||||||
|
* '.if defined(${VAR})', checking whether the variable named by the
|
||||||
|
* expression '${VAR}' is defined.
|
||||||
*/
|
*/
|
||||||
bool plain;
|
bool plain;
|
||||||
|
|
||||||
@ -157,8 +159,8 @@ typedef struct CondParser {
|
|||||||
* make cannot know anymore whether the left-hand side had originally
|
* make cannot know anymore whether the left-hand side had originally
|
||||||
* been a variable expression or a plain word.
|
* been a variable expression or a plain word.
|
||||||
*
|
*
|
||||||
* In all other contexts, the left-hand side must either be a
|
* In conditional directives like '.if', the left-hand side must
|
||||||
* variable expression, a quoted string or a number.
|
* either be a variable expression, a quoted string or a number.
|
||||||
*/
|
*/
|
||||||
bool leftUnquotedOK;
|
bool leftUnquotedOK;
|
||||||
|
|
||||||
@ -213,10 +215,10 @@ static char *
|
|||||||
ParseWord(const char **pp, bool doEval)
|
ParseWord(const char **pp, bool doEval)
|
||||||
{
|
{
|
||||||
const char *p = *pp;
|
const char *p = *pp;
|
||||||
Buffer argBuf;
|
Buffer word;
|
||||||
int paren_depth;
|
int paren_depth;
|
||||||
|
|
||||||
Buf_InitSize(&argBuf, 16);
|
Buf_InitSize(&word, 16);
|
||||||
|
|
||||||
paren_depth = 0;
|
paren_depth = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -240,7 +242,7 @@ ParseWord(const char **pp, bool doEval)
|
|||||||
FStr nestedVal;
|
FStr nestedVal;
|
||||||
(void)Var_Parse(&p, SCOPE_CMDLINE, emode, &nestedVal);
|
(void)Var_Parse(&p, SCOPE_CMDLINE, emode, &nestedVal);
|
||||||
/* TODO: handle errors */
|
/* TODO: handle errors */
|
||||||
Buf_AddStr(&argBuf, nestedVal.str);
|
Buf_AddStr(&word, nestedVal.str);
|
||||||
FStr_Done(&nestedVal);
|
FStr_Done(&nestedVal);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -248,14 +250,14 @@ ParseWord(const char **pp, bool doEval)
|
|||||||
paren_depth++;
|
paren_depth++;
|
||||||
else if (ch == ')' && --paren_depth < 0)
|
else if (ch == ')' && --paren_depth < 0)
|
||||||
break;
|
break;
|
||||||
Buf_AddByte(&argBuf, ch);
|
Buf_AddByte(&word, ch);
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpp_skip_hspace(&p);
|
cpp_skip_hspace(&p);
|
||||||
*pp = p;
|
*pp = p;
|
||||||
|
|
||||||
return Buf_DoneData(&argBuf);
|
return Buf_DoneData(&word);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the function argument, including the surrounding parentheses. */
|
/* Parse the function argument, including the surrounding parentheses. */
|
||||||
@ -286,21 +288,21 @@ ParseFuncArg(CondParser *par, const char **pp, bool doEval, const char *func)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test whether the given variable is defined. */
|
/* See if the given variable is defined. */
|
||||||
static bool
|
static bool
|
||||||
FuncDefined(const char *var)
|
FuncDefined(const char *var)
|
||||||
{
|
{
|
||||||
return Var_Exists(SCOPE_CMDLINE, var);
|
return Var_Exists(SCOPE_CMDLINE, var);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See if the given target is requested to be made. */
|
/* See if a target matching targetPattern is requested to be made. */
|
||||||
static bool
|
static bool
|
||||||
FuncMake(const char *target)
|
FuncMake(const char *targetPattern)
|
||||||
{
|
{
|
||||||
StringListNode *ln;
|
StringListNode *ln;
|
||||||
|
|
||||||
for (ln = opts.create.first; ln != NULL; ln = ln->next)
|
for (ln = opts.create.first; ln != NULL; ln = ln->next)
|
||||||
if (Str_Match(ln->datum, target))
|
if (Str_Match(ln->datum, targetPattern))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -557,7 +559,7 @@ EvalNotEmpty(CondParser *par, const char *value, bool quoted)
|
|||||||
static bool
|
static bool
|
||||||
EvalCompareNum(double lhs, ComparisonOp op, double rhs)
|
EvalCompareNum(double lhs, ComparisonOp op, double rhs)
|
||||||
{
|
{
|
||||||
DEBUG3(COND, "lhs = %f, rhs = %f, op = %.2s\n", lhs, rhs, opname[op]);
|
DEBUG3(COND, "Comparing %f %s %f\n", lhs, opname[op], rhs);
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case LT:
|
case LT:
|
||||||
@ -586,8 +588,7 @@ EvalCompareStr(CondParser *par, const char *lhs,
|
|||||||
return TOK_ERROR;
|
return TOK_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG3(COND, "lhs = \"%s\", rhs = \"%s\", op = %.2s\n",
|
DEBUG3(COND, "Comparing \"%s\" %s \"%s\"\n", lhs, opname[op], rhs);
|
||||||
lhs, rhs, opname[op]);
|
|
||||||
return ToToken((op == EQ) == (strcmp(lhs, rhs) == 0));
|
return ToToken((op == EQ) == (strcmp(lhs, rhs) == 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -663,18 +664,11 @@ CondParser_Comparison(CondParser *par, bool doEval)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CondParser_Leaf(par, doEval, true, &rhs, &rhsQuoted);
|
CondParser_Leaf(par, doEval, true, &rhs, &rhsQuoted);
|
||||||
if (rhs.str == NULL)
|
t = rhs.str == NULL ? TOK_ERROR
|
||||||
goto done_rhs;
|
: !doEval ? TOK_FALSE
|
||||||
|
: EvalCompare(par, lhs.str, lhsQuoted, op, rhs.str, rhsQuoted);
|
||||||
if (!doEval) {
|
|
||||||
t = TOK_FALSE;
|
|
||||||
goto done_rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
t = EvalCompare(par, lhs.str, lhsQuoted, op, rhs.str, rhsQuoted);
|
|
||||||
|
|
||||||
done_rhs:
|
|
||||||
FStr_Done(&rhs);
|
FStr_Done(&rhs);
|
||||||
|
|
||||||
done_lhs:
|
done_lhs:
|
||||||
FStr_Done(&lhs);
|
FStr_Done(&lhs);
|
||||||
return t;
|
return t;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: filemon_dev.c,v 1.8 2021/02/01 21:09:25 rillig Exp $ */
|
/* $NetBSD: filemon_dev.c,v 1.9 2022/03/04 23:17:16 sjg Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020 The NetBSD Foundation, Inc.
|
* Copyright (c) 2020 The NetBSD Foundation, Inc.
|
||||||
@ -46,6 +46,10 @@
|
|||||||
#define _PATH_FILEMON "/dev/filemon"
|
#define _PATH_FILEMON "/dev/filemon"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAKE_ATTR_UNUSED
|
||||||
|
#define MAKE_ATTR_UNUSED __attribute__((__unused__))
|
||||||
|
#endif
|
||||||
|
|
||||||
struct filemon {
|
struct filemon {
|
||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
@ -101,7 +105,7 @@ filemon_setfd(struct filemon *F, int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
filemon_setpid_parent(struct filemon *F, pid_t pid)
|
filemon_setpid_parent(struct filemon *F MAKE_ATTR_UNUSED, pid_t pid MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
/* Nothing to do! */
|
/* Nothing to do! */
|
||||||
}
|
}
|
||||||
@ -137,14 +141,14 @@ filemon_close(struct filemon *F)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
filemon_readfd(const struct filemon *F)
|
filemon_readfd(const struct filemon *F MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
filemon_process(struct filemon *F)
|
filemon_process(struct filemon *F MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
6
hash.c
6
hash.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: hash.c,v 1.71 2022/01/27 11:00:07 rillig Exp $ */
|
/* $NetBSD: hash.c,v 1.72 2022/02/09 21:09:24 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||||
@ -74,7 +74,7 @@
|
|||||||
#include "make.h"
|
#include "make.h"
|
||||||
|
|
||||||
/* "@(#)hash.c 8.1 (Berkeley) 6/6/93" */
|
/* "@(#)hash.c 8.1 (Berkeley) 6/6/93" */
|
||||||
MAKE_RCSID("$NetBSD: hash.c,v 1.71 2022/01/27 11:00:07 rillig Exp $");
|
MAKE_RCSID("$NetBSD: hash.c,v 1.72 2022/02/09 21:09:24 rillig Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The ratio of # entries to # buckets at which we rebuild the table to
|
* The ratio of # entries to # buckets at which we rebuild the table to
|
||||||
@ -283,7 +283,7 @@ HashTable_Set(HashTable *t, const char *key, void *value)
|
|||||||
HashEntry_Set(he, value);
|
HashEntry_Set(he, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete the entry from the table and free the associated memory. */
|
/* Delete the entry from the table, don't free the value of the entry. */
|
||||||
void
|
void
|
||||||
HashTable_DeleteEntry(HashTable *t, HashEntry *he)
|
HashTable_DeleteEntry(HashTable *t, HashEntry *he)
|
||||||
{
|
{
|
||||||
|
9
job.c
9
job.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: job.c,v 1.451 2022/02/04 23:22:19 rillig Exp $ */
|
/* $NetBSD: job.c,v 1.452 2022/02/12 11:14:48 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||||
@ -155,7 +155,7 @@
|
|||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
/* "@(#)job.c 8.2 (Berkeley) 3/19/94" */
|
/* "@(#)job.c 8.2 (Berkeley) 3/19/94" */
|
||||||
MAKE_RCSID("$NetBSD: job.c,v 1.451 2022/02/04 23:22:19 rillig Exp $");
|
MAKE_RCSID("$NetBSD: job.c,v 1.452 2022/02/12 11:14:48 rillig Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A shell defines how the commands are run. All commands for a target are
|
* A shell defines how the commands are run. All commands for a target are
|
||||||
@ -848,7 +848,7 @@ static void
|
|||||||
JobWriteSpecialsEchoCtl(Job *job, ShellWriter *wr, CommandFlags *inout_cmdFlags,
|
JobWriteSpecialsEchoCtl(Job *job, ShellWriter *wr, CommandFlags *inout_cmdFlags,
|
||||||
const char *escCmd, const char **inout_cmdTemplate)
|
const char *escCmd, const char **inout_cmdTemplate)
|
||||||
{
|
{
|
||||||
/* XXX: Why is the job modified at this point? */
|
/* XXX: Why is the whole job modified at this point? */
|
||||||
job->ignerr = true;
|
job->ignerr = true;
|
||||||
|
|
||||||
if (job->echo && inout_cmdFlags->echo) {
|
if (job->echo && inout_cmdFlags->echo) {
|
||||||
@ -860,9 +860,6 @@ JobWriteSpecialsEchoCtl(Job *job, ShellWriter *wr, CommandFlags *inout_cmdFlags,
|
|||||||
* for toggling the error checking.
|
* for toggling the error checking.
|
||||||
*/
|
*/
|
||||||
inout_cmdFlags->echo = false;
|
inout_cmdFlags->echo = false;
|
||||||
} else {
|
|
||||||
if (inout_cmdFlags->echo)
|
|
||||||
ShellWriter_EchoCmd(wr, escCmd);
|
|
||||||
}
|
}
|
||||||
*inout_cmdTemplate = shell->runIgnTmpl;
|
*inout_cmdTemplate = shell->runIgnTmpl;
|
||||||
|
|
||||||
|
6
lst.c
6
lst.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: lst.c,v 1.105 2021/03/15 16:45:30 rillig Exp $ */
|
/* $NetBSD: lst.c,v 1.106 2022/02/26 11:57:21 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
#include "make.h"
|
#include "make.h"
|
||||||
|
|
||||||
MAKE_RCSID("$NetBSD: lst.c,v 1.105 2021/03/15 16:45:30 rillig Exp $");
|
MAKE_RCSID("$NetBSD: lst.c,v 1.106 2022/02/26 11:57:21 rillig Exp $");
|
||||||
|
|
||||||
static ListNode *
|
static ListNode *
|
||||||
LstNodeNew(ListNode *prev, ListNode *next, void *datum)
|
LstNodeNew(ListNode *prev, ListNode *next, void *datum)
|
||||||
@ -163,6 +163,8 @@ Lst_Remove(List *list, ListNode *ln)
|
|||||||
list->first = ln->next;
|
list->first = ln->next;
|
||||||
if (list->last == ln)
|
if (list->last == ln)
|
||||||
list->last = ln->prev;
|
list->last = ln->prev;
|
||||||
|
|
||||||
|
free(ln);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace the datum in the given node with the new datum. */
|
/* Replace the datum in the given node with the new datum. */
|
||||||
|
6
lst.h
6
lst.h
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: lst.h,v 1.102 2021/12/15 12:24:13 rillig Exp $ */
|
/* $NetBSD: lst.h,v 1.103 2022/03/03 19:55:27 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||||
@ -142,9 +142,9 @@ ListNode *Lst_FindDatum(List *, const void *) MAKE_ATTR_USE;
|
|||||||
|
|
||||||
/* Insert a datum before the given node. */
|
/* Insert a datum before the given node. */
|
||||||
void Lst_InsertBefore(List *, ListNode *, void *);
|
void Lst_InsertBefore(List *, ListNode *, void *);
|
||||||
/* Add a datum at the front of the list. */
|
/* Add a datum at the head of the list. */
|
||||||
void Lst_Prepend(List *, void *);
|
void Lst_Prepend(List *, void *);
|
||||||
/* Add a datum at the end of the list. */
|
/* Add a datum at the tail of the list. */
|
||||||
void Lst_Append(List *, void *);
|
void Lst_Append(List *, void *);
|
||||||
/* Remove the node from the list. */
|
/* Remove the node from the list. */
|
||||||
void Lst_Remove(List *, ListNode *);
|
void Lst_Remove(List *, ListNode *);
|
||||||
|
19
main.c
19
main.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: main.c,v 1.577 2022/01/29 09:38:26 rillig Exp $ */
|
/* $NetBSD: main.c,v 1.579 2022/03/22 23:37:09 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -111,7 +111,7 @@
|
|||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
|
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
|
||||||
MAKE_RCSID("$NetBSD: main.c,v 1.577 2022/01/29 09:38:26 rillig Exp $");
|
MAKE_RCSID("$NetBSD: main.c,v 1.579 2022/03/22 23:37:09 rillig Exp $");
|
||||||
#if defined(MAKE_NATIVE) && !defined(lint)
|
#if defined(MAKE_NATIVE) && !defined(lint)
|
||||||
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
|
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
|
||||||
"The Regents of the University of California. "
|
"The Regents of the University of California. "
|
||||||
@ -318,7 +318,7 @@ MainParseArgDebug(const char *argvalue)
|
|||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
MainParseArgDebugFile(modules + 1);
|
MainParseArgDebugFile(modules + 1);
|
||||||
goto debug_setbuf;
|
goto finish;
|
||||||
default:
|
default:
|
||||||
(void)fprintf(stderr,
|
(void)fprintf(stderr,
|
||||||
"%s: illegal argument to d option -- %c\n",
|
"%s: illegal argument to d option -- %c\n",
|
||||||
@ -327,20 +327,15 @@ MainParseArgDebug(const char *argvalue)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_setbuf:
|
finish:
|
||||||
opts.debug = debug;
|
opts.debug = debug;
|
||||||
|
|
||||||
/*
|
|
||||||
* Make the debug_file unbuffered, and make
|
|
||||||
* stdout line buffered (unless debugfile == stdout).
|
|
||||||
*/
|
|
||||||
setvbuf(opts.debug_file, NULL, _IONBF, 0);
|
setvbuf(opts.debug_file, NULL, _IONBF, 0);
|
||||||
if (opts.debug_file != stdout) {
|
if (opts.debug_file != stdout)
|
||||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is path relative, or does it contain any relative component "." or ".."? */
|
/* Is path relative or does it contain any relative component "." or ".."? */
|
||||||
static bool
|
static bool
|
||||||
IsRelativePath(const char *path)
|
IsRelativePath(const char *path)
|
||||||
{
|
{
|
||||||
@ -736,7 +731,7 @@ Main_SetObjdir(bool writable, const char *fmt, ...)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((writable && access(path, W_OK) != 0) || chdir(path) != 0) {
|
if ((writable && access(path, W_OK) != 0) || chdir(path) != 0) {
|
||||||
(void)fprintf(stderr, "%s warning: %s: %s.\n",
|
(void)fprintf(stderr, "%s: warning: %s: %s.\n",
|
||||||
progname, path, strerror(errno));
|
progname, path, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
35
make.1
35
make.1
@ -1,4 +1,4 @@
|
|||||||
.\" $NetBSD: make.1,v 1.304 2022/01/29 20:54:58 sjg Exp $
|
.\" $NetBSD: make.1,v 1.307 2022/03/26 15:39:58 sjg Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1990, 1993
|
.\" Copyright (c) 1990, 1993
|
||||||
.\" The Regents of the University of California. All rights reserved.
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
@ -29,7 +29,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
||||||
.\"
|
.\"
|
||||||
.Dd January 28, 2022
|
.Dd March 24, 2022
|
||||||
.Dt MAKE 1
|
.Dt MAKE 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -692,15 +692,15 @@ Variables that are defined specific to a certain target.
|
|||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Local variables can be set on a dependency line, if
|
Local variables can be set on a dependency line, if
|
||||||
.Va .MAKE.TARGET_LOCAL_VARIABLES ,
|
.Va .MAKE.TARGET_LOCAL_VARIABLES
|
||||||
is not set to
|
is not set to
|
||||||
.Ql false .
|
.Ql false .
|
||||||
The rest of the line
|
The rest of the line
|
||||||
(which will already have had Global variables expanded),
|
(which will already have had global variables expanded)
|
||||||
is the variable value.
|
is the variable value.
|
||||||
For example:
|
For example:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
COMPILER_WRAPPERS+= ccache distcc icecc
|
COMPILER_WRAPPERS= ccache distcc icecc
|
||||||
|
|
||||||
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
||||||
.Ed
|
.Ed
|
||||||
@ -708,17 +708,17 @@ ${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
|
|||||||
Only the targets
|
Only the targets
|
||||||
.Ql ${OBJS}
|
.Ql ${OBJS}
|
||||||
will be impacted by that filter (in "meta" mode) and
|
will be impacted by that filter (in "meta" mode) and
|
||||||
simply enabling/disabling any of the wrappers will not render all
|
simply enabling/disabling any of the compiler wrappers will not render all
|
||||||
of those targets out-of-date.
|
of those targets out-of-date.
|
||||||
.Pp
|
.Pp
|
||||||
.Em NOTE :
|
.Em NOTE :
|
||||||
target local variable assignments behave differently in that;
|
target-local variable assignments behave differently in that;
|
||||||
.Bl -tag -width Ds -offset indent
|
.Bl -tag -width Ds -offset indent
|
||||||
.It Ic \&+=
|
.It Ic \&+=
|
||||||
Only appends to a previous local assignment
|
Only appends to a previous local assignment
|
||||||
for the same target and variable.
|
for the same target and variable.
|
||||||
.It Ic \&:=
|
.It Ic \&:=
|
||||||
Is redundant with respect to Global variables,
|
Is redundant with respect to global variables,
|
||||||
which have already been expanded.
|
which have already been expanded.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
@ -2290,6 +2290,25 @@ The suffix must have been previously declared with
|
|||||||
Apply the
|
Apply the
|
||||||
.Ic .PHONY
|
.Ic .PHONY
|
||||||
attribute to any specified sources.
|
attribute to any specified sources.
|
||||||
|
.It Ic .POSIX
|
||||||
|
This should be the first non-comment line in a Makefile.
|
||||||
|
It results in the variable
|
||||||
|
.Va %POSIX
|
||||||
|
being defined with the value
|
||||||
|
.Ql 1003.2 .
|
||||||
|
The first time
|
||||||
|
.Ic .POSIX
|
||||||
|
is encountered, the makefile
|
||||||
|
.Ql posix.mk
|
||||||
|
will be included if possible,
|
||||||
|
to provide POSIX compatible default rules.
|
||||||
|
If
|
||||||
|
.Nm
|
||||||
|
is run with the
|
||||||
|
.Fl r
|
||||||
|
flag, then only
|
||||||
|
.Ql posix.mk
|
||||||
|
will contribute to the default rules.
|
||||||
.It Ic .PRECIOUS
|
.It Ic .PRECIOUS
|
||||||
Apply the
|
Apply the
|
||||||
.Ic .PRECIOUS
|
.Ic .PRECIOUS
|
||||||
|
4
make.h
4
make.h
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: make.h,v 1.298 2022/02/05 00:26:21 rillig Exp $ */
|
/* $NetBSD: make.h,v 1.299 2022/03/26 14:02:40 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -141,7 +141,7 @@
|
|||||||
#define MAKE_ATTR_USE /* delete */
|
#define MAKE_ATTR_USE /* delete */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __STDC__ >= 199901L || defined(lint)
|
#if __STDC_VERSION__ >= 199901L || defined(lint)
|
||||||
#define MAKE_INLINE static inline MAKE_ATTR_UNUSED
|
#define MAKE_INLINE static inline MAKE_ATTR_UNUSED
|
||||||
#else
|
#else
|
||||||
#define MAKE_INLINE static MAKE_ATTR_UNUSED
|
#define MAKE_INLINE static MAKE_ATTR_UNUSED
|
||||||
|
13
meta.c
13
meta.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: meta.c,v 1.197 2022/02/08 22:36:02 sjg Exp $ */
|
/* $NetBSD: meta.c,v 1.199 2022/03/04 23:17:16 sjg Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Implement 'meta' mode.
|
* Implement 'meta' mode.
|
||||||
@ -675,7 +675,7 @@ meta_job_start(Job *job, GNode *gn)
|
|||||||
* It does not disturb our state.
|
* It does not disturb our state.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_job_child(Job *job)
|
meta_job_child(Job *job MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
#ifdef USE_FILEMON
|
#ifdef USE_FILEMON
|
||||||
BuildMon *pbm;
|
BuildMon *pbm;
|
||||||
@ -700,7 +700,7 @@ meta_job_child(Job *job)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_job_parent(Job *job, pid_t pid)
|
meta_job_parent(Job *job MAKE_ATTR_UNUSED, pid_t pid MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
|
#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
|
||||||
BuildMon *pbm;
|
BuildMon *pbm;
|
||||||
@ -717,7 +717,7 @@ meta_job_parent(Job *job, pid_t pid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
meta_job_fd(Job *job)
|
meta_job_fd(Job *job MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
|
#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
|
||||||
BuildMon *pbm;
|
BuildMon *pbm;
|
||||||
@ -735,7 +735,7 @@ meta_job_fd(Job *job)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
meta_job_event(Job *job)
|
meta_job_event(Job *job MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
|
#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
|
||||||
BuildMon *pbm;
|
BuildMon *pbm;
|
||||||
@ -1167,8 +1167,7 @@ meta_oodate(GNode *gn, bool oodate)
|
|||||||
/* we want to track all the .meta we read */
|
/* we want to track all the .meta we read */
|
||||||
Global_Append(".MAKE.META.FILES", fname);
|
Global_Append(".MAKE.META.FILES", fname);
|
||||||
|
|
||||||
cmp_filter = metaCmpFilter ? metaCmpFilter :
|
cmp_filter = metaCmpFilter || Var_Exists(gn, MAKE_META_CMP_FILTER);
|
||||||
Var_Exists(gn, MAKE_META_CMP_FILTER);
|
|
||||||
|
|
||||||
cmdNode = gn->commands.first;
|
cmdNode = gn->commands.first;
|
||||||
while (!oodate && (x = fgetLine(&buf, &bufsz, 0, fp)) > 0) {
|
while (!oodate && (x = fgetLine(&buf, &bufsz, 0, fp)) > 0) {
|
||||||
|
23
mk/ChangeLog
23
mk/ChangeLog
@ -1,3 +1,26 @@
|
|||||||
|
2022-03-25 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* install-mk (MK_VERSION): 20220323
|
||||||
|
* posix.mk: default rules for .POSIX:
|
||||||
|
|
||||||
|
2022-03-17 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* sys/*.mk: remove l from ARFLAGS
|
||||||
|
|
||||||
|
2022-03-14 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* install-mk (MK_VERSION): 20220314
|
||||||
|
|
||||||
|
* dirdeps-options.mk: allow options to be per RELDIR
|
||||||
|
try DIRDEPS_OPTIONS_QUALIFIER_LIST first prefixed
|
||||||
|
with ${DEP_RELDIR}.
|
||||||
|
|
||||||
|
2022-02-14 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
|
* install-mk (MK_VERSION): 20220214
|
||||||
|
|
||||||
|
* cc-wrap.mk: fix :@ modifier
|
||||||
|
|
||||||
2022-02-06 Simon J Gerraty <sjg@beast.crufty.net>
|
2022-02-06 Simon J Gerraty <sjg@beast.crufty.net>
|
||||||
|
|
||||||
* install-mk (MK_VERSION): 20220206
|
* install-mk (MK_VERSION): 20220206
|
||||||
|
1
mk/FILES
1
mk/FILES
@ -33,6 +33,7 @@ nls.mk
|
|||||||
obj.mk
|
obj.mk
|
||||||
options.mk
|
options.mk
|
||||||
own.mk
|
own.mk
|
||||||
|
posix.mk
|
||||||
prlist.mk
|
prlist.mk
|
||||||
prog.mk
|
prog.mk
|
||||||
progs.mk
|
progs.mk
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: cc-wrap.mk,v 1.5 2022/02/07 19:02:55 sjg Exp $
|
# $Id: cc-wrap.mk,v 1.6 2022/02/16 17:41:52 sjg Exp $
|
||||||
#
|
#
|
||||||
# @(#) Copyright (c) 2022, Simon J. Gerraty
|
# @(#) Copyright (c) 2022, Simon J. Gerraty
|
||||||
#
|
#
|
||||||
@ -41,7 +41,7 @@ ${w:tu} ?= $w
|
|||||||
|
|
||||||
# we do not want to make all these targets out-of-date
|
# we do not want to make all these targets out-of-date
|
||||||
# just because one of the above wrappers are enabled/disabled
|
# just because one of the above wrappers are enabled/disabled
|
||||||
${CC_WRAP_TARGETS}: .MAKE.META.CMP_FILTER = ${CC_WRAPPERS:tu@W@${$W}@:S,^,N,}
|
${CC_WRAP_TARGETS}: .MAKE.META.CMP_FILTER = ${CC_WRAPPERS:tu:@W@${$W}@:S,^,N,}
|
||||||
|
|
||||||
# some object src types we should not wrap
|
# some object src types we should not wrap
|
||||||
CC_WRAP_SKIP_EXTS += s
|
CC_WRAP_SKIP_EXTS += s
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# $Id: dirdeps-options.mk,v 1.18 2020/12/22 18:10:34 sjg Exp $
|
# $Id: dirdeps-options.mk,v 1.20 2022/03/17 20:11:36 sjg Exp $
|
||||||
#
|
#
|
||||||
# @(#) Copyright (c) 2018-2020, Simon J. Gerraty
|
# @(#) Copyright (c) 2018-2022, Simon J. Gerraty
|
||||||
#
|
#
|
||||||
# This file is provided in the hope that it will
|
# This file is provided in the hope that it will
|
||||||
# be of use. There is absolutely NO WARRANTY.
|
# be of use. There is absolutely NO WARRANTY.
|
||||||
@ -54,6 +54,7 @@ DIRDEPS_OPTIONS ?=
|
|||||||
# :U below avoids potential errors when we :=
|
# :U below avoids potential errors when we :=
|
||||||
# some options can depend on TARGET_SPEC!
|
# some options can depend on TARGET_SPEC!
|
||||||
DIRDEPS_OPTIONS_QUALIFIER_LIST ?= \
|
DIRDEPS_OPTIONS_QUALIFIER_LIST ?= \
|
||||||
|
${DEP_RELDIR} \
|
||||||
${DEP_TARGET_SPEC:U${TARGET_SPEC}} \
|
${DEP_TARGET_SPEC:U${TARGET_SPEC}} \
|
||||||
${TARGET_SPEC_VARSr:U${TARGET_SPEC_VARS}:@v@${DEP_$v:U${$v}}@}
|
${TARGET_SPEC_VARSr:U${TARGET_SPEC_VARS}:@v@${DEP_$v:U${$v}}@}
|
||||||
# note that we need to include $o in the variable _o$o
|
# note that we need to include $o in the variable _o$o
|
||||||
@ -61,7 +62,9 @@ DIRDEPS_OPTIONS_QUALIFIER_LIST ?= \
|
|||||||
.for o in ${DIRDEPS_OPTIONS}
|
.for o in ${DIRDEPS_OPTIONS}
|
||||||
.undef _o$o
|
.undef _o$o
|
||||||
.undef _v$o
|
.undef _v$o
|
||||||
.for x in ${DIRDEPS_OPTIONS_QUALIFIER_LIST}
|
.for x in ${DIRDEPS_OPTIONS_QUALIFIER_LIST:S,^,${DEP_RELDIR}.,} \
|
||||||
|
${DIRDEPS_OPTIONS_QUALIFIER_LIST}
|
||||||
|
#.info MK_$o.$x=${MK_$o.$x:Uundefined}
|
||||||
.if defined(MK_$o.$x)
|
.if defined(MK_$o.$x)
|
||||||
_o$o ?= MK_$o.$x
|
_o$o ?= MK_$o.$x
|
||||||
_v$o ?= ${MK_$o.$x}
|
_v$o ?= ${MK_$o.$x}
|
||||||
|
4
mk/install-mk
Executable file → Normal file
4
mk/install-mk
Executable file → Normal file
@ -55,7 +55,7 @@
|
|||||||
# Simon J. Gerraty <sjg@crufty.net>
|
# Simon J. Gerraty <sjg@crufty.net>
|
||||||
|
|
||||||
# RCSid:
|
# RCSid:
|
||||||
# $Id: install-mk,v 1.214 2022/02/07 19:02:55 sjg Exp $
|
# $Id: install-mk,v 1.217 2022/03/25 23:43:43 sjg Exp $
|
||||||
#
|
#
|
||||||
# @(#) Copyright (c) 1994 Simon J. Gerraty
|
# @(#) Copyright (c) 1994 Simon J. Gerraty
|
||||||
#
|
#
|
||||||
@ -70,7 +70,7 @@
|
|||||||
# sjg@crufty.net
|
# sjg@crufty.net
|
||||||
#
|
#
|
||||||
|
|
||||||
MK_VERSION=20220206
|
MK_VERSION=20220323
|
||||||
OWNER=
|
OWNER=
|
||||||
GROUP=
|
GROUP=
|
||||||
MODE=444
|
MODE=444
|
||||||
|
104
mk/posix.mk
Normal file
104
mk/posix.mk
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# $Id: posix.mk,v 1.2 2022/03/25 23:55:37 sjg Exp $
|
||||||
|
#
|
||||||
|
# @(#) Copyright (c) 2022, Simon J. Gerraty
|
||||||
|
#
|
||||||
|
# This file is provided in the hope that it will
|
||||||
|
# be of use. There is absolutely NO WARRANTY.
|
||||||
|
# Permission to copy, redistribute or otherwise
|
||||||
|
# use this file is hereby granted provided that
|
||||||
|
# the above copyright notice and this notice are
|
||||||
|
# left intact.
|
||||||
|
#
|
||||||
|
# Please send copies of changes and bug-fixes to:
|
||||||
|
# sjg@crufty.net
|
||||||
|
#
|
||||||
|
|
||||||
|
# The minimal set of rules required by POSIX
|
||||||
|
|
||||||
|
.if !defined(%POSIX)
|
||||||
|
.error ${.newline}Do not inlcude this directly, put .POSIX: at start of Makefile
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.if ${.MAKEFLAGS:M-r} == ""
|
||||||
|
# undo some work done by sys.mk
|
||||||
|
.SUFFIXES:
|
||||||
|
.undef ARFLAGS
|
||||||
|
.undef CC CFLAGS
|
||||||
|
.undef FC FFLAGS
|
||||||
|
.undef LDFLAGS LFLAGS
|
||||||
|
.undef RANLIBFLAGS
|
||||||
|
.undef YFLAGS
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.SUFFIXES: .o .c .y .l .a .sh .f
|
||||||
|
|
||||||
|
# these can still be set via environment
|
||||||
|
AR ?= ar
|
||||||
|
ARFLAGS ?= -rv
|
||||||
|
CC ?= c99
|
||||||
|
CFLAGS ?= -O
|
||||||
|
FC ?= fort77
|
||||||
|
FFLAGS ?= -O 1
|
||||||
|
LDFLAGS ?=
|
||||||
|
LEX ?= lex
|
||||||
|
LFLAGS ?=
|
||||||
|
RANLIBFLAGS ?= -D
|
||||||
|
YACC ?= yacc
|
||||||
|
YFLAGS ?=
|
||||||
|
|
||||||
|
.c:
|
||||||
|
${CC} ${CFLAGS} ${LDFLAGS} -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
|
.f:
|
||||||
|
${FC} ${FFLAGS} ${LDFLAGS} -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
|
.sh:
|
||||||
|
cp $< $@
|
||||||
|
chmod a+x $@
|
||||||
|
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
${CC} ${CFLAGS} -c $<
|
||||||
|
|
||||||
|
|
||||||
|
.f.o:
|
||||||
|
${FC} ${FFLAGS} -c $<
|
||||||
|
|
||||||
|
|
||||||
|
.y.o:
|
||||||
|
${YACC} ${YFLAGS} $<
|
||||||
|
${CC} ${CFLAGS} -c y.tab.c
|
||||||
|
rm -f y.tab.c
|
||||||
|
mv y.tab.o $@
|
||||||
|
|
||||||
|
|
||||||
|
.l.o:
|
||||||
|
${LEX} ${LFLAGS} $<
|
||||||
|
${CC} ${CFLAGS} -c lex.yy.c
|
||||||
|
rm -f lex.yy.c
|
||||||
|
mv lex.yy.o $@
|
||||||
|
|
||||||
|
|
||||||
|
.y.c:
|
||||||
|
${YACC} ${YFLAGS} $<
|
||||||
|
mv y.tab.c $@
|
||||||
|
|
||||||
|
|
||||||
|
.l.c:
|
||||||
|
${LEX} ${LFLAGS} $<
|
||||||
|
mv lex.yy.c $@
|
||||||
|
|
||||||
|
|
||||||
|
.c.a:
|
||||||
|
${CC} -c ${CFLAGS} $<
|
||||||
|
${AR} ${ARFLAGS} $@ $*.o
|
||||||
|
rm -f $*.o
|
||||||
|
|
||||||
|
|
||||||
|
.f.a:
|
||||||
|
${FC} -c ${FFLAGS} $<
|
||||||
|
${AR} ${ARFLAGS} $@ $*.o
|
||||||
|
rm -f $*.o
|
||||||
|
|
@ -14,7 +14,7 @@ NOPIC ?=no # no shared libs?
|
|||||||
.LIBS: .a
|
.LIBS: .a
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= ranlib
|
RANLIB ?= ranlib
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -182,3 +182,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -14,7 +14,7 @@ HOST_LIBEXT ?= .dylib
|
|||||||
DSHLIBEXT ?= .dylib
|
DSHLIBEXT ?= .dylib
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB =
|
RANLIB =
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -220,3 +220,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: Generic.mk,v 1.17 2020/08/19 17:51:53 sjg Exp $
|
# $Id: Generic.mk,v 1.19 2022/03/25 23:43:06 sjg Exp $
|
||||||
#
|
#
|
||||||
|
|
||||||
# some reasonable defaults
|
# some reasonable defaults
|
||||||
@ -27,7 +27,7 @@ MACHINE_ARCH = ${MACHINE_ARCH.${MACHINE}}
|
|||||||
TSORT += -q
|
TSORT += -q
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
AFLAGS ?=
|
AFLAGS ?=
|
||||||
@ -201,4 +201,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: HP-UX.mk,v 1.15 2020/08/19 17:51:53 sjg Exp $
|
# $Id: HP-UX.mk,v 1.17 2022/03/25 23:43:06 sjg Exp $
|
||||||
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
||||||
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ LDADD+= /usr/lib/end.o
|
|||||||
.endif
|
.endif
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= :
|
RANLIB ?= :
|
||||||
|
|
||||||
AFLAGS=
|
AFLAGS=
|
||||||
@ -224,3 +224,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -16,7 +16,7 @@ unix ?= We run ${OS}.
|
|||||||
.LIBS: .a
|
.LIBS: .a
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= ranlib
|
RANLIB ?= ranlib
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -193,3 +193,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: Linux.mk,v 1.13 2020/08/19 17:51:53 sjg Exp $
|
# $Id: Linux.mk,v 1.15 2022/03/25 23:43:06 sjg Exp $
|
||||||
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
||||||
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ NEED_SOLINKS ?=yes
|
|||||||
.LIBS: .a
|
.LIBS: .a
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= ranlib
|
RANLIB ?= ranlib
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -185,3 +185,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -25,7 +25,7 @@ MAKE_VERSION ?= 20010606
|
|||||||
.LIBS: .a
|
.LIBS: .a
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= ranlib
|
RANLIB ?= ranlib
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -228,3 +228,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: OSF1.mk,v 1.12 2020/08/19 17:51:53 sjg Exp $
|
# $Id: OSF1.mk,v 1.14 2022/03/25 23:43:06 sjg Exp $
|
||||||
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
||||||
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ LD_X=
|
|||||||
LD_x ?= -x
|
LD_x ?= -x
|
||||||
LD_r ?= -r
|
LD_r ?= -r
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= ranlib
|
RANLIB ?= ranlib
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -196,3 +196,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -16,7 +16,7 @@ MACHINE_ARCH ?= ${MACHINE_ARCH.${MACHINE}}
|
|||||||
.endif
|
.endif
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= ranlib
|
RANLIB ?= ranlib
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -203,3 +203,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: SunOS.mk,v 1.12 2020/08/19 17:51:53 sjg Exp $
|
# $Id: SunOS.mk,v 1.14 2022/03/25 23:43:06 sjg Exp $
|
||||||
|
|
||||||
.if ${.PARSEFILE} == "sys.mk"
|
.if ${.PARSEFILE} == "sys.mk"
|
||||||
.include <host-target.mk>
|
.include <host-target.mk>
|
||||||
@ -46,7 +46,7 @@ CPP ?= cpp
|
|||||||
.LIBS: .a
|
.LIBS: .a
|
||||||
|
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
AS_STDIN ?= -
|
AS_STDIN ?= -
|
||||||
@ -217,3 +217,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Id: UnixWare.mk,v 1.8 2021/10/13 16:45:52 sjg Exp $
|
# $Id: UnixWare.mk,v 1.10 2022/03/25 23:43:06 sjg Exp $
|
||||||
# based on "Id: SunOS.5.sys.mk,v 1.6 2003/09/30 16:42:23 sjg Exp "
|
# based on "Id: SunOS.5.sys.mk,v 1.6 2003/09/30 16:42:23 sjg Exp "
|
||||||
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
# $NetBSD: sys.mk,v 1.19.2.1 1994/07/26 19:58:31 cgd Exp $
|
||||||
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
# @(#)sys.mk 5.11 (Berkeley) 3/13/91
|
||||||
@ -22,7 +22,7 @@ PATH ?= /usr/sbin:/usr/bin:/usr/ccs/bin:/usr/ccs/lib:/usr/ucb:${DEV_TOOLS_PREFIX
|
|||||||
LD_X=
|
LD_X=
|
||||||
LD_x=
|
LD_x=
|
||||||
AR ?= ar
|
AR ?= ar
|
||||||
ARFLAGS ?= rl
|
ARFLAGS ?= r
|
||||||
RANLIB ?= :
|
RANLIB ?= :
|
||||||
|
|
||||||
AS ?= as
|
AS ?= as
|
||||||
@ -245,3 +245,4 @@ ${CXX_SUFFIXES:%=%.a}:
|
|||||||
.sh:
|
.sh:
|
||||||
rm -f ${.TARGET}
|
rm -f ${.TARGET}
|
||||||
cp ${.IMPSRC} ${.TARGET}
|
cp ${.IMPSRC} ${.TARGET}
|
||||||
|
chmod a+x ${.TARGET}
|
||||||
|
288
parse.c
288
parse.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: parse.c,v 1.663 2022/02/07 23:24:26 rillig Exp $ */
|
/* $NetBSD: parse.c,v 1.668 2022/03/25 21:16:04 sjg Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -121,7 +121,7 @@
|
|||||||
#include "pathnames.h"
|
#include "pathnames.h"
|
||||||
|
|
||||||
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
|
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
|
||||||
MAKE_RCSID("$NetBSD: parse.c,v 1.663 2022/02/07 23:24:26 rillig Exp $");
|
MAKE_RCSID("$NetBSD: parse.c,v 1.668 2022/03/25 21:16:04 sjg Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A file being read.
|
* A file being read.
|
||||||
@ -139,7 +139,7 @@ typedef struct IncludedFile {
|
|||||||
bool depending; /* state of doing_depend on EOF */
|
bool depending; /* state of doing_depend on EOF */
|
||||||
|
|
||||||
Buffer buf; /* the file's content or the body of the .for
|
Buffer buf; /* the file's content or the body of the .for
|
||||||
* loop; always ends with '\n' */
|
* loop; either empty or ends with '\n' */
|
||||||
char *buf_ptr; /* next char to be read */
|
char *buf_ptr; /* next char to be read */
|
||||||
char *buf_end; /* buf_end[-1] == '\n' */
|
char *buf_end; /* buf_end[-1] == '\n' */
|
||||||
|
|
||||||
@ -479,7 +479,7 @@ PrintLocation(FILE *f, bool useVars, const char *fname, unsigned lineno)
|
|||||||
|
|
||||||
static void MAKE_ATTR_PRINTFLIKE(6, 0)
|
static void MAKE_ATTR_PRINTFLIKE(6, 0)
|
||||||
ParseVErrorInternal(FILE *f, bool useVars, const char *fname, unsigned lineno,
|
ParseVErrorInternal(FILE *f, bool useVars, const char *fname, unsigned lineno,
|
||||||
ParseErrorLevel type, const char *fmt, va_list ap)
|
ParseErrorLevel level, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
static bool fatal_warning_error_printed = false;
|
static bool fatal_warning_error_printed = false;
|
||||||
|
|
||||||
@ -487,15 +487,15 @@ ParseVErrorInternal(FILE *f, bool useVars, const char *fname, unsigned lineno,
|
|||||||
|
|
||||||
if (fname != NULL)
|
if (fname != NULL)
|
||||||
PrintLocation(f, useVars, fname, lineno);
|
PrintLocation(f, useVars, fname, lineno);
|
||||||
if (type == PARSE_WARNING)
|
if (level == PARSE_WARNING)
|
||||||
(void)fprintf(f, "warning: ");
|
(void)fprintf(f, "warning: ");
|
||||||
(void)vfprintf(f, fmt, ap);
|
(void)vfprintf(f, fmt, ap);
|
||||||
(void)fprintf(f, "\n");
|
(void)fprintf(f, "\n");
|
||||||
(void)fflush(f);
|
(void)fflush(f);
|
||||||
|
|
||||||
if (type == PARSE_FATAL)
|
if (level == PARSE_FATAL)
|
||||||
parseErrors++;
|
parseErrors++;
|
||||||
if (type == PARSE_WARNING && opts.parseWarnFatal) {
|
if (level == PARSE_WARNING && opts.parseWarnFatal) {
|
||||||
if (!fatal_warning_error_printed) {
|
if (!fatal_warning_error_printed) {
|
||||||
Error("parsing warnings being treated as errors");
|
Error("parsing warnings being treated as errors");
|
||||||
fatal_warning_error_printed = true;
|
fatal_warning_error_printed = true;
|
||||||
@ -509,19 +509,19 @@ ParseVErrorInternal(FILE *f, bool useVars, const char *fname, unsigned lineno,
|
|||||||
|
|
||||||
static void MAKE_ATTR_PRINTFLIKE(4, 5)
|
static void MAKE_ATTR_PRINTFLIKE(4, 5)
|
||||||
ParseErrorInternal(const char *fname, unsigned lineno,
|
ParseErrorInternal(const char *fname, unsigned lineno,
|
||||||
ParseErrorLevel type, const char *fmt, ...)
|
ParseErrorLevel level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
(void)fflush(stdout);
|
(void)fflush(stdout);
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
ParseVErrorInternal(stderr, false, fname, lineno, type, fmt, ap);
|
ParseVErrorInternal(stderr, false, fname, lineno, level, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if (opts.debug_file != stdout && opts.debug_file != stderr) {
|
if (opts.debug_file != stdout && opts.debug_file != stderr) {
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
ParseVErrorInternal(opts.debug_file, false, fname, lineno,
|
ParseVErrorInternal(opts.debug_file, false, fname, lineno,
|
||||||
type, fmt, ap);
|
level, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -535,7 +535,7 @@ ParseErrorInternal(const char *fname, unsigned lineno,
|
|||||||
* Fmt is given without a trailing newline.
|
* Fmt is given without a trailing newline.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Parse_Error(ParseErrorLevel type, const char *fmt, ...)
|
Parse_Error(ParseErrorLevel level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
const char *fname;
|
const char *fname;
|
||||||
@ -552,13 +552,13 @@ Parse_Error(ParseErrorLevel type, const char *fmt, ...)
|
|||||||
|
|
||||||
(void)fflush(stdout);
|
(void)fflush(stdout);
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
ParseVErrorInternal(stderr, true, fname, lineno, type, fmt, ap);
|
ParseVErrorInternal(stderr, true, fname, lineno, level, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if (opts.debug_file != stdout && opts.debug_file != stderr) {
|
if (opts.debug_file != stdout && opts.debug_file != stderr) {
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
ParseVErrorInternal(opts.debug_file, true, fname, lineno,
|
ParseVErrorInternal(opts.debug_file, true, fname, lineno,
|
||||||
type, fmt, ap);
|
level, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -768,14 +768,15 @@ ApplyDependencySourceMain(const char *src)
|
|||||||
Global_Append(".TARGETS", src);
|
Global_Append(".TARGETS", src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For the sources of a .ORDER target, create predecessor/successor links
|
||||||
|
* between the previous source and the current one.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
ApplyDependencySourceOrder(const char *src)
|
ApplyDependencySourceOrder(const char *src)
|
||||||
{
|
{
|
||||||
GNode *gn;
|
GNode *gn;
|
||||||
/*
|
|
||||||
* Create proper predecessor/successor links between the previous
|
|
||||||
* source and the current one.
|
|
||||||
*/
|
|
||||||
gn = Targ_GetNode(src);
|
gn = Targ_GetNode(src);
|
||||||
if (doing_depend)
|
if (doing_depend)
|
||||||
RememberLocation(gn);
|
RememberLocation(gn);
|
||||||
@ -861,7 +862,6 @@ static void
|
|||||||
InvalidLineType(const char *line)
|
InvalidLineType(const char *line)
|
||||||
{
|
{
|
||||||
if (strncmp(line, "<<<<<<", 6) == 0 ||
|
if (strncmp(line, "<<<<<<", 6) == 0 ||
|
||||||
strncmp(line, "======", 6) == 0 ||
|
|
||||||
strncmp(line, ">>>>>>", 6) == 0)
|
strncmp(line, ">>>>>>", 6) == 0)
|
||||||
Parse_Error(PARSE_FATAL,
|
Parse_Error(PARSE_FATAL,
|
||||||
"Makefile appears to contain unresolved CVS/RCS/??? merge conflicts");
|
"Makefile appears to contain unresolved CVS/RCS/??? merge conflicts");
|
||||||
@ -1093,9 +1093,7 @@ CheckSpecialMundaneMixture(ParseSpecial special)
|
|||||||
* shouldn't be empty.
|
* shouldn't be empty.
|
||||||
*/
|
*/
|
||||||
case SP_NOT:
|
case SP_NOT:
|
||||||
/*
|
/* Nothing special here -- targets may be empty. */
|
||||||
* Nothing special here -- targets can be empty if it wants.
|
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Parse_Error(PARSE_WARNING,
|
Parse_Error(PARSE_WARNING,
|
||||||
@ -1132,6 +1130,121 @@ ClearPaths(SearchPathList *paths)
|
|||||||
Dir_SetPATH();
|
Dir_SetPATH();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle one of the .[-ds]include directives by remembering the current file
|
||||||
|
* and pushing the included file on the stack. After the included file has
|
||||||
|
* finished, parsing continues with the including file; see Parse_PushInput
|
||||||
|
* and ParseEOF.
|
||||||
|
*
|
||||||
|
* System includes are looked up in sysIncPath, any other includes are looked
|
||||||
|
* up in the parsedir and then in the directories specified by the -I command
|
||||||
|
* line options.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
IncludeFile(const char *file, bool isSystem, bool depinc, bool silent)
|
||||||
|
{
|
||||||
|
Buffer buf;
|
||||||
|
char *fullname; /* full pathname of file */
|
||||||
|
char *newName;
|
||||||
|
char *slash, *incdir;
|
||||||
|
int fd;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fullname = file[0] == '/' ? bmake_strdup(file) : NULL;
|
||||||
|
|
||||||
|
if (fullname == NULL && !isSystem) {
|
||||||
|
/*
|
||||||
|
* Include files contained in double-quotes are first searched
|
||||||
|
* relative to the including file's location. We don't want to
|
||||||
|
* cd there, of course, so we just tack on the old file's
|
||||||
|
* leading path components and call Dir_FindFile to see if
|
||||||
|
* we can locate the file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
incdir = bmake_strdup(CurFile()->name.str);
|
||||||
|
slash = strrchr(incdir, '/');
|
||||||
|
if (slash != NULL) {
|
||||||
|
*slash = '\0';
|
||||||
|
/*
|
||||||
|
* Now do lexical processing of leading "../" on the
|
||||||
|
* filename.
|
||||||
|
*/
|
||||||
|
for (i = 0; strncmp(file + i, "../", 3) == 0; i += 3) {
|
||||||
|
slash = strrchr(incdir + 1, '/');
|
||||||
|
if (slash == NULL || strcmp(slash, "/..") == 0)
|
||||||
|
break;
|
||||||
|
*slash = '\0';
|
||||||
|
}
|
||||||
|
newName = str_concat3(incdir, "/", file + i);
|
||||||
|
fullname = Dir_FindFile(newName, parseIncPath);
|
||||||
|
if (fullname == NULL)
|
||||||
|
fullname = Dir_FindFile(newName,
|
||||||
|
&dirSearchPath);
|
||||||
|
free(newName);
|
||||||
|
}
|
||||||
|
free(incdir);
|
||||||
|
|
||||||
|
if (fullname == NULL) {
|
||||||
|
/*
|
||||||
|
* Makefile wasn't found in same directory as included
|
||||||
|
* makefile.
|
||||||
|
*
|
||||||
|
* Search for it first on the -I search path, then on
|
||||||
|
* the .PATH search path, if not found in a -I
|
||||||
|
* directory. If we have a suffix-specific path, we
|
||||||
|
* should use that.
|
||||||
|
*/
|
||||||
|
const char *suff;
|
||||||
|
SearchPath *suffPath = NULL;
|
||||||
|
|
||||||
|
if ((suff = strrchr(file, '.')) != NULL) {
|
||||||
|
suffPath = Suff_GetPath(suff);
|
||||||
|
if (suffPath != NULL)
|
||||||
|
fullname = Dir_FindFile(file, suffPath);
|
||||||
|
}
|
||||||
|
if (fullname == NULL) {
|
||||||
|
fullname = Dir_FindFile(file, parseIncPath);
|
||||||
|
if (fullname == NULL)
|
||||||
|
fullname = Dir_FindFile(file,
|
||||||
|
&dirSearchPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Looking for a system file or file still not found */
|
||||||
|
if (fullname == NULL) {
|
||||||
|
/*
|
||||||
|
* Look for it on the system path
|
||||||
|
*/
|
||||||
|
SearchPath *path = Lst_IsEmpty(&sysIncPath->dirs)
|
||||||
|
? defSysIncPath : sysIncPath;
|
||||||
|
fullname = Dir_FindFile(file, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fullname == NULL) {
|
||||||
|
if (!silent)
|
||||||
|
Parse_Error(PARSE_FATAL, "Could not find %s", file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Actually open the file... */
|
||||||
|
fd = open(fullname, O_RDONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
if (!silent)
|
||||||
|
Parse_Error(PARSE_FATAL, "Cannot open %s", fullname);
|
||||||
|
free(fullname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = loadfile(fullname, fd);
|
||||||
|
(void)close(fd);
|
||||||
|
|
||||||
|
Parse_PushInput(fullname, 1, 0, buf, NULL);
|
||||||
|
if (depinc)
|
||||||
|
doing_depend = depinc; /* only turn it on */
|
||||||
|
free(fullname);
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle a "dependency" line like '.SPECIAL:' without any sources. */
|
/* Handle a "dependency" line like '.SPECIAL:' without any sources. */
|
||||||
static void
|
static void
|
||||||
HandleDependencySourcesEmpty(ParseSpecial special, SearchPathList *paths)
|
HandleDependencySourcesEmpty(ParseSpecial special, SearchPathList *paths)
|
||||||
@ -1155,6 +1268,23 @@ HandleDependencySourcesEmpty(ParseSpecial special, SearchPathList *paths)
|
|||||||
#ifdef POSIX
|
#ifdef POSIX
|
||||||
case SP_POSIX:
|
case SP_POSIX:
|
||||||
Global_Set("%POSIX", "1003.2");
|
Global_Set("%POSIX", "1003.2");
|
||||||
|
{
|
||||||
|
static bool first_posix = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since .POSIX: should be the first
|
||||||
|
* operative line in a makefile,
|
||||||
|
* if '-r' flag is used, no default rules have
|
||||||
|
* been read yet, in which case 'posix.mk' can
|
||||||
|
* be a substiute for 'sys.mk'.
|
||||||
|
* If '-r' is not used, then 'posix.mk' acts
|
||||||
|
* as an extension of 'sys.mk'.
|
||||||
|
*/
|
||||||
|
if (first_posix) {
|
||||||
|
first_posix = false;
|
||||||
|
IncludeFile("posix.mk", true, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
@ -1556,7 +1686,7 @@ Parse_IsVar(const char *p, VarAssign *out_var)
|
|||||||
cpp_skip_hspace(&p); /* Skip to variable name */
|
cpp_skip_hspace(&p); /* Skip to variable name */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* During parsing, the '+' of the '+=' operator is initially parsed
|
* During parsing, the '+' of the operator '+=' is initially parsed
|
||||||
* as part of the variable name. It is later corrected, as is the
|
* as part of the variable name. It is later corrected, as is the
|
||||||
* ':sh' modifier. Of these two (nameEnd and eq), the earlier one
|
* ':sh' modifier. Of these two (nameEnd and eq), the earlier one
|
||||||
* determines the actual end of the variable name.
|
* determines the actual end of the variable name.
|
||||||
@ -1840,120 +1970,6 @@ Parse_AddIncludeDir(const char *dir)
|
|||||||
(void)SearchPath_Add(parseIncPath, dir);
|
(void)SearchPath_Add(parseIncPath, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle one of the .[-ds]include directives by remembering the current file
|
|
||||||
* and pushing the included file on the stack. After the included file has
|
|
||||||
* finished, parsing continues with the including file; see Parse_PushInput
|
|
||||||
* and ParseEOF.
|
|
||||||
*
|
|
||||||
* System includes are looked up in sysIncPath, any other includes are looked
|
|
||||||
* up in the parsedir and then in the directories specified by the -I command
|
|
||||||
* line options.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
IncludeFile(const char *file, bool isSystem, bool depinc, bool silent)
|
|
||||||
{
|
|
||||||
Buffer buf;
|
|
||||||
char *fullname; /* full pathname of file */
|
|
||||||
char *newName;
|
|
||||||
char *slash, *incdir;
|
|
||||||
int fd;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
fullname = file[0] == '/' ? bmake_strdup(file) : NULL;
|
|
||||||
|
|
||||||
if (fullname == NULL && !isSystem) {
|
|
||||||
/*
|
|
||||||
* Include files contained in double-quotes are first searched
|
|
||||||
* relative to the including file's location. We don't want to
|
|
||||||
* cd there, of course, so we just tack on the old file's
|
|
||||||
* leading path components and call Dir_FindFile to see if
|
|
||||||
* we can locate the file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
incdir = bmake_strdup(CurFile()->name.str);
|
|
||||||
slash = strrchr(incdir, '/');
|
|
||||||
if (slash != NULL) {
|
|
||||||
*slash = '\0';
|
|
||||||
/*
|
|
||||||
* Now do lexical processing of leading "../" on the
|
|
||||||
* filename.
|
|
||||||
*/
|
|
||||||
for (i = 0; strncmp(file + i, "../", 3) == 0; i += 3) {
|
|
||||||
slash = strrchr(incdir + 1, '/');
|
|
||||||
if (slash == NULL || strcmp(slash, "/..") == 0)
|
|
||||||
break;
|
|
||||||
*slash = '\0';
|
|
||||||
}
|
|
||||||
newName = str_concat3(incdir, "/", file + i);
|
|
||||||
fullname = Dir_FindFile(newName, parseIncPath);
|
|
||||||
if (fullname == NULL)
|
|
||||||
fullname = Dir_FindFile(newName,
|
|
||||||
&dirSearchPath);
|
|
||||||
free(newName);
|
|
||||||
}
|
|
||||||
free(incdir);
|
|
||||||
|
|
||||||
if (fullname == NULL) {
|
|
||||||
/*
|
|
||||||
* Makefile wasn't found in same directory as included
|
|
||||||
* makefile.
|
|
||||||
*
|
|
||||||
* Search for it first on the -I search path, then on
|
|
||||||
* the .PATH search path, if not found in a -I
|
|
||||||
* directory. If we have a suffix-specific path, we
|
|
||||||
* should use that.
|
|
||||||
*/
|
|
||||||
const char *suff;
|
|
||||||
SearchPath *suffPath = NULL;
|
|
||||||
|
|
||||||
if ((suff = strrchr(file, '.')) != NULL) {
|
|
||||||
suffPath = Suff_GetPath(suff);
|
|
||||||
if (suffPath != NULL)
|
|
||||||
fullname = Dir_FindFile(file, suffPath);
|
|
||||||
}
|
|
||||||
if (fullname == NULL) {
|
|
||||||
fullname = Dir_FindFile(file, parseIncPath);
|
|
||||||
if (fullname == NULL)
|
|
||||||
fullname = Dir_FindFile(file,
|
|
||||||
&dirSearchPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Looking for a system file or file still not found */
|
|
||||||
if (fullname == NULL) {
|
|
||||||
/*
|
|
||||||
* Look for it on the system path
|
|
||||||
*/
|
|
||||||
SearchPath *path = Lst_IsEmpty(&sysIncPath->dirs)
|
|
||||||
? defSysIncPath : sysIncPath;
|
|
||||||
fullname = Dir_FindFile(file, path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fullname == NULL) {
|
|
||||||
if (!silent)
|
|
||||||
Parse_Error(PARSE_FATAL, "Could not find %s", file);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Actually open the file... */
|
|
||||||
fd = open(fullname, O_RDONLY);
|
|
||||||
if (fd == -1) {
|
|
||||||
if (!silent)
|
|
||||||
Parse_Error(PARSE_FATAL, "Cannot open %s", fullname);
|
|
||||||
free(fullname);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = loadfile(fullname, fd);
|
|
||||||
(void)close(fd);
|
|
||||||
|
|
||||||
Parse_PushInput(fullname, 1, 0, buf, NULL);
|
|
||||||
if (depinc)
|
|
||||||
doing_depend = depinc; /* only turn it on */
|
|
||||||
free(fullname);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse a directive like '.include' or '.-include'.
|
* Parse a directive like '.include' or '.-include'.
|
||||||
|
8
str.c
8
str.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: str.c,v 1.88 2021/12/15 10:57:01 rillig Exp $ */
|
/* $NetBSD: str.c,v 1.89 2022/03/03 19:50:01 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -71,7 +71,7 @@
|
|||||||
#include "make.h"
|
#include "make.h"
|
||||||
|
|
||||||
/* "@(#)str.c 5.8 (Berkeley) 6/1/90" */
|
/* "@(#)str.c 5.8 (Berkeley) 6/1/90" */
|
||||||
MAKE_RCSID("$NetBSD: str.c,v 1.88 2021/12/15 10:57:01 rillig Exp $");
|
MAKE_RCSID("$NetBSD: str.c,v 1.89 2022/03/03 19:50:01 rillig Exp $");
|
||||||
|
|
||||||
|
|
||||||
static HashTable interned_strings;
|
static HashTable interned_strings;
|
||||||
@ -364,9 +364,9 @@ Str_Match(const char *str, const char *pat)
|
|||||||
if (pat[1] == '-') {
|
if (pat[1] == '-') {
|
||||||
if (pat[2] == '\0')
|
if (pat[2] == '\0')
|
||||||
return neg;
|
return neg;
|
||||||
if (*pat <= *str && pat[2] >= *str)
|
if (pat[0] <= *str && *str <= pat[2])
|
||||||
break;
|
break;
|
||||||
if (*pat >= *str && pat[2] <= *str)
|
if (pat[2] <= *str && *str <= pat[0])
|
||||||
break;
|
break;
|
||||||
pat += 2;
|
pat += 2;
|
||||||
}
|
}
|
||||||
|
14
suff.c
14
suff.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: suff.c,v 1.364 2022/01/07 20:54:45 rillig Exp $ */
|
/* $NetBSD: suff.c,v 1.366 2022/03/04 23:17:16 sjg Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -115,7 +115,7 @@
|
|||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
|
||||||
/* "@(#)suff.c 8.4 (Berkeley) 3/21/94" */
|
/* "@(#)suff.c 8.4 (Berkeley) 3/21/94" */
|
||||||
MAKE_RCSID("$NetBSD: suff.c,v 1.364 2022/01/07 20:54:45 rillig Exp $");
|
MAKE_RCSID("$NetBSD: suff.c,v 1.366 2022/03/04 23:17:16 sjg Exp $");
|
||||||
|
|
||||||
typedef List SuffixList;
|
typedef List SuffixList;
|
||||||
typedef ListNode SuffixListNode;
|
typedef ListNode SuffixListNode;
|
||||||
@ -145,8 +145,8 @@ static int sNum = 0;
|
|||||||
typedef List SuffixListList;
|
typedef List SuffixListList;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A suffix such as ".c" or ".o" that is used in suffix transformation rules
|
* A suffix such as ".c" or ".o" that may be used in suffix transformation
|
||||||
* such as ".c.o:".
|
* rules such as ".c.o:".
|
||||||
*/
|
*/
|
||||||
typedef struct Suffix {
|
typedef struct Suffix {
|
||||||
/* The suffix itself, such as ".c" */
|
/* The suffix itself, such as ".c" */
|
||||||
@ -859,9 +859,9 @@ Suff_AddSuffix(const char *name)
|
|||||||
|
|
||||||
/* Return the search path for the given suffix, or NULL. */
|
/* Return the search path for the given suffix, or NULL. */
|
||||||
SearchPath *
|
SearchPath *
|
||||||
Suff_GetPath(const char *sname)
|
Suff_GetPath(const char *name)
|
||||||
{
|
{
|
||||||
Suffix *suff = FindSuffixByName(sname);
|
Suffix *suff = FindSuffixByName(name);
|
||||||
return suff != NULL ? suff->searchPath : NULL;
|
return suff != NULL ? suff->searchPath : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1019,7 +1019,7 @@ Candidate_New(char *name, char *prefix, Suffix *suff, Candidate *parent,
|
|||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
static void
|
static void
|
||||||
CandidateList_Add(CandidateList *list, char *srcName, Candidate *targ,
|
CandidateList_Add(CandidateList *list, char *srcName, Candidate *targ,
|
||||||
Suffix *suff, const char *debug_tag)
|
Suffix *suff, const char *debug_tag MAKE_ATTR_UNUSED)
|
||||||
{
|
{
|
||||||
Candidate *cand = Candidate_New(srcName, targ->prefix, suff, targ,
|
Candidate *cand = Candidate_New(srcName, targ->prefix, suff, targ,
|
||||||
NULL);
|
NULL);
|
||||||
|
6
trace.c
6
trace.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: trace.c,v 1.31 2022/02/05 00:26:21 rillig Exp $ */
|
/* $NetBSD: trace.c,v 1.32 2022/03/26 14:02:40 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
||||||
@ -48,7 +48,7 @@
|
|||||||
#include "job.h"
|
#include "job.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
MAKE_RCSID("$NetBSD: trace.c,v 1.31 2022/02/05 00:26:21 rillig Exp $");
|
MAKE_RCSID("$NetBSD: trace.c,v 1.32 2022/03/26 14:02:40 rillig Exp $");
|
||||||
|
|
||||||
static FILE *trfile;
|
static FILE *trfile;
|
||||||
static pid_t trpid;
|
static pid_t trpid;
|
||||||
@ -90,7 +90,7 @@ Trace_Log(TrEvent event, Job *job)
|
|||||||
|
|
||||||
gettimeofday(&rightnow, NULL);
|
gettimeofday(&rightnow, NULL);
|
||||||
|
|
||||||
#if __STDC__ >= 199901L
|
#if __STDC_VERSION__ >= 199901L
|
||||||
fprintf(trfile, "%lld.%06ld %d %s %d %s",
|
fprintf(trfile, "%lld.%06ld %d %s %d %s",
|
||||||
(long long)rightnow.tv_sec, (long)rightnow.tv_usec,
|
(long long)rightnow.tv_sec, (long)rightnow.tv_usec,
|
||||||
jobTokensRunning,
|
jobTokensRunning,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# $Id: Makefile,v 1.174 2022/02/09 02:42:59 sjg Exp $
|
# $Id: Makefile,v 1.178 2022/03/26 23:10:27 sjg Exp $
|
||||||
#
|
#
|
||||||
# $NetBSD: Makefile,v 1.303 2022/02/07 22:43:50 rillig Exp $
|
# $NetBSD: Makefile,v 1.311 2022/03/26 12:44:57 rillig Exp $
|
||||||
#
|
#
|
||||||
# Unit tests for make(1)
|
# Unit tests for make(1)
|
||||||
#
|
#
|
||||||
@ -145,6 +145,7 @@ TESTS+= deptgt-phony
|
|||||||
TESTS+= deptgt-precious
|
TESTS+= deptgt-precious
|
||||||
TESTS+= deptgt-shell
|
TESTS+= deptgt-shell
|
||||||
TESTS+= deptgt-silent
|
TESTS+= deptgt-silent
|
||||||
|
TESTS+= deptgt-silent-jobs
|
||||||
TESTS+= deptgt-stale
|
TESTS+= deptgt-stale
|
||||||
TESTS+= deptgt-suffixes
|
TESTS+= deptgt-suffixes
|
||||||
TESTS+= dir
|
TESTS+= dir
|
||||||
@ -258,6 +259,7 @@ TESTS+= opt-jobs
|
|||||||
TESTS+= opt-jobs-internal
|
TESTS+= opt-jobs-internal
|
||||||
TESTS+= opt-jobs-no-action
|
TESTS+= opt-jobs-no-action
|
||||||
TESTS+= opt-keep-going
|
TESTS+= opt-keep-going
|
||||||
|
TESTS+= opt-keep-going-indirect
|
||||||
TESTS+= opt-keep-going-multiple
|
TESTS+= opt-keep-going-multiple
|
||||||
TESTS+= opt-m-include-dir
|
TESTS+= opt-m-include-dir
|
||||||
TESTS+= opt-no-action
|
TESTS+= opt-no-action
|
||||||
@ -501,6 +503,8 @@ TESTS:= ${TESTS:${BROKEN_TESTS:S,^,N,:ts:}}
|
|||||||
# Additional environment variables for some of the tests.
|
# Additional environment variables for some of the tests.
|
||||||
# The base environment is -i PATH="$PATH".
|
# The base environment is -i PATH="$PATH".
|
||||||
ENV.depsrc-optional+= TZ=UTC
|
ENV.depsrc-optional+= TZ=UTC
|
||||||
|
ENV.deptgt-phony+= MAKESYSPATH=.
|
||||||
|
ENV.directive-undef= ENV_VAR=env-value
|
||||||
ENV.envfirst= FROM_ENV=value-from-env
|
ENV.envfirst= FROM_ENV=value-from-env
|
||||||
ENV.varmisc= FROM_ENV=env
|
ENV.varmisc= FROM_ENV=env
|
||||||
ENV.varmisc+= FROM_ENV_BEFORE=env
|
ENV.varmisc+= FROM_ENV_BEFORE=env
|
||||||
@ -519,9 +523,8 @@ FLAGS.jobs-error-nested-make= # none, especially not -k
|
|||||||
FLAGS.varname-empty= -dv '$${:U}=cmdline-u' '=cmdline-plain'
|
FLAGS.varname-empty= -dv '$${:U}=cmdline-u' '=cmdline-plain'
|
||||||
|
|
||||||
# Some tests need extra postprocessing.
|
# Some tests need extra postprocessing.
|
||||||
SED_CMDS.dir= ${:D remove output from -DCLEANUP mode }
|
SED_CMDS.deptgt-phony= ${STD_SED_CMDS.dd}
|
||||||
SED_CMDS.dir+= -e '/^OpenDirs_Done:/d'
|
SED_CMDS.dir= ${STD_SED_CMDS.dd}
|
||||||
SED_CMDS.dir+= -e '/^CachedDir /d'
|
|
||||||
SED_CMDS.export= -e '/^[^=_A-Za-z0-9]*=/d'
|
SED_CMDS.export= -e '/^[^=_A-Za-z0-9]*=/d'
|
||||||
SED_CMDS.export-all= ${SED_CMDS.export}
|
SED_CMDS.export-all= ${SED_CMDS.export}
|
||||||
SED_CMDS.export-env= ${SED_CMDS.export}
|
SED_CMDS.export-env= ${SED_CMDS.export}
|
||||||
@ -592,6 +595,11 @@ unexport-env.rawout: export.mk
|
|||||||
|
|
||||||
# Some standard sed commands, to be used in the SED_CMDS above.
|
# Some standard sed commands, to be used in the SED_CMDS above.
|
||||||
|
|
||||||
|
# In tests that use the debugging option -dd, ignore debugging output that is
|
||||||
|
# only logged in -DCLEANUP mode.
|
||||||
|
STD_SED_CMDS.dd= -e '/^OpenDirs_Done:/d'
|
||||||
|
STD_SED_CMDS.dd+= -e '/^CachedDir /d'
|
||||||
|
|
||||||
# Omit details such as process IDs from the output of the -dg1 option.
|
# Omit details such as process IDs from the output of the -dg1 option.
|
||||||
STD_SED_CMDS.dg1= -e '/\#.* \.$$/d'
|
STD_SED_CMDS.dg1= -e '/\#.* \.$$/d'
|
||||||
STD_SED_CMDS.dg1+= -e '/\.MAKE.PATH_FILEMON/d'
|
STD_SED_CMDS.dg1+= -e '/\.MAKE.PATH_FILEMON/d'
|
||||||
@ -712,7 +720,7 @@ TMPDIR:= /tmp/uid${.MAKE.UID}
|
|||||||
.endif
|
.endif
|
||||||
# make sure it exists
|
# make sure it exists
|
||||||
.if !exist(${TMPDIR})
|
.if !exist(${TMPDIR})
|
||||||
x!= echo; mkdir -p ${TMPDIR}
|
_!= mkdir -p ${TMPDIR}
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
MAKE_TEST_ENV= MALLOC_OPTIONS="JA" # for jemalloc 100
|
MAKE_TEST_ENV= MALLOC_OPTIONS="JA" # for jemalloc 100
|
||||||
@ -724,7 +732,7 @@ LIMIT_RESOURCES?= ulimit -v 200000
|
|||||||
.endif
|
.endif
|
||||||
LIMIT_RESOURCES?= :
|
LIMIT_RESOURCES?= :
|
||||||
|
|
||||||
# Each test is run in a sub-make, to keep the tests for interfering with
|
# Each test is run in a sub-make, to keep the tests from interfering with
|
||||||
# each other, and because they use different environment variables and
|
# each other, and because they use different environment variables and
|
||||||
# command line options.
|
# command line options.
|
||||||
.SUFFIXES: .mk .rawout .out
|
.SUFFIXES: .mk .rawout .out
|
||||||
@ -747,14 +755,13 @@ LIMIT_RESOURCES?= :
|
|||||||
# always pretend .MAKE was called 'make'
|
# always pretend .MAKE was called 'make'
|
||||||
_SED_CMDS+= -e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,'
|
_SED_CMDS+= -e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,'
|
||||||
_SED_CMDS+= -e 's,${TEST_MAKE:S,.,\\.,g},make,'
|
_SED_CMDS+= -e 's,${TEST_MAKE:S,.,\\.,g},make,'
|
||||||
_SED_CMDS+= -e 's,${TEST_MAKE:T:S,.,\\.,g}[][0-9]* warning,make warning,'
|
|
||||||
_SED_CMDS+= -e 's,^usage: ${TEST_MAKE:T:S,.,\\.,g} ,usage: make ,'
|
_SED_CMDS+= -e 's,^usage: ${TEST_MAKE:T:S,.,\\.,g} ,usage: make ,'
|
||||||
# replace anything after 'stopped in' with unit-tests
|
# replace anything after 'stopped in' with unit-tests
|
||||||
_SED_CMDS+= -e '/stopped/s, /.*, unit-tests,'
|
_SED_CMDS+= -e '/stopped/s, /.*, unit-tests,'
|
||||||
# Allow the test files to be placed anywhere.
|
# Allow the test files to be placed anywhere.
|
||||||
_SED_CMDS+= -e 's,\(\.PARSEDIR}\) = `'"/[^']*'"',\1 = <some-dir>,'
|
_SED_CMDS+= -e 's,\(\.PARSEDIR}\) = `'"/[^']*'"',\1 = <some-dir>,'
|
||||||
_SED_CMDS+= -e 's,\(\.INCLUDEDFROMDIR}\) = `'"/[^']*'"',\1 = <some-dir>,'
|
_SED_CMDS+= -e 's,\(\.INCLUDEDFROMDIR}\) = `'"/[^']*'"',\1 = <some-dir>,'
|
||||||
_SED_CMDS+= -e 's,${TMPDIR},TMPDIR,g'
|
_SED_CMDS+= -e 's,${TMPDIR},<tmpdir>,g'
|
||||||
# canonicalize ${.OBJDIR} and ${.CURDIR}
|
# canonicalize ${.OBJDIR} and ${.CURDIR}
|
||||||
.if ${.OBJDIR} != ${.CURDIR}
|
.if ${.OBJDIR} != ${.CURDIR}
|
||||||
# yes this is inaccurate but none of the tests expect <objdir> anywhere
|
# yes this is inaccurate but none of the tests expect <objdir> anywhere
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
makeobjdir-direct:
|
makeobjdir-direct:
|
||||||
show-objdir: TMPDIR/6a8899d2-d227-4b55-9b6b-f3c8eeb83fd5
|
show-objdir: <tmpdir>/6a8899d2-d227-4b55-9b6b-f3c8eeb83fd5
|
||||||
makeobjdir-indirect:
|
makeobjdir-indirect:
|
||||||
show-objdir: TMPDIR/a7b41170-53f8-4cc2-bc5c-e4c3dd93ec45/
|
show-objdir: <tmpdir>/a7b41170-53f8-4cc2-bc5c-e4c3dd93ec45/
|
||||||
exit status 0
|
exit status 0
|
||||||
|
@ -3,11 +3,11 @@ make: "cond-cmp-numeric.mk" line 11: String comparison operator must be either =
|
|||||||
CondParser_Eval: ${:UNaN} > NaN
|
CondParser_Eval: ${:UNaN} > NaN
|
||||||
make: "cond-cmp-numeric.mk" line 16: String comparison operator must be either == or !=
|
make: "cond-cmp-numeric.mk" line 16: String comparison operator must be either == or !=
|
||||||
CondParser_Eval: !(${:UNaN} == NaN)
|
CondParser_Eval: !(${:UNaN} == NaN)
|
||||||
lhs = "NaN", rhs = "NaN", op = ==
|
Comparing "NaN" == "NaN"
|
||||||
CondParser_Eval: 123 ! 123
|
CondParser_Eval: 123 ! 123
|
||||||
make: "cond-cmp-numeric.mk" line 34: Malformed conditional (123 ! 123)
|
make: "cond-cmp-numeric.mk" line 34: Malformed conditional (123 ! 123)
|
||||||
CondParser_Eval: ${:U 123} < 124
|
CondParser_Eval: ${:U 123} < 124
|
||||||
lhs = 123.000000, rhs = 124.000000, op = <
|
Comparing 123.000000 < 124.000000
|
||||||
CondParser_Eval: ${:U123 } < 124
|
CondParser_Eval: ${:U123 } < 124
|
||||||
make: "cond-cmp-numeric.mk" line 50: String comparison operator must be either == or !=
|
make: "cond-cmp-numeric.mk" line 50: String comparison operator must be either == or !=
|
||||||
make: Fatal errors encountered -- cannot continue
|
make: Fatal errors encountered -- cannot continue
|
||||||
|
@ -1,31 +1,31 @@
|
|||||||
CondParser_Eval: ${:Uvalue} != value
|
CondParser_Eval: ${:Uvalue} != value
|
||||||
lhs = "value", rhs = "value", op = !=
|
Comparing "value" != "value"
|
||||||
CondParser_Eval: ${:U} != "
|
CondParser_Eval: ${:U} != "
|
||||||
lhs = "", rhs = "", op = !=
|
Comparing "" != ""
|
||||||
CondParser_Eval: ${:U#hash} != "#hash"
|
CondParser_Eval: ${:U#hash} != "#hash"
|
||||||
lhs = "#hash", rhs = "#hash", op = !=
|
Comparing "#hash" != "#hash"
|
||||||
CondParser_Eval: ${:U\\} != "\\
|
CondParser_Eval: ${:U\\} != "\\
|
||||||
lhs = "\", rhs = "\", op = !=
|
Comparing "\" != "\"
|
||||||
CondParser_Eval: ${:U#hash} != #hash
|
CondParser_Eval: ${:U#hash} != #hash
|
||||||
lhs = "#hash", rhs = "#hash", op = !=
|
Comparing "#hash" != "#hash"
|
||||||
CondParser_Eval: 0 # This is treated as a comment, but why?
|
CondParser_Eval: 0 # This is treated as a comment, but why?
|
||||||
CondParser_Eval: ${0 # comment :?yes:no} != no
|
CondParser_Eval: ${0 # comment :?yes:no} != no
|
||||||
CondParser_Eval: 0 # comment
|
CondParser_Eval: 0 # comment
|
||||||
lhs = "no", rhs = "no", op = !=
|
Comparing "no" != "no"
|
||||||
CondParser_Eval: ${1 # comment :?yes:no} != yes
|
CondParser_Eval: ${1 # comment :?yes:no} != yes
|
||||||
CondParser_Eval: 1 # comment
|
CondParser_Eval: 1 # comment
|
||||||
lhs = "yes", rhs = "yes", op = !=
|
Comparing "yes" != "yes"
|
||||||
CondParser_Eval: ${UNDEF:Uundefined}!=undefined
|
CondParser_Eval: ${UNDEF:Uundefined}!=undefined
|
||||||
lhs = "undefined", rhs = "undefined", op = !=
|
Comparing "undefined" != "undefined"
|
||||||
CondParser_Eval: ${UNDEF:U12345}>12345
|
CondParser_Eval: ${UNDEF:U12345}>12345
|
||||||
lhs = 12345.000000, rhs = 12345.000000, op = >
|
Comparing 12345.000000 > 12345.000000
|
||||||
CondParser_Eval: ${UNDEF:U12345}<12345
|
CondParser_Eval: ${UNDEF:U12345}<12345
|
||||||
lhs = 12345.000000, rhs = 12345.000000, op = <
|
Comparing 12345.000000 < 12345.000000
|
||||||
CondParser_Eval: (${UNDEF:U0})||0
|
CondParser_Eval: (${UNDEF:U0})||0
|
||||||
CondParser_Eval: ${:Uvar}&&name != "var&&name"
|
CondParser_Eval: ${:Uvar}&&name != "var&&name"
|
||||||
lhs = "var&&name", rhs = "var&&name", op = !=
|
Comparing "var&&name" != "var&&name"
|
||||||
CondParser_Eval: ${:Uvar}||name != "var||name"
|
CondParser_Eval: ${:Uvar}||name != "var||name"
|
||||||
lhs = "var||name", rhs = "var||name", op = !=
|
Comparing "var||name" != "var||name"
|
||||||
CondParser_Eval: bare
|
CondParser_Eval: bare
|
||||||
make: "cond-token-plain.mk" line 105: A bare word is treated like defined(...), and the variable 'bare' is not defined.
|
make: "cond-token-plain.mk" line 105: A bare word is treated like defined(...), and the variable 'bare' is not defined.
|
||||||
CondParser_Eval: VAR
|
CondParser_Eval: VAR
|
||||||
@ -47,7 +47,7 @@ make: "cond-token-plain.mk" line 167: The variable '\\' is not defined.
|
|||||||
CondParser_Eval: \\
|
CondParser_Eval: \\
|
||||||
make: "cond-token-plain.mk" line 172: Now the variable '\\' is defined.
|
make: "cond-token-plain.mk" line 172: Now the variable '\\' is defined.
|
||||||
CondParser_Eval: "unquoted\"quoted" != unquoted"quoted
|
CondParser_Eval: "unquoted\"quoted" != unquoted"quoted
|
||||||
lhs = "unquoted"quoted", rhs = "unquoted"quoted", op = !=
|
Comparing "unquoted"quoted" != "unquoted"quoted"
|
||||||
CondParser_Eval: $$$$$$$$ != ""
|
CondParser_Eval: $$$$$$$$ != ""
|
||||||
CondParser_Eval: left == right
|
CondParser_Eval: left == right
|
||||||
make: "cond-token-plain.mk" line 195: Malformed conditional (left == right)
|
make: "cond-token-plain.mk" line 195: Malformed conditional (left == right)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: depsrc-meta.mk,v 1.6 2022/01/26 22:47:03 rillig Exp $
|
# $NetBSD: depsrc-meta.mk,v 1.7 2022/03/02 19:32:15 sjg Exp $
|
||||||
#
|
#
|
||||||
# Tests for the special source .META in dependency declarations.
|
# Tests for the special source .META in dependency declarations.
|
||||||
|
|
||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
.if make(actual-test)
|
.if make(actual-test)
|
||||||
.MAKEFLAGS: -dM
|
.MAKEFLAGS: -dM
|
||||||
.MAKE.MODE= meta curDirOk=true
|
.MAKE.MODE= meta curDirOk=true nofilemon
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
actual-test: depsrc-meta-target
|
actual-test: depsrc-meta-target
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
Global:delete DOLLAR (not found)
|
Global: delete DOLLAR (not found)
|
||||||
Command: DOLLAR = $$$$
|
Command: DOLLAR = $$$$
|
||||||
Global: .MAKEOVERRIDES = VAR DOLLAR
|
Global: .MAKEOVERRIDES = VAR DOLLAR
|
||||||
CondParser_Eval: ${DOLLAR} != "\$\$"
|
CondParser_Eval: ${DOLLAR} != "\$\$"
|
||||||
Var_Parse: ${DOLLAR} != "\$\$" (eval-defined)
|
Var_Parse: ${DOLLAR} != "\$\$" (eval-defined)
|
||||||
lhs = "$$", rhs = "$$", op = !=
|
Comparing "$$" != "$$"
|
||||||
Global: .MAKEFLAGS = -r -k -D VAR -D VAR -d cv -d
|
Global: .MAKEFLAGS = -r -k -D VAR -D VAR -d cv -d
|
||||||
Global: .MAKEFLAGS = -r -k -D VAR -D VAR -d cv -d 0
|
Global: .MAKEFLAGS = -r -k -D VAR -D VAR -d cv -d 0
|
||||||
make: Unterminated quoted string [make VAR=initial UNBALANCED=']
|
make: Unterminated quoted string [make VAR=initial UNBALANCED=']
|
||||||
|
@ -1 +1,42 @@
|
|||||||
|
Expanding "depsrc-phony-pr-15164-*-wildcard"...
|
||||||
|
Expanding "deptgt-phony-pr-15164-*-wildcard"...
|
||||||
|
Searching for .depend ...
|
||||||
|
failed.
|
||||||
|
Searching for .depend ...
|
||||||
|
. ...
|
||||||
|
failed.
|
||||||
|
Wildcard expanding "all"...
|
||||||
|
Searching for all ...
|
||||||
|
failed.
|
||||||
|
Found 'all' as '(not found)'
|
||||||
|
SuffFindDeps "all"
|
||||||
|
No known suffix on all. Using .NULL suffix
|
||||||
|
adding suffix rules
|
||||||
|
Wildcard expanding "depsrc-phony-pr-15164-*-wildcard"...
|
||||||
|
Expanding "depsrc-phony-pr-15164-*-wildcard"...
|
||||||
|
|
||||||
|
Wildcard expanding "deptgt-phony-pr-15164-*-wildcard"...
|
||||||
|
Expanding "deptgt-phony-pr-15164-*-wildcard"...
|
||||||
|
|
||||||
|
Searching for all ...
|
||||||
|
failed.
|
||||||
|
SuffFindDeps "depsrc-phony-pr-15164"
|
||||||
|
No valid suffix on depsrc-phony-pr-15164
|
||||||
|
SuffFindDeps "deptgt-phony-pr-15164"
|
||||||
|
No valid suffix on deptgt-phony-pr-15164
|
||||||
|
: Making depsrc-phony-pr-15164
|
||||||
|
: Making deptgt-phony-pr-15164
|
||||||
|
Wildcard expanding "all"...
|
||||||
|
Searching for all ...
|
||||||
|
failed.
|
||||||
|
Found 'all' as '(not found)'
|
||||||
|
SuffFindDeps ".END"
|
||||||
|
No known suffix on .END. Using .NULL suffix
|
||||||
|
adding suffix rules
|
||||||
|
Searching for .END ...
|
||||||
|
failed.
|
||||||
|
Wildcard expanding ".END"...
|
||||||
|
Searching for .END ...
|
||||||
|
failed.
|
||||||
|
Found '.END' as '(not found)'
|
||||||
exit status 0
|
exit status 0
|
||||||
|
@ -1,8 +1,31 @@
|
|||||||
# $NetBSD: deptgt-phony.mk,v 1.2 2020/08/16 14:25:16 rillig Exp $
|
# $NetBSD: deptgt-phony.mk,v 1.3 2022/02/11 23:44:18 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the special target .PHONY in dependency declarations.
|
# Tests for the special target .PHONY in dependency declarations.
|
||||||
|
|
||||||
# TODO: Implementation
|
# TODO: Implementation
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@:;
|
|
||||||
|
|
||||||
|
# https://gnats.netbsd.org/15164 describes that .PHONY targets are still
|
||||||
|
# looked up in directories, even though .PHONY means that these targets do
|
||||||
|
# _not_ correspond to actual files.
|
||||||
|
#
|
||||||
|
# expect: Expanding "depsrc-phony-pr-15164-*-wildcard"...
|
||||||
|
# expect: Expanding "deptgt-phony-pr-15164-*-wildcard"...
|
||||||
|
.MAKEFLAGS: -dds
|
||||||
|
depsrc-phony-pr-15164: .PHONY
|
||||||
|
: Making ${.TARGET}
|
||||||
|
depsrc-phony-pr-15164-*-wildcard: .PHONY
|
||||||
|
: Making ${.TARGET}
|
||||||
|
|
||||||
|
.PHONY: deptgt-phony-pr-15164
|
||||||
|
deptgt-phony-pr-15164:
|
||||||
|
: Making ${.TARGET}
|
||||||
|
|
||||||
|
.PHONY: deptgt-phony-pr-15164-*-wildcard
|
||||||
|
deptgt-phony-pr-15164-*-wildcard:
|
||||||
|
: Making ${.TARGET}
|
||||||
|
|
||||||
|
all: depsrc-phony-pr-15164 depsrc-phony-pr-15164-*-wildcard
|
||||||
|
all: deptgt-phony-pr-15164 deptgt-phony-pr-15164-*-wildcard
|
||||||
|
7
unit-tests/deptgt-silent-jobs.exp
Normal file
7
unit-tests/deptgt-silent-jobs.exp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
compat: testing 1
|
||||||
|
compat: testing 2
|
||||||
|
compat: testing 3
|
||||||
|
jobs: testing 1
|
||||||
|
jobs: testing 2
|
||||||
|
jobs: testing 3
|
||||||
|
exit status 0
|
35
unit-tests/deptgt-silent-jobs.mk
Normal file
35
unit-tests/deptgt-silent-jobs.mk
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# $NetBSD: deptgt-silent-jobs.mk,v 1.2 2022/02/12 11:14:48 rillig Exp $
|
||||||
|
#
|
||||||
|
# Ensure that the special dependency target '.SILENT' only affects the amount
|
||||||
|
# of output, but not the kind of error handling.
|
||||||
|
#
|
||||||
|
# History:
|
||||||
|
# In job.c 1.83 from 2003.12.20.00.18.22, in an attempt to fix
|
||||||
|
# https://gnats.netbsd.org/18573, commands that suppressed error
|
||||||
|
# handling were output in jobs mode, even when the global '.SILENT'
|
||||||
|
# was set. This was fixed in job.c 1.452 from 2022-02-12.
|
||||||
|
#
|
||||||
|
# See also:
|
||||||
|
# https://gnats.netbsd.org/45356
|
||||||
|
|
||||||
|
all: compat jobs
|
||||||
|
.PHONY: all compat jobs test
|
||||||
|
|
||||||
|
.SILENT:
|
||||||
|
test:
|
||||||
|
@echo '${VARIANT}: testing 1'
|
||||||
|
-echo '${VARIANT}: testing 2'
|
||||||
|
echo '${VARIANT}: testing 3'
|
||||||
|
|
||||||
|
# expect: compat: testing 1
|
||||||
|
# expect: compat: testing 2
|
||||||
|
# expect: compat: testing 3
|
||||||
|
compat:
|
||||||
|
@${MAKE} -r -f ${MAKEFILE} test VARIANT=compat
|
||||||
|
|
||||||
|
# expect: jobs: testing 1
|
||||||
|
# expect: echo 'jobs: testing 2'
|
||||||
|
# expect: jobs: testing 2
|
||||||
|
# expect: jobs: testing 3
|
||||||
|
jobs:
|
||||||
|
@${MAKE} -r -f ${MAKEFILE} test VARIANT=jobs -j1
|
@ -1,7 +1,7 @@
|
|||||||
# $NetBSD: directive-elifdef.mk,v 1.3 2022/01/22 16:23:56 rillig Exp $
|
# $NetBSD: directive-elifdef.mk,v 1.4 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the .elifdef directive, which is seldom used. Instead of writing
|
# Tests for the .elifdef directive, which is seldom used. Instead of writing
|
||||||
# '.elifdef VAR', the usual form is the more versatile '.elif defined(VAR)'.
|
# '.elifdef VAR', the usual form is the more general '.elif defined(VAR)'.
|
||||||
|
|
||||||
# At this point, VAR is not defined, so the condition evaluates to false.
|
# At this point, VAR is not defined, so the condition evaluates to false.
|
||||||
.if 0
|
.if 0
|
||||||
|
@ -23,7 +23,7 @@ Result of ${.MAKE.EXPORTED:u} is "UT_VAR"
|
|||||||
Var_Parse: ${UT_VAR} (eval)
|
Var_Parse: ${UT_VAR} (eval)
|
||||||
Var_Parse: ${REF}> (eval)
|
Var_Parse: ${REF}> (eval)
|
||||||
Result of ${:!echo "\$UT_VAR"!} is "<>" (eval-defined, defined)
|
Result of ${:!echo "\$UT_VAR"!} is "<>" (eval-defined, defined)
|
||||||
lhs = "<>", rhs = "<>", op = !=
|
Comparing "<>" != "<>"
|
||||||
Parsing line 50: : ${UT_VAR:N*}
|
Parsing line 50: : ${UT_VAR:N*}
|
||||||
Var_Parse: ${UT_VAR:N*} (eval-defined)
|
Var_Parse: ${UT_VAR:N*} (eval-defined)
|
||||||
Var_Parse: ${REF}> (eval-defined)
|
Var_Parse: ${REF}> (eval-defined)
|
||||||
@ -47,7 +47,7 @@ Result of ${.MAKE.EXPORTED:u} is "UT_VAR"
|
|||||||
Var_Parse: ${UT_VAR} (eval)
|
Var_Parse: ${UT_VAR} (eval)
|
||||||
Var_Parse: ${REF}> (eval)
|
Var_Parse: ${REF}> (eval)
|
||||||
Result of ${:!echo "\$UT_VAR"!} is "<defined>" (eval-defined, defined)
|
Result of ${:!echo "\$UT_VAR"!} is "<defined>" (eval-defined, defined)
|
||||||
lhs = "<defined>", rhs = "<defined>", op = !=
|
Comparing "<defined>" != "<defined>"
|
||||||
Parsing line 62: all:
|
Parsing line 62: all:
|
||||||
ParseDependency(all:)
|
ParseDependency(all:)
|
||||||
Global: .ALLTARGETS = all
|
Global: .ALLTARGETS = all
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
# $NetBSD: directive-ifmake.mk,v 1.9 2022/01/22 16:23:56 rillig Exp $
|
# $NetBSD: directive-ifmake.mk,v 1.10 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the .ifmake directive, which provides a shortcut for asking
|
# Tests for the .ifmake directive, which provides a shortcut for asking
|
||||||
# whether a certain target is requested to be made from the command line.
|
# whether a certain target is requested to be made from the command line.
|
||||||
#
|
#
|
||||||
# TODO: Describe why the shortcut may be useful (if it's useful at all),
|
# TODO: Describe why the shortcut may be useful (if it's useful at all),
|
||||||
# instead of using the more versatile '.if make(target)'.
|
# instead of using the more general '.if make(target)'.
|
||||||
|
|
||||||
.MAKEFLAGS: first second
|
.MAKEFLAGS: first second
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
CondParser_Eval: ${.MAKE.MAKEFILES:T} != "${.PARSEFILE} null"
|
CondParser_Eval: ${.MAKE.MAKEFILES:T} != "${.PARSEFILE} null"
|
||||||
lhs = "directive-include.mk null", rhs = "directive-include.mk null", op = !=
|
Comparing "directive-include.mk null" != "directive-include.mk null"
|
||||||
CondParser_Eval: ${.MAKE.MAKEFILES:T} != "${.PARSEFILE} null"
|
CondParser_Eval: ${.MAKE.MAKEFILES:T} != "${.PARSEFILE} null"
|
||||||
lhs = "directive-include.mk null", rhs = "directive-include.mk null", op = !=
|
Comparing "directive-include.mk null" != "directive-include.mk null"
|
||||||
make: "directive-include.mk" line 25: Could not find nonexistent.mk
|
make: "directive-include.mk" line 25: Could not find nonexistent.mk
|
||||||
make: "directive-include.mk" line 47: Could not find "
|
make: "directive-include.mk" line 47: Could not find "
|
||||||
make: "directive-include.mk" line 52: Unknown modifier "Z"
|
make: "directive-include.mk" line 52: Unknown modifier "Z"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: directive-undef.mk,v 1.10 2021/02/16 18:02:19 rillig Exp $
|
# $NetBSD: directive-undef.mk,v 1.12 2022/03/26 12:44:57 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the .undef directive.
|
# Tests for the .undef directive.
|
||||||
#
|
#
|
||||||
@ -43,11 +43,11 @@
|
|||||||
3= 3
|
3= 3
|
||||||
${:U1 2 3}= one two three
|
${:U1 2 3}= one two three
|
||||||
VARNAMES= 1 2 3
|
VARNAMES= 1 2 3
|
||||||
.undef ${VARNAMES} # undefines the variable "1 2 3"
|
.undef ${VARNAMES} # undefines the variables "1", "2" and "3"
|
||||||
.if !defined(${:U1 2 3})
|
.if ${${:U1 2 3}} != "one two three" # still there
|
||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
.if ${1:U_}${2:U_}${3:U_} != "___" # these are still defined
|
.if ${1:U_}${2:U_}${3:U_} != "___" # these have been undefined
|
||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
@ -104,4 +104,42 @@ UT_EXPORTED= exported-value
|
|||||||
.endif
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
# When an exported variable is undefined, the variable is removed both from
|
||||||
|
# the global scope as well as from the environment.
|
||||||
|
DIRECT= direct
|
||||||
|
INDIRECT= in-${DIRECT}
|
||||||
|
.export DIRECT INDIRECT
|
||||||
|
.if ${DIRECT} != "direct"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
.if ${INDIRECT} != "in-direct"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# Deletes the variables from the global scope and also from the environment.
|
||||||
|
# This applies to both variables, even though 'INDIRECT' is not actually
|
||||||
|
# exported yet since it refers to another variable.
|
||||||
|
.undef DIRECT # Separate '.undef' directives,
|
||||||
|
.undef INDIRECT # for backwards compatibility.
|
||||||
|
|
||||||
|
.if ${DIRECT:Uundefined} != "undefined"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
.if ${INDIRECT:Uundefined} != "undefined"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
# Since var.c 1.570 from 2020-10-06 and before var.c 1.1014 from 2022-03-26,
|
||||||
|
# make ran into an assertion failure when trying to undefine a variable that
|
||||||
|
# was based on an environment variable.
|
||||||
|
.if ${ENV_VAR} != "env-value" # see ./Makefile, ENV.directive-undef
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
ENV_VAR+= appended # moves the short-lived variable to the
|
||||||
|
# global scope
|
||||||
|
.undef ENV_VAR # removes the variable from both the global
|
||||||
|
# scope and from the environment
|
||||||
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
@ -10,7 +10,7 @@ Result of ${.MAKE.EXPORTED:O} is "UT_EXPORTED"
|
|||||||
Evaluating modifier ${.MAKE.EXPORTED:u} on value "UT_EXPORTED"
|
Evaluating modifier ${.MAKE.EXPORTED:u} on value "UT_EXPORTED"
|
||||||
Result of ${.MAKE.EXPORTED:u} is "UT_EXPORTED"
|
Result of ${.MAKE.EXPORTED:u} is "UT_EXPORTED"
|
||||||
Unexporting "UT_EXPORTED"
|
Unexporting "UT_EXPORTED"
|
||||||
Global:delete .MAKE.EXPORTED
|
Global: delete .MAKE.EXPORTED
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d 0
|
Global: .MAKEFLAGS = -r -k -d v -d 0
|
||||||
make: Fatal errors encountered -- cannot continue
|
make: Fatal errors encountered -- cannot continue
|
||||||
|
@ -2,7 +2,7 @@ make: "directive.mk" line 10: Unknown directive "indented"
|
|||||||
make: "directive.mk" line 12: Unknown directive "indented"
|
make: "directive.mk" line 12: Unknown directive "indented"
|
||||||
make: "directive.mk" line 14: Unknown directive "indented"
|
make: "directive.mk" line 14: Unknown directive "indented"
|
||||||
make: "directive.mk" line 21: Unknown directive "info"
|
make: "directive.mk" line 21: Unknown directive "info"
|
||||||
Global: .info =
|
Global: .info = # (empty)
|
||||||
Global: .info = value
|
Global: .info = value
|
||||||
make: "directive.mk" line 33: := value
|
make: "directive.mk" line 33: := value
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
MAKELEVEL=1
|
MAKELEVEL=1
|
||||||
TMPDIR=TMPDIR
|
TMPDIR=<tmpdir>
|
||||||
UT_DOLLAR=This is $UT_FU
|
UT_DOLLAR=This is $UT_FU
|
||||||
UT_FOO=foobar is fubar
|
UT_FOO=foobar is fubar
|
||||||
UT_FU=fubar
|
UT_FU=fubar
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# $NetBSD: meta-cmd-cmp.mk,v 1.4 2022/01/27 06:02:59 sjg Exp $
|
# $NetBSD: meta-cmd-cmp.mk,v 1.6 2022/03/02 19:32:15 sjg Exp $
|
||||||
#
|
#
|
||||||
# Tests META_MODE command line comparison
|
# Tests META_MODE command line comparison
|
||||||
#
|
#
|
||||||
|
|
||||||
.MAIN: all
|
.MAIN: all
|
||||||
|
|
||||||
.MAKE.MODE= meta verbose silent=yes curdirok=yes
|
.MAKE.MODE= meta verbose silent=yes curdirok=yes nofilemon
|
||||||
tf:= .${.PARSEFILE:R}
|
tf:= .${.PARSEFILE:R}
|
||||||
|
|
||||||
.if ${.TARGETS:Nall} == ""
|
.if ${.TARGETS:Nall} == ""
|
||||||
@ -36,7 +36,7 @@ ${tf}.cmp2:
|
|||||||
@echo FLAGS2=${FLAGS2:Uempty} > $@
|
@echo FLAGS2=${FLAGS2:Uempty} > $@
|
||||||
@echo This line not compared FLAGS=${FLAGS:Uempty} ${.OODATE:MNOMETA_CMP}
|
@echo This line not compared FLAGS=${FLAGS:Uempty} ${.OODATE:MNOMETA_CMP}
|
||||||
|
|
||||||
COMPILER_WRAPPERS+= ccache distcc icecc
|
COMPILER_WRAPPERS= ccache distcc icecc
|
||||||
WRAPPER?= ccache
|
WRAPPER?= ccache
|
||||||
.ifdef WITH_CMP_FILTER
|
.ifdef WITH_CMP_FILTER
|
||||||
.MAKE.META.CMP_FILTER+= ${COMPILER_WRAPPERS:S,^,N,}
|
.MAKE.META.CMP_FILTER+= ${COMPILER_WRAPPERS:S,^,N,}
|
||||||
@ -49,7 +49,7 @@ ${tf}.filter: .MAKE.META.CMP_FILTER= ${COMPILER_WRAPPERS:S,^,N,}
|
|||||||
${tf}.filter:
|
${tf}.filter:
|
||||||
@echo ${WRAPPER} cc -c foo.c > $@
|
@echo ${WRAPPER} cc -c foo.c > $@
|
||||||
|
|
||||||
# these do the same
|
# these do the same
|
||||||
one two: .PHONY
|
one two: .PHONY
|
||||||
@echo $@:
|
@echo $@:
|
||||||
@${.MAKE} -dM -r -C ${.CURDIR} -f ${MAKEFILE} ${tests}
|
@${.MAKE} -dM -r -C ${.CURDIR} -f ${MAKEFILE} ${tests}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
make warning: TMPDIR/roobj: Permission denied.
|
make: warning: <tmpdir>/roobj: Permission denied.
|
||||||
TMPDIR
|
<tmpdir>
|
||||||
TMPDIR/roobj
|
<tmpdir>/roobj
|
||||||
TMPDIR/roobj
|
<tmpdir>/roobj
|
||||||
exit status 0
|
exit status 0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: objdir-writable.mk,v 1.5 2021/07/04 01:28:54 sjg Exp $
|
# $NetBSD: objdir-writable.mk,v 1.7 2022/02/09 21:24:29 rillig Exp $
|
||||||
|
|
||||||
# test checking for writable objdir
|
# test checking for writable objdir
|
||||||
|
|
||||||
@ -14,7 +14,8 @@ do-objdir:
|
|||||||
all: no-objdir ro-objdir explicit-objdir
|
all: no-objdir ro-objdir explicit-objdir
|
||||||
|
|
||||||
# make it now
|
# make it now
|
||||||
x!= echo; mkdir -p ${RO_OBJDIR}; chmod 555 ${RO_OBJDIR}
|
_!= mkdir -p ${RO_OBJDIR}
|
||||||
|
_!= chmod 555 ${RO_OBJDIR}
|
||||||
|
|
||||||
.END: rm-objdir
|
.END: rm-objdir
|
||||||
rm-objdir:
|
rm-objdir:
|
||||||
@ -29,4 +30,3 @@ ro-objdir:
|
|||||||
explicit-objdir:
|
explicit-objdir:
|
||||||
@MAKEOBJDIR=${TMPDIR} ${.MAKE} -r -f ${MAKEFILE:tA} -C ${TMPDIR} do-objdir -V .OBJDIR
|
@MAKEOBJDIR=${TMPDIR} ${.MAKE} -r -f ${MAKEFILE:tA} -C ${TMPDIR} do-objdir -V .OBJDIR
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
CondParser_Eval: ${:U12345} > ${:U55555}
|
CondParser_Eval: ${:U12345} > ${:U55555}
|
||||||
lhs = 12345.000000, rhs = 55555.000000, op = >
|
Comparing 12345.000000 > 55555.000000
|
||||||
CondParser_Eval: "string" != "string"
|
CondParser_Eval: "string" != "string"
|
||||||
lhs = "string", rhs = "string", op = !=
|
Comparing "string" != "string"
|
||||||
CondParser_Eval: "nonempty"
|
CondParser_Eval: "nonempty"
|
||||||
exit status 0
|
exit status 0
|
||||||
|
@ -2,11 +2,11 @@ make: "opt-debug-file.mk" line 43: This goes to stderr only, once.
|
|||||||
make: "opt-debug-file.mk" line 45: This goes to stderr only, once.
|
make: "opt-debug-file.mk" line 45: This goes to stderr only, once.
|
||||||
make: "opt-debug-file.mk" line 47: This goes to stderr, and in addition to the debug log.
|
make: "opt-debug-file.mk" line 47: This goes to stderr, and in addition to the debug log.
|
||||||
CondParser_Eval: ${:!cat opt-debug-file.debuglog!:Maddition:[#]} != 1
|
CondParser_Eval: ${:!cat opt-debug-file.debuglog!:Maddition:[#]} != 1
|
||||||
lhs = 1.000000, rhs = 1.000000, op = !=
|
Comparing 1.000000 != 1.000000
|
||||||
make: Missing delimiter for modifier ':S'
|
make: Missing delimiter for modifier ':S'
|
||||||
make: Missing delimiter for modifier ':S'
|
make: Missing delimiter for modifier ':S'
|
||||||
make: Missing delimiter for modifier ':S'
|
make: Missing delimiter for modifier ':S'
|
||||||
CondParser_Eval: ${:!cat opt-debug-file.debuglog!:Mdelimiter:[#]} != 1
|
CondParser_Eval: ${:!cat opt-debug-file.debuglog!:Mdelimiter:[#]} != 1
|
||||||
lhs = 1.000000, rhs = 1.000000, op = !=
|
Comparing 1.000000 != 1.000000
|
||||||
Cannot open debug file "/nonexistent-6f21c672-a22d-4ef7/opt-debug-file.debuglog"
|
Cannot open debug file "/nonexistent-6f21c672-a22d-4ef7/opt-debug-file.debuglog"
|
||||||
exit status 2
|
exit status 2
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
#*** Global Variables:
|
#*** Global Variables:
|
||||||
.ALLTARGETS = all made-target made-target-no-sources made-source unmade-target unmade-sources unmade-silent-source unmade-target-no-sources
|
.ALLTARGETS = all made-target made-target-no-sources made-source unmade-target unmade-sources unmade-silent-source unmade-target-no-sources
|
||||||
.CURDIR = <curdir>
|
.CURDIR = <curdir>
|
||||||
.INCLUDES =
|
.INCLUDES = # (empty)
|
||||||
.LIBS =
|
.LIBS = # (empty)
|
||||||
.MAKE = <details omitted>
|
.MAKE = <details omitted>
|
||||||
.MAKE.DEPENDFILE = <details omitted>
|
.MAKE.DEPENDFILE = <details omitted>
|
||||||
.MAKE.GID = <details omitted>
|
.MAKE.GID = <details omitted>
|
||||||
@ -29,12 +29,12 @@
|
|||||||
.MAKE.PPID = <details omitted>
|
.MAKE.PPID = <details omitted>
|
||||||
.MAKE.UID = <details omitted>
|
.MAKE.UID = <details omitted>
|
||||||
.MAKEFLAGS = -r -k -d g1
|
.MAKEFLAGS = -r -k -d g1
|
||||||
.MAKEOVERRIDES =
|
.MAKEOVERRIDES = # (empty)
|
||||||
.OBJDIR = <curdir>
|
.OBJDIR = <curdir>
|
||||||
.PATH = . <curdir>
|
.PATH = . <curdir>
|
||||||
.TARGETS =
|
.TARGETS = # (empty)
|
||||||
.newline =
|
.newline =
|
||||||
|
# (ends with space)
|
||||||
MACHINE = <details omitted>
|
MACHINE = <details omitted>
|
||||||
MACHINE_ARCH = <details omitted>
|
MACHINE_ARCH = <details omitted>
|
||||||
MAKE = <details omitted>
|
MAKE = <details omitted>
|
||||||
|
@ -50,8 +50,8 @@ all : made-target error-target aborted-target
|
|||||||
#*** Global Variables:
|
#*** Global Variables:
|
||||||
.ALLTARGETS = made-target error-target aborted-target aborted-target-dependency all .END
|
.ALLTARGETS = made-target error-target aborted-target aborted-target-dependency all .END
|
||||||
.CURDIR = <curdir>
|
.CURDIR = <curdir>
|
||||||
.INCLUDES =
|
.INCLUDES = # (empty)
|
||||||
.LIBS =
|
.LIBS = # (empty)
|
||||||
.MAKE = <details omitted>
|
.MAKE = <details omitted>
|
||||||
.MAKE.DEPENDFILE = <details omitted>
|
.MAKE.DEPENDFILE = <details omitted>
|
||||||
.MAKE.GID = <details omitted>
|
.MAKE.GID = <details omitted>
|
||||||
@ -63,12 +63,12 @@ all : made-target error-target aborted-target
|
|||||||
.MAKE.PPID = <details omitted>
|
.MAKE.PPID = <details omitted>
|
||||||
.MAKE.UID = <details omitted>
|
.MAKE.UID = <details omitted>
|
||||||
.MAKEFLAGS = -r -k -d g2
|
.MAKEFLAGS = -r -k -d g2
|
||||||
.MAKEOVERRIDES =
|
.MAKEOVERRIDES = # (empty)
|
||||||
.OBJDIR = <curdir>
|
.OBJDIR = <curdir>
|
||||||
.PATH = . <curdir>
|
.PATH = . <curdir>
|
||||||
.TARGETS = all
|
.TARGETS = all
|
||||||
.newline =
|
.newline =
|
||||||
|
# (ends with space)
|
||||||
MACHINE = <details omitted>
|
MACHINE = <details omitted>
|
||||||
MACHINE_ARCH = <details omitted>
|
MACHINE_ARCH = <details omitted>
|
||||||
MAKE = <details omitted>
|
MAKE = <details omitted>
|
||||||
|
@ -50,8 +50,8 @@ all : made-target error-target aborted-target
|
|||||||
#*** Global Variables:
|
#*** Global Variables:
|
||||||
.ALLTARGETS = made-target error-target aborted-target aborted-target-dependency all .END
|
.ALLTARGETS = made-target error-target aborted-target aborted-target-dependency all .END
|
||||||
.CURDIR = <curdir>
|
.CURDIR = <curdir>
|
||||||
.INCLUDES =
|
.INCLUDES = # (empty)
|
||||||
.LIBS =
|
.LIBS = # (empty)
|
||||||
.MAKE = <details omitted>
|
.MAKE = <details omitted>
|
||||||
.MAKE.DEPENDFILE = <details omitted>
|
.MAKE.DEPENDFILE = <details omitted>
|
||||||
.MAKE.GID = <details omitted>
|
.MAKE.GID = <details omitted>
|
||||||
@ -63,12 +63,12 @@ all : made-target error-target aborted-target
|
|||||||
.MAKE.PPID = <details omitted>
|
.MAKE.PPID = <details omitted>
|
||||||
.MAKE.UID = <details omitted>
|
.MAKE.UID = <details omitted>
|
||||||
.MAKEFLAGS = -r -k -d g3
|
.MAKEFLAGS = -r -k -d g3
|
||||||
.MAKEOVERRIDES =
|
.MAKEOVERRIDES = # (empty)
|
||||||
.OBJDIR = <curdir>
|
.OBJDIR = <curdir>
|
||||||
.PATH = . <curdir>
|
.PATH = . <curdir>
|
||||||
.TARGETS = all
|
.TARGETS = all
|
||||||
.newline =
|
.newline =
|
||||||
|
# (ends with space)
|
||||||
MACHINE = <details omitted>
|
MACHINE = <details omitted>
|
||||||
MACHINE_ARCH = <details omitted>
|
MACHINE_ARCH = <details omitted>
|
||||||
MAKE = <details omitted>
|
MAKE = <details omitted>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: opt-debug-parse.mk,v 1.6 2022/01/08 23:52:26 rillig Exp $
|
# $NetBSD: opt-debug-parse.mk,v 1.7 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the -dp command line option, which adds debug logging about
|
# Tests for the -dp command line option, which adds debug logging about
|
||||||
# makefile parsing.
|
# makefile parsing.
|
||||||
@ -20,7 +20,7 @@
|
|||||||
.info trace with multi-line .for loop head
|
.info trace with multi-line .for loop head
|
||||||
.endfor
|
.endfor
|
||||||
|
|
||||||
# Before parse.c 1.461 from 2022-01-08, the debug log said it returned to
|
# Before parse.c 1.641 from 2022-01-08, the debug log said it returned to
|
||||||
# the line of the '.include' instead of the line following it.
|
# the line of the '.include' instead of the line following it.
|
||||||
.include "/dev/null"
|
.include "/dev/null"
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Global: ASSIGNED = value
|
Global: ASSIGNED = value
|
||||||
Global: SUBST =
|
Global: SUBST = # (empty)
|
||||||
Global: SUBST = value
|
Global: SUBST = value
|
||||||
Var_Parse: y(ASSIGNED) (eval)
|
Var_Parse: y(ASSIGNED) (eval)
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
make: "opt-env.mk" line 9: Malformed conditional (${FROM_ENV} != value-from-env)
|
make: "opt-env.mk" line 13: Malformed conditional (${FROM_ENV} != value-from-env)
|
||||||
make: "opt-env.mk" line 16: value-from-mk
|
make: "opt-env.mk" line 20: value-from-mk
|
||||||
|
|
||||||
make: stopped in unit-tests
|
make: stopped in unit-tests
|
||||||
exit status 1
|
exit status 1
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
# $NetBSD: opt-env.mk,v 1.3 2022/01/23 16:09:38 rillig Exp $
|
# $NetBSD: opt-env.mk,v 1.4 2022/03/26 13:32:31 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the -e command line option.
|
# Tests for the -e command line option, which looks up environment variables
|
||||||
|
# before those from the global scope. It has no influence on variables from
|
||||||
|
# the command line though.
|
||||||
|
#
|
||||||
|
# This option is required by POSIX.
|
||||||
|
|
||||||
# The variable FROM_ENV is defined in ./Makefile.
|
# The variable FROM_ENV is defined in ./Makefile.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: opt-file.mk,v 1.14 2021/12/09 20:47:33 rillig Exp $
|
# $NetBSD: opt-file.mk,v 1.15 2022/03/26 13:32:31 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the -f command line option, which adds a makefile to the list of
|
# Tests for the -f command line option, which adds a makefile to the list of
|
||||||
# files that are parsed.
|
# files that are parsed.
|
||||||
@ -15,7 +15,7 @@ all: file-containing-null-byte
|
|||||||
# possible.
|
# possible.
|
||||||
#
|
#
|
||||||
# In the unlikely case where a file ends in a backslash instead of a newline,
|
# In the unlikely case where a file ends in a backslash instead of a newline,
|
||||||
# that backslash is trimmed. See ParseGetLine.
|
# that backslash is trimmed. See ReadLowLevelLine.
|
||||||
#
|
#
|
||||||
# make-2014.01.01.00.00.00 invoked undefined behavior, reading text from
|
# make-2014.01.01.00.00.00 invoked undefined behavior, reading text from
|
||||||
# outside of the file buffer.
|
# outside of the file buffer.
|
||||||
@ -52,7 +52,7 @@ file-ending-in-backslash-mmap: .PHONY
|
|||||||
|
|
||||||
# Since parse.c 1.511 from 2020-12-22, an assertion in ParseGetLine failed
|
# Since parse.c 1.511 from 2020-12-22, an assertion in ParseGetLine failed
|
||||||
# for lines that contained trailing whitespace. Worked around in parse.c
|
# for lines that contained trailing whitespace. Worked around in parse.c
|
||||||
# 1.513, properly fixed in parse.c 1.514.
|
# 1.513, properly fixed in parse.c 1.514 from 2020-12-22.
|
||||||
line-with-trailing-whitespace: .PHONY
|
line-with-trailing-whitespace: .PHONY
|
||||||
@printf '%s' 'VAR=$@ ' > opt-file-trailing-whitespace
|
@printf '%s' 'VAR=$@ ' > opt-file-trailing-whitespace
|
||||||
@${MAKE} -r -f opt-file-trailing-whitespace -V VAR
|
@${MAKE} -r -f opt-file-trailing-whitespace -V VAR
|
||||||
|
32
unit-tests/opt-keep-going-indirect.exp
Normal file
32
unit-tests/opt-keep-going-indirect.exp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
direct compat
|
||||||
|
false
|
||||||
|
*** Error code 1 (continuing)
|
||||||
|
|
||||||
|
Stop.
|
||||||
|
make: stopped in unit-tests
|
||||||
|
exited 1
|
||||||
|
|
||||||
|
direct jobs
|
||||||
|
false
|
||||||
|
*** [direct] Error code 1
|
||||||
|
|
||||||
|
make: stopped in unit-tests
|
||||||
|
exited 1
|
||||||
|
|
||||||
|
indirect compat
|
||||||
|
false
|
||||||
|
*** Error code 1 (continuing)
|
||||||
|
`indirect' not remade because of errors.
|
||||||
|
|
||||||
|
Stop.
|
||||||
|
make: stopped in unit-tests
|
||||||
|
exited 1
|
||||||
|
|
||||||
|
indirect jobs
|
||||||
|
false
|
||||||
|
*** [direct] Error code 1
|
||||||
|
|
||||||
|
make: stopped in unit-tests
|
||||||
|
exited 1
|
||||||
|
|
||||||
|
exit status 0
|
90
unit-tests/opt-keep-going-indirect.mk
Normal file
90
unit-tests/opt-keep-going-indirect.mk
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
# $NetBSD: opt-keep-going-indirect.mk,v 1.2 2022/02/12 20:05:36 rillig Exp $
|
||||||
|
#
|
||||||
|
# Tests for the -k command line option, which stops building a target as soon
|
||||||
|
# as an error is detected, but continues building the other, independent
|
||||||
|
# targets, as far as possible.
|
||||||
|
#
|
||||||
|
# History:
|
||||||
|
# In 1993, the exit status for the option '-k' was always 0, even if a
|
||||||
|
# direct or an indirect target failed.
|
||||||
|
#
|
||||||
|
# Since 2000.12.30.02.05.21, the word '(continuing)' is missing in jobs
|
||||||
|
# mode, both for direct as well as indirect targets.
|
||||||
|
#
|
||||||
|
# Since 2001.10.16.18.50.12, the exit status for a direct failure in
|
||||||
|
# compat mode is the correct 1, while jobs mode and indirect failures
|
||||||
|
# still return the wrong exit status 0. The number of empty lines
|
||||||
|
# between the various error messages differs between the modes, for no
|
||||||
|
# reason.
|
||||||
|
#
|
||||||
|
# At 2006.11.17.22.07.39, the exit status for direct failures in both
|
||||||
|
# modes and for indirect failures in jobs mode was fixed to the correct
|
||||||
|
# 1. The exit status for indirect failures in compat mode is still the
|
||||||
|
# wrong 0. On the downside, a failed indirect target in jobs mode is no
|
||||||
|
# longer listed as "not remade because of errors".
|
||||||
|
#
|
||||||
|
# At 2016.08.26.23.28.39, the additional empty line for a direct failure
|
||||||
|
# in compat mode was removed, making it consistent with a direct failure
|
||||||
|
# in jobs mode. This left only one inconsistency, in that indirect
|
||||||
|
# failures in jobs mode (by far the most common when building large
|
||||||
|
# projects) did not produce any empty line.
|
||||||
|
#
|
||||||
|
# Since 2020.12.07.00.53.30, the exit status is consistently 1 for
|
||||||
|
# failures in all 4 modes.
|
||||||
|
#
|
||||||
|
# Bugs:
|
||||||
|
# The output in case of a failure needlessly differs between compat and
|
||||||
|
# jobs mode. As of 2022-02-12, compat mode outputs '(continuing)' while
|
||||||
|
# jobs mode doesn't. In compat mode, the output does not mention which
|
||||||
|
# target failed.
|
||||||
|
#
|
||||||
|
# See also:
|
||||||
|
# https://gnats.netbsd.org/49720
|
||||||
|
|
||||||
|
.PHONY: all direct indirect
|
||||||
|
|
||||||
|
# The 'set +e' was necessary in 2003, when the shell was run with '-e' by
|
||||||
|
# default.
|
||||||
|
# The 'env -i' prevents that the environment variable MAKEFLAGS is passed down
|
||||||
|
# to the child processes.
|
||||||
|
all:
|
||||||
|
@echo 'direct compat'
|
||||||
|
@set +e; env -i ${MAKE} -r -f ${MAKEFILE} -k direct; echo "exited $$?"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
@echo 'direct jobs'
|
||||||
|
@set +e; env -i ${MAKE} -r -f ${MAKEFILE} -k direct -j1; echo "exited $$?"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
@echo 'indirect compat'
|
||||||
|
@set +e; env -i ${MAKE} -r -f ${MAKEFILE} -k indirect; echo "exited $$?"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
@echo 'indirect jobs'
|
||||||
|
@set +e; env -i ${MAKE} -r -f ${MAKEFILE} -k indirect -j1; echo "exited $$?"
|
||||||
|
@echo
|
||||||
|
|
||||||
|
indirect: direct
|
||||||
|
direct:
|
||||||
|
false
|
||||||
|
|
||||||
|
# TODO: Mention the target that failed, maybe even the chain of targets.
|
||||||
|
# expect: direct compat
|
||||||
|
# expect: *** Error code 1 (continuing)
|
||||||
|
# expect: exited 1
|
||||||
|
|
||||||
|
# TODO: Add '(continuing)'.
|
||||||
|
# expect: direct jobs
|
||||||
|
# expect: *** [direct] Error code 1
|
||||||
|
# expect: exited 1
|
||||||
|
|
||||||
|
# TODO: Mention the target that failed, maybe even the chain of targets.
|
||||||
|
# expect: indirect compat
|
||||||
|
# expect: *** Error code 1 (continuing)
|
||||||
|
# expect: exited 1
|
||||||
|
|
||||||
|
# TODO: Add '(continuing)'.
|
||||||
|
# TODO: Add 'not remade because of errors'.
|
||||||
|
# expect: indirect jobs
|
||||||
|
# expect: *** [direct] Error code 1
|
||||||
|
# expect: exited 1
|
@ -1102,7 +1102,6 @@ opt-_j____-tgt-__s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j____-tgt-__s-cmd-_i_
|
opt-_j____-tgt-__s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1117,7 +1116,6 @@ opt-_j____-tgt-__s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j____-tgt-__s-cmd-ai_
|
opt-_j____-tgt-__s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1170,7 +1168,6 @@ running
|
|||||||
*** [opt-_j____-tgt-_is-cmd-__s] Error code 1 (ignored)
|
*** [opt-_j____-tgt-_is-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_j____-tgt-_is-cmd-_i_
|
opt-_j____-tgt-_is-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1187,7 +1184,6 @@ running
|
|||||||
*** [opt-_j____-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
*** [opt-_j____-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_j____-tgt-_is-cmd-ai_
|
opt-_j____-tgt-_is-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1234,7 +1230,6 @@ opt-_j____-tgt-a_s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j____-tgt-a_s-cmd-_i_
|
opt-_j____-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1249,7 +1244,6 @@ opt-_j____-tgt-a_s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j____-tgt-a_s-cmd-ai_
|
opt-_j____-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1302,7 +1296,6 @@ running
|
|||||||
*** [opt-_j____-tgt-ais-cmd-__s] Error code 1 (ignored)
|
*** [opt-_j____-tgt-ais-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_j____-tgt-ais-cmd-_i_
|
opt-_j____-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1319,7 +1312,6 @@ running
|
|||||||
*** [opt-_j____-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
*** [opt-_j____-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_j____-tgt-ais-cmd-ai_
|
opt-_j____-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_j____-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_j____-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1496,7 +1488,6 @@ opt-_j_n__-tgt-a_s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-a_s-cmd-_i_
|
opt-_j_n__-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-a_s-cmd-_is
|
opt-_j_n__-tgt-a_s-cmd-_is
|
||||||
@ -1509,7 +1500,6 @@ opt-_j_n__-tgt-a_s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-a_s-cmd-ai_
|
opt-_j_n__-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-a_s-cmd-ais
|
opt-_j_n__-tgt-a_s-cmd-ais
|
||||||
@ -1550,7 +1540,6 @@ opt-_j_n__-tgt-ais-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-ais-cmd-_i_
|
opt-_j_n__-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-ais-cmd-_is
|
opt-_j_n__-tgt-ais-cmd-_is
|
||||||
@ -1563,7 +1552,6 @@ opt-_j_n__-tgt-ais-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-ais-cmd-ai_
|
opt-_j_n__-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_j_n__-tgt-ais-cmd-ais
|
opt-_j_n__-tgt-ais-cmd-ais
|
||||||
@ -1612,12 +1600,10 @@ opt-_jl___-tgt-__s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jl___-tgt-__s-cmd-_i_
|
opt-_jl___-tgt-__s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-__s-cmd-_is
|
opt-_jl___-tgt-__s-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-__s-cmd-_is] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-__s-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1628,12 +1614,10 @@ opt-_jl___-tgt-__s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jl___-tgt-__s-cmd-ai_
|
opt-_jl___-tgt-__s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-__s-cmd-ais
|
opt-_jl___-tgt-__s-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-__s-cmd-ais] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-__s-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1686,12 +1670,10 @@ running
|
|||||||
*** [opt-_jl___-tgt-_is-cmd-__s] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-_is-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-_is-cmd-_i_
|
opt-_jl___-tgt-_is-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-_is-cmd-_is
|
opt-_jl___-tgt-_is-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-_is-cmd-_is] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-_is-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1704,12 +1686,10 @@ running
|
|||||||
*** [opt-_jl___-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-_is-cmd-ai_
|
opt-_jl___-tgt-_is-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-_is-cmd-ais
|
opt-_jl___-tgt-_is-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-_is-cmd-ais] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-_is-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1756,12 +1736,10 @@ opt-_jl___-tgt-a_s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jl___-tgt-a_s-cmd-_i_
|
opt-_jl___-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-a_s-cmd-_is
|
opt-_jl___-tgt-a_s-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-a_s-cmd-_is] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-a_s-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1772,12 +1750,10 @@ opt-_jl___-tgt-a_s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jl___-tgt-a_s-cmd-ai_
|
opt-_jl___-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-a_s-cmd-ais
|
opt-_jl___-tgt-a_s-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-a_s-cmd-ais] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-a_s-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1830,12 +1806,10 @@ running
|
|||||||
*** [opt-_jl___-tgt-ais-cmd-__s] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-ais-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-ais-cmd-_i_
|
opt-_jl___-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-ais-cmd-_is
|
opt-_jl___-tgt-ais-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-ais-cmd-_is] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-ais-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -1848,12 +1822,10 @@ running
|
|||||||
*** [opt-_jl___-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-ais-cmd-ai_
|
opt-_jl___-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-_jl___-tgt-ais-cmd-ais
|
opt-_jl___-tgt-ais-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-_jl___-tgt-ais-cmd-ais] Error code 1 (ignored)
|
*** [opt-_jl___-tgt-ais-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -2032,11 +2004,9 @@ opt-_jln__-tgt-a_s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-a_s-cmd-_i_
|
opt-_jln__-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-a_s-cmd-_is
|
opt-_jln__-tgt-a_s-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-a_s-cmd-a__
|
opt-_jln__-tgt-a_s-cmd-a__
|
||||||
@ -2046,11 +2016,9 @@ opt-_jln__-tgt-a_s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-a_s-cmd-ai_
|
opt-_jln__-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-a_s-cmd-ais
|
opt-_jln__-tgt-a_s-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-ai_-cmd-___
|
opt-_jln__-tgt-ai_-cmd-___
|
||||||
@ -2092,11 +2060,9 @@ opt-_jln__-tgt-ais-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-ais-cmd-_i_
|
opt-_jln__-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-ais-cmd-_is
|
opt-_jln__-tgt-ais-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-ais-cmd-a__
|
opt-_jln__-tgt-ais-cmd-a__
|
||||||
@ -2106,11 +2072,9 @@ opt-_jln__-tgt-ais-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-ais-cmd-ai_
|
opt-_jln__-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-_jln__-tgt-ais-cmd-ais
|
opt-_jln__-tgt-ais-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-i_____-tgt-___-cmd-___
|
opt-i_____-tgt-___-cmd-___
|
||||||
@ -3278,7 +3242,6 @@ running
|
|||||||
*** [opt-ij____-tgt-__s-cmd-__s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-__s-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-__s-cmd-_i_
|
opt-ij____-tgt-__s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3295,7 +3258,6 @@ running
|
|||||||
*** [opt-ij____-tgt-__s-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-__s-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-__s-cmd-ai_
|
opt-ij____-tgt-__s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3348,7 +3310,6 @@ running
|
|||||||
*** [opt-ij____-tgt-_is-cmd-__s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-_is-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-_is-cmd-_i_
|
opt-ij____-tgt-_is-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3365,7 +3326,6 @@ running
|
|||||||
*** [opt-ij____-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-_is-cmd-ai_
|
opt-ij____-tgt-_is-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3418,7 +3378,6 @@ running
|
|||||||
*** [opt-ij____-tgt-a_s-cmd-__s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-a_s-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-a_s-cmd-_i_
|
opt-ij____-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3435,7 +3394,6 @@ running
|
|||||||
*** [opt-ij____-tgt-a_s-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-a_s-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-a_s-cmd-ai_
|
opt-ij____-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3488,7 +3446,6 @@ running
|
|||||||
*** [opt-ij____-tgt-ais-cmd-__s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-ais-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-ais-cmd-_i_
|
opt-ij____-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3505,7 +3462,6 @@ running
|
|||||||
*** [opt-ij____-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ij____-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ij____-tgt-ais-cmd-ai_
|
opt-ij____-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ij____-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ij____-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3686,7 +3642,6 @@ opt-ij_n__-tgt-a_s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-a_s-cmd-_i_
|
opt-ij_n__-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-a_s-cmd-_is
|
opt-ij_n__-tgt-a_s-cmd-_is
|
||||||
@ -3699,7 +3654,6 @@ opt-ij_n__-tgt-a_s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-a_s-cmd-ai_
|
opt-ij_n__-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-a_s-cmd-ais
|
opt-ij_n__-tgt-a_s-cmd-ais
|
||||||
@ -3740,7 +3694,6 @@ opt-ij_n__-tgt-ais-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-ais-cmd-_i_
|
opt-ij_n__-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-ais-cmd-_is
|
opt-ij_n__-tgt-ais-cmd-_is
|
||||||
@ -3753,7 +3706,6 @@ opt-ij_n__-tgt-ais-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-ais-cmd-ai_
|
opt-ij_n__-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ij_n__-tgt-ais-cmd-ais
|
opt-ij_n__-tgt-ais-cmd-ais
|
||||||
@ -3808,12 +3760,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-__s-cmd-__s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-__s-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-__s-cmd-_i_
|
opt-ijl___-tgt-__s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-__s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-__s-cmd-_is
|
opt-ijl___-tgt-__s-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-__s-cmd-_is] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-__s-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3826,12 +3776,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-__s-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-__s-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-__s-cmd-ai_
|
opt-ijl___-tgt-__s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-__s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-__s-cmd-ais
|
opt-ijl___-tgt-__s-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-__s-cmd-ais] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-__s-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3884,12 +3832,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-_is-cmd-__s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-_is-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-_is-cmd-_i_
|
opt-ijl___-tgt-_is-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-_is-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-_is-cmd-_is
|
opt-ijl___-tgt-_is-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-_is-cmd-_is] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-_is-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3902,12 +3848,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-_is-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-_is-cmd-ai_
|
opt-ijl___-tgt-_is-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-_is-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-_is-cmd-ais
|
opt-ijl___-tgt-_is-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-_is-cmd-ais] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-_is-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3960,12 +3904,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-a_s-cmd-__s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-a_s-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-a_s-cmd-_i_
|
opt-ijl___-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-a_s-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-a_s-cmd-_is
|
opt-ijl___-tgt-a_s-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-a_s-cmd-_is] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-a_s-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -3978,12 +3920,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-a_s-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-a_s-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-a_s-cmd-ai_
|
opt-ijl___-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-a_s-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-a_s-cmd-ais
|
opt-ijl___-tgt-a_s-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-a_s-cmd-ais] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-a_s-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -4036,12 +3976,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-ais-cmd-__s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-ais-cmd-__s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-ais-cmd-_i_
|
opt-ijl___-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-ais-cmd-_i_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-ais-cmd-_is
|
opt-ijl___-tgt-ais-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-ais-cmd-_is] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-ais-cmd-_is] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -4054,12 +3992,10 @@ running
|
|||||||
*** [opt-ijl___-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-ais-cmd-a_s] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-ais-cmd-ai_
|
opt-ijl___-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-ais-cmd-ai_] Error code 1 (ignored)
|
||||||
|
|
||||||
opt-ijl___-tgt-ais-cmd-ais
|
opt-ijl___-tgt-ais-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
*** [opt-ijl___-tgt-ais-cmd-ais] Error code 1 (ignored)
|
*** [opt-ijl___-tgt-ais-cmd-ais] Error code 1 (ignored)
|
||||||
|
|
||||||
@ -4242,11 +4178,9 @@ opt-ijln__-tgt-a_s-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-a_s-cmd-_i_
|
opt-ijln__-tgt-a_s-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-a_s-cmd-_is
|
opt-ijln__-tgt-a_s-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-a_s-cmd-a__
|
opt-ijln__-tgt-a_s-cmd-a__
|
||||||
@ -4256,11 +4190,9 @@ opt-ijln__-tgt-a_s-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-a_s-cmd-ai_
|
opt-ijln__-tgt-a_s-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-a_s-cmd-ais
|
opt-ijln__-tgt-a_s-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-ai_-cmd-___
|
opt-ijln__-tgt-ai_-cmd-___
|
||||||
@ -4302,11 +4234,9 @@ opt-ijln__-tgt-ais-cmd-__s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-ais-cmd-_i_
|
opt-ijln__-tgt-ais-cmd-_i_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-ais-cmd-_is
|
opt-ijln__-tgt-ais-cmd-_is
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-ais-cmd-a__
|
opt-ijln__-tgt-ais-cmd-a__
|
||||||
@ -4316,10 +4246,8 @@ opt-ijln__-tgt-ais-cmd-a_s
|
|||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-ais-cmd-ai_
|
opt-ijln__-tgt-ais-cmd-ai_
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
|
|
||||||
opt-ijln__-tgt-ais-cmd-ais
|
opt-ijln__-tgt-ais-cmd-ais
|
||||||
echo running; false
|
|
||||||
running
|
running
|
||||||
exit status 0
|
exit status 0
|
||||||
|
@ -81,8 +81,8 @@ ParseDependency(.MAKEFLAGS: -d0 -dg1)
|
|||||||
#*** Global Variables:
|
#*** Global Variables:
|
||||||
.ALLTARGETS = .1.2 .1.3 .1.4 next-main suff-main-several.1 suff-main-several.{2,3,4}
|
.ALLTARGETS = .1.2 .1.3 .1.4 next-main suff-main-several.1 suff-main-several.{2,3,4}
|
||||||
.CURDIR = <curdir>
|
.CURDIR = <curdir>
|
||||||
.INCLUDES =
|
.INCLUDES = # (empty)
|
||||||
.LIBS =
|
.LIBS = # (empty)
|
||||||
.MAKE = <details omitted>
|
.MAKE = <details omitted>
|
||||||
.MAKE.DEPENDFILE = <details omitted>
|
.MAKE.DEPENDFILE = <details omitted>
|
||||||
.MAKE.GID = <details omitted>
|
.MAKE.GID = <details omitted>
|
||||||
@ -94,12 +94,12 @@ ParseDependency(.MAKEFLAGS: -d0 -dg1)
|
|||||||
.MAKE.PPID = <details omitted>
|
.MAKE.PPID = <details omitted>
|
||||||
.MAKE.UID = <details omitted>
|
.MAKE.UID = <details omitted>
|
||||||
.MAKEFLAGS = -r -k -d mps -d 0 -d g1
|
.MAKEFLAGS = -r -k -d mps -d 0 -d g1
|
||||||
.MAKEOVERRIDES =
|
.MAKEOVERRIDES = # (empty)
|
||||||
.OBJDIR = <curdir>
|
.OBJDIR = <curdir>
|
||||||
.PATH = . <curdir>
|
.PATH = . <curdir>
|
||||||
.TARGETS =
|
.TARGETS = # (empty)
|
||||||
.newline =
|
.newline =
|
||||||
|
# (ends with space)
|
||||||
MACHINE = <details omitted>
|
MACHINE = <details omitted>
|
||||||
MACHINE_ARCH = <details omitted>
|
MACHINE_ARCH = <details omitted>
|
||||||
MAKE = <details omitted>
|
MAKE = <details omitted>
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#*** Global Variables:
|
#*** Global Variables:
|
||||||
.ALLTARGETS = all
|
.ALLTARGETS = all
|
||||||
.CURDIR = <curdir>
|
.CURDIR = <curdir>
|
||||||
.INCLUDES =
|
.INCLUDES = # (empty)
|
||||||
.LIBS =
|
.LIBS = # (empty)
|
||||||
.MAKE = <details omitted>
|
.MAKE = <details omitted>
|
||||||
.MAKE.DEPENDFILE = <details omitted>
|
.MAKE.DEPENDFILE = <details omitted>
|
||||||
.MAKE.GID = <details omitted>
|
.MAKE.GID = <details omitted>
|
||||||
@ -20,12 +20,12 @@
|
|||||||
.MAKE.PPID = <details omitted>
|
.MAKE.PPID = <details omitted>
|
||||||
.MAKE.UID = <details omitted>
|
.MAKE.UID = <details omitted>
|
||||||
.MAKEFLAGS = -r -k -d g1
|
.MAKEFLAGS = -r -k -d g1
|
||||||
.MAKEOVERRIDES =
|
.MAKEOVERRIDES = # (empty)
|
||||||
.OBJDIR = <curdir>
|
.OBJDIR = <curdir>
|
||||||
.PATH = . <curdir>
|
.PATH = . <curdir>
|
||||||
.TARGETS =
|
.TARGETS = # (empty)
|
||||||
.newline =
|
.newline =
|
||||||
|
# (ends with space)
|
||||||
MACHINE = <details omitted>
|
MACHINE = <details omitted>
|
||||||
MACHINE_ARCH = <details omitted>
|
MACHINE_ARCH = <details omitted>
|
||||||
MAKE = <details omitted>
|
MAKE = <details omitted>
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
# $NetBSD: suff-use.mk,v 1.1 2022/02/07 22:43:50 rillig Exp $
|
# $NetBSD: suff-use.mk,v 1.2 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# This test combines a .USE node with suffix rules, trying to add an
|
# This test combines a .USE node with suffix rules, trying to add an
|
||||||
# additional command before and after successful compilation of a .c file.
|
# additional command before and after successful compilation of a .c file.
|
||||||
#
|
#
|
||||||
# History:
|
# History:
|
||||||
# bin/make-2001.11.12.21.58.18-plain
|
# make-2001.11.12.21.58.18
|
||||||
# | : 'Making demo.c out of nothing'
|
# | : 'Making demo.c out of nothing'
|
||||||
# | make: don't know how to make demo.o. Stop
|
# | make: don't know how to make demo.o. Stop
|
||||||
# |
|
# |
|
||||||
# | make: stopped in /home/rillig/proj/make-archive
|
# | make: stopped in <curdir>
|
||||||
# | exit status 2
|
# | exit status 2
|
||||||
# bin/make-2007.10.11.21.19.28-plain
|
# make-2007.10.11.21.19.28
|
||||||
#
|
#
|
||||||
# bin/make-2014.08.23.15.05.40-plain
|
# make-2014.08.23.15.05.40
|
||||||
# | : 'Making demo.c out of nothing'
|
# | : 'Making demo.c out of nothing'
|
||||||
# | : 'Compiling demo.c to demo.o'
|
# | : 'Compiling demo.c to demo.o'
|
||||||
# | exit status 0
|
# | exit status 0
|
||||||
# bin/make-2014.09.05.06.57.20-plain
|
# make-2014.09.05.06.57.20
|
||||||
#
|
#
|
||||||
# bin/make-2014.09.07.20.55.34-plain
|
# make-2014.09.07.20.55.34
|
||||||
# | : 'Making demo.c out of nothing'
|
# | : 'Making demo.c out of nothing'
|
||||||
# | make: don't know how to make demo.o. Stop
|
# | make: don't know how to make demo.o. Stop
|
||||||
# |
|
# |
|
||||||
# | make: stopped in /home/rillig/proj/make-archive
|
# | make: stopped in <curdir>
|
||||||
# | exit status 2
|
# | exit status 2
|
||||||
# ...
|
# ...
|
||||||
#
|
#
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# $NetBSD: var-op-sunsh.mk,v 1.9 2022/01/16 09:38:04 rillig Exp $
|
# $NetBSD: var-op-sunsh.mk,v 1.10 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the :sh= variable assignment operator, which runs its right-hand
|
# Tests for the :sh= variable assignment operator, which runs its right-hand
|
||||||
# side through the shell. It is a seldom-used alternative to the !=
|
# side through the shell. It is a seldom-used alternative to the !=
|
||||||
# assignment operator, adopted from SUN make.
|
# assignment operator, adopted from Sun make.
|
||||||
|
|
||||||
.MAKEFLAGS: -dL # Enable sane error messages
|
.MAKEFLAGS: -dL # Enable sane error messages
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ Global: .ALLTARGETS = one two
|
|||||||
Var_Parse: ${.MAKE.TARGET_LOCAL_VARIABLES} (eval)
|
Var_Parse: ${.MAKE.TARGET_LOCAL_VARIABLES} (eval)
|
||||||
Var_SetExpand: variable name "" expands to empty string, with value "three" - ignored
|
Var_SetExpand: variable name "" expands to empty string, with value "three" - ignored
|
||||||
Var_SetExpand: variable name "" expands to empty string, with value "three" - ignored
|
Var_SetExpand: variable name "" expands to empty string, with value "three" - ignored
|
||||||
Global: one two =
|
Global: one two = # (empty)
|
||||||
Global: one two = three
|
Global: one two = three
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d 0
|
Global: .MAKEFLAGS = -r -k -d v -d 0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: var-scope-local.mk,v 1.4 2022/02/05 10:41:15 rillig Exp $
|
# $NetBSD: var-scope-local.mk,v 1.5 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for target-local variables, such as ${.TARGET} or $@. These variables
|
# Tests for target-local variables, such as ${.TARGET} or $@. These variables
|
||||||
# are relatively short-lived as they are created just before making the
|
# are relatively short-lived as they are created just before making the
|
||||||
@ -18,7 +18,7 @@
|
|||||||
# these expressions to expand right in time when the target-local variables
|
# these expressions to expand right in time when the target-local variables
|
||||||
# are actually set.
|
# are actually set.
|
||||||
#
|
#
|
||||||
# Conditions like the ones below are evaluated in the scope of the command
|
# Conditions from .if directives are evaluated in the scope of the command
|
||||||
# line, which means that variables from the command line, from the global
|
# line, which means that variables from the command line, from the global
|
||||||
# scope and from the environment are resolved, in this order (but see the
|
# scope and from the environment are resolved, in this order (but see the
|
||||||
# command line option '-e'). In that phase, expressions involving
|
# command line option '-e'). In that phase, expressions involving
|
||||||
@ -33,15 +33,16 @@
|
|||||||
# expressions like ${@}, ${.TARGET} ${VAR:Mpattern} (see Var_Parse,
|
# expressions like ${@}, ${.TARGET} ${VAR:Mpattern} (see Var_Parse,
|
||||||
# ParseVarname).
|
# ParseVarname).
|
||||||
#
|
#
|
||||||
# In the following condition, make does not expand '$@' but instead changes it
|
# In the following condition, make expands '$@' to the long-format alias
|
||||||
# to the long-format alias '$(.TARGET)'; note that the alias is not written
|
# '$(.TARGET)'; note that the alias is not written with braces, as would be
|
||||||
# with braces, as would be common in BSD makefiles, but with parentheses.
|
# common in BSD makefiles, but with parentheses. This alternative spelling
|
||||||
# This alternative form behaves equivalently though.
|
# behaves the same though.
|
||||||
.if $@ != "\$\(.TARGET)"
|
.if $@ != "\$\(.TARGET)"
|
||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
# In the long form of writing a target-local variable, the expression is
|
# In the long form of writing a target-local variable, the text of the
|
||||||
# preserved exactly as written, no matter whether with '{' or '('.
|
# expression is preserved exactly as written, no matter whether it is written
|
||||||
|
# with '{' or '('.
|
||||||
.if ${@} != "\$\{@}"
|
.if ${@} != "\$\{@}"
|
||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
@ -60,7 +61,7 @@
|
|||||||
# In the following examples, the expressions are based on target-local
|
# In the following examples, the expressions are based on target-local
|
||||||
# variables but use the modifier ':L', which turns an undefined expression
|
# variables but use the modifier ':L', which turns an undefined expression
|
||||||
# into a defined one. At the end of evaluating the expression, the state of
|
# into a defined one. At the end of evaluating the expression, the state of
|
||||||
# the expression is not 'undefined' anymore, and the value of the expression
|
# the expression is not 'undefined' anymore. The value of the expression
|
||||||
# is the name of the variable, since that's what the modifier ':L' does.
|
# is the name of the variable, since that's what the modifier ':L' does.
|
||||||
.if ${@:L} != "@"
|
.if ${@:L} != "@"
|
||||||
. error
|
. error
|
||||||
@ -164,10 +165,11 @@ var-scope-local-append.o: VAR+= local
|
|||||||
var-scope-local-append.o: VAR += to ${.TARGET}
|
var-scope-local-append.o: VAR += to ${.TARGET}
|
||||||
# To access the value of a global variable, use a variable expression. This
|
# To access the value of a global variable, use a variable expression. This
|
||||||
# expression is expanded before parsing the whole dependency line. Since the
|
# expression is expanded before parsing the whole dependency line. Since the
|
||||||
# expansion happens to the right of both the dependency operator ':' and also
|
# expansion happens to the right of the dependency operator ':', the expanded
|
||||||
# to the right of the assignment operator '=', the expanded text does not
|
# text does not influence parsing of the dependency line. Since the expansion
|
||||||
# affect the dependency or the variable assignment structurally. The
|
# happens to the right of the assignment operator '=', the expanded text does
|
||||||
# effective variable assignment, after expanding the whole line first, is thus
|
# not influence the parsing of the variable assignment. The effective
|
||||||
|
# variable assignment, after expanding the whole line first, is thus
|
||||||
# 'VAR= global+local'.
|
# 'VAR= global+local'.
|
||||||
# expect: : Making var-scope-local-append-global.o with VAR="global+local".
|
# expect: : Making var-scope-local-append-global.o with VAR="global+local".
|
||||||
var-scope-local-append-global.o: VAR= ${VAR}+local
|
var-scope-local-append-global.o: VAR= ${VAR}+local
|
||||||
@ -182,17 +184,22 @@ var-scope-local-default.o: VAR ?= second
|
|||||||
# Using the variable assignment operator ':=' provides another way of
|
# Using the variable assignment operator ':=' provides another way of
|
||||||
# accessing a global variable and extending it with local modifications. The
|
# accessing a global variable and extending it with local modifications. The
|
||||||
# '$' has to be written as '$$' though to survive the expansion of the
|
# '$' has to be written as '$$' though to survive the expansion of the
|
||||||
# dependency line as a whole.
|
# dependency line as a whole. After that, the parser sees the variable
|
||||||
|
# assignment as 'VAR := ${VAR}+local' and searches for the variable 'VAR' in
|
||||||
|
# the usual scopes, picking up the variable from the global scope.
|
||||||
|
# expect: : Making var-scope-local-subst.o with VAR="global+local".
|
||||||
var-scope-local-subst.o: VAR := $${VAR}+local
|
var-scope-local-subst.o: VAR := $${VAR}+local
|
||||||
|
|
||||||
# The variable assignment operator '!=' assigns the output of the shell
|
# The variable assignment operator '!=' assigns the output of the shell
|
||||||
# command, as everywhere else.
|
# command, as everywhere else. The shell command is run when the dependency
|
||||||
|
# line is parsed.
|
||||||
var-scope-local-shell.o: VAR != echo output
|
var-scope-local-shell.o: VAR != echo output
|
||||||
|
|
||||||
|
|
||||||
# While VAR=use will be set for a .USE node, it will never be seen since only
|
# While VAR=use will be set for a .USE node, it will never be seen since only
|
||||||
# the ultimate target's context is searched; the variable assignments from the
|
# the ultimate target's context is searched; the variable assignments from the
|
||||||
# .USE target are not copied to the ultimate target's.
|
# .USE target are not copied to the ultimate target's.
|
||||||
|
# expect: : var-scope-local-use.o uses .USE VAR="global"
|
||||||
a_use: .USE VAR=use
|
a_use: .USE VAR=use
|
||||||
: ${.TARGET} uses .USE VAR="${VAR}"
|
: ${.TARGET} uses .USE VAR="${VAR}"
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
Global:delete FROM_CMDLINE (not found)
|
Global: delete FROM_CMDLINE (not found)
|
||||||
Command: FROM_CMDLINE =
|
Command: FROM_CMDLINE = # (empty)
|
||||||
Global: .MAKEOVERRIDES = FROM_CMDLINE
|
Global: .MAKEOVERRIDES = FROM_CMDLINE
|
||||||
Global: VAR = added
|
Global: VAR = added
|
||||||
Global: VAR = overwritten
|
Global: VAR = overwritten
|
||||||
Global:delete VAR
|
Global: delete VAR
|
||||||
Global:delete VAR (not found)
|
Global: delete VAR (not found)
|
||||||
Var_SetExpand: variable name "${:U}" expands to empty string, with value "empty name" - ignored
|
Var_SetExpand: variable name "${:U}" expands to empty string, with value "empty name" - ignored
|
||||||
Var_AppendExpand: variable name "${:U}" expands to empty string, with value "empty name" - ignored
|
Var_AppendExpand: variable name "${:U}" expands to empty string, with value "empty name" - ignored
|
||||||
Global: FROM_CMDLINE = overwritten ignored!
|
Global: FROM_CMDLINE = overwritten ignored!
|
||||||
@ -49,7 +49,7 @@ Evaluating modifier ${:M...} on value "value" (eval-defined, defined)
|
|||||||
Pattern for ':M' is "valu[e]"
|
Pattern for ':M' is "valu[e]"
|
||||||
ModifyWords: split "value" into 1 word
|
ModifyWords: split "value" into 1 word
|
||||||
Result of ${:Mvalu[e]} is "value" (eval-defined, defined)
|
Result of ${:Mvalu[e]} is "value" (eval-defined, defined)
|
||||||
Global:delete VAR
|
Global: delete VAR
|
||||||
Var_Parse: ${:Uvariable:unknown} (eval-defined)
|
Var_Parse: ${:Uvariable:unknown} (eval-defined)
|
||||||
Evaluating modifier ${:U...} on value "" (eval-defined, undefined)
|
Evaluating modifier ${:U...} on value "" (eval-defined, undefined)
|
||||||
Result of ${:Uvariable} is "variable" (eval-defined, defined)
|
Result of ${:Uvariable} is "variable" (eval-defined, defined)
|
||||||
@ -59,7 +59,7 @@ Result of ${:unknown} is error (eval-defined, defined)
|
|||||||
make: "vardebug.mk" line 44: Malformed conditional (${:Uvariable:unknown})
|
make: "vardebug.mk" line 44: Malformed conditional (${:Uvariable:unknown})
|
||||||
Var_Parse: ${UNDEFINED} (eval-defined)
|
Var_Parse: ${UNDEFINED} (eval-defined)
|
||||||
make: "vardebug.mk" line 53: Malformed conditional (${UNDEFINED})
|
make: "vardebug.mk" line 53: Malformed conditional (${UNDEFINED})
|
||||||
Global:delete .SHELL (not found)
|
Global: delete .SHELL (not found)
|
||||||
Command: .SHELL = </path/to/shell>
|
Command: .SHELL = </path/to/shell>
|
||||||
Command: .SHELL = overwritten ignored (read-only)
|
Command: .SHELL = overwritten ignored (read-only)
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
make: "varmod-assign-shell.mk" line 27: warning: "echo output; false" returned non-zero status
|
make: "varmod-assign-shell.mk" line 27: warning: "echo output; false" returned non-zero status
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Var_Parse: ${ASSIGNED::!=echo output; ${:Ufalse}} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${ASSIGNED::!=echo output; ${:Ufalse}} (eval-keep-dollar-and-undefined)
|
||||||
Evaluating modifier ${ASSIGNED::...} on value "previous" (eval-keep-dollar-and-undefined, regular)
|
Evaluating modifier ${ASSIGNED::...} on value "previous" (eval-keep-dollar-and-undefined, regular)
|
||||||
Modifier part: "echo output; false"
|
Modifier part: "echo output; false"
|
||||||
Capturing the output of command "echo output; false"
|
Capturing the output of command "echo output; false"
|
||||||
make: "echo output; false" returned non-zero status
|
make: "echo output; false" returned non-zero status
|
||||||
Result of ${ASSIGNED::!=echo output; ${:Ufalse}} is "" (eval-keep-dollar-and-undefined, regular)
|
Result of ${ASSIGNED::!=echo output; ${:Ufalse}} is "" (eval-keep-dollar-and-undefined, regular)
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d 0
|
Global: .MAKEFLAGS = -r -k -d v -d 0
|
||||||
DIRECT=output
|
DIRECT=output
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: varmod-assign.mk,v 1.14 2021/12/05 10:13:44 rillig Exp $
|
# $NetBSD: varmod-assign.mk,v 1.15 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the obscure ::= variable modifiers, which perform variable
|
# Tests for the obscure ::= variable modifiers, which perform variable
|
||||||
# assignments during evaluation, just like the = operator in C.
|
# assignments during evaluation, just like the = operator in C.
|
||||||
@ -34,8 +34,8 @@ all: mod-assign-shell-error
|
|||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
# The assignments happen in the global scope and thus are preserved even after
|
# The assignments were performed as part of .if conditions and thus happened
|
||||||
# the shell command has been run and the condition has been evaluated.
|
# in the command line scope.
|
||||||
.if "${FIRST}, ${LAST}, ${APPENDED}, ${RAN}" != "1, 3, 1 2 3, <3>"
|
.if "${FIRST}, ${LAST}, ${APPENDED}, ${RAN}" != "1, 3, 1 2 3, <3>"
|
||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
@ -84,7 +84,8 @@ mod-assign-empty:
|
|||||||
mod-assign-parse:
|
mod-assign-parse:
|
||||||
# The modifier for assignment operators starts with a ':'.
|
# The modifier for assignment operators starts with a ':'.
|
||||||
# An 'x' after that is an invalid modifier.
|
# An 'x' after that is an invalid modifier.
|
||||||
@echo ${ASSIGN::x} # 'x' is an unknown assignment operator
|
# expect: make: Unknown modifier ":x"
|
||||||
|
@echo ${ASSIGN::x}
|
||||||
|
|
||||||
# When parsing an assignment operator fails because the operator is
|
# When parsing an assignment operator fails because the operator is
|
||||||
# incomplete, make falls back to the SysV modifier.
|
# incomplete, make falls back to the SysV modifier.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Global: 8_DOLLARS = $$$$$$$$
|
Global: 8_DOLLARS = $$$$$$$$
|
||||||
Global: VAR =
|
Global: VAR = # (empty)
|
||||||
Var_Parse: ${8_DOLLARS} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${8_DOLLARS} (eval-keep-dollar-and-undefined)
|
||||||
Global: VAR = $$$$$$$$
|
Global: VAR = $$$$$$$$
|
||||||
Var_Parse: ${VAR:D${8_DOLLARS}} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${VAR:D${8_DOLLARS}} (eval-keep-dollar-and-undefined)
|
||||||
@ -15,7 +15,7 @@ ModifyWords: split "$$$$$$$$" into 1 word
|
|||||||
Global: var = $$$$$$$$
|
Global: var = $$$$$$$$
|
||||||
Var_Parse: ${8_DOLLARS} (eval-keep-undefined)
|
Var_Parse: ${8_DOLLARS} (eval-keep-undefined)
|
||||||
ModifyWord_Loop: in "$$$$$$$$", replace "var" with "${8_DOLLARS}" to "$$$$"
|
ModifyWord_Loop: in "$$$$$$$$", replace "var" with "${8_DOLLARS}" to "$$$$"
|
||||||
Global:delete var
|
Global: delete var
|
||||||
Result of ${VAR:@var@${8_DOLLARS}@} is "$$$$" (eval-keep-dollar-and-undefined, regular)
|
Result of ${VAR:@var@${8_DOLLARS}@} is "$$$$" (eval-keep-dollar-and-undefined, regular)
|
||||||
Global: VAR = $$$$
|
Global: VAR = $$$$
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
|
@ -7,14 +7,14 @@ make: Bad conditional expression '1 == == 2' in '1 == == 2?yes:no'
|
|||||||
make: "varmod-ifelse.mk" line 66: Malformed conditional (${1 == == 2:?yes:no} != "")
|
make: "varmod-ifelse.mk" line 66: Malformed conditional (${1 == == 2:?yes:no} != "")
|
||||||
CondParser_Eval: "${1 == == 2:?yes:no}" != ""
|
CondParser_Eval: "${1 == == 2:?yes:no}" != ""
|
||||||
CondParser_Eval: 1 == == 2
|
CondParser_Eval: 1 == == 2
|
||||||
lhs = 1.000000, rhs = 0.000000, op = ==
|
Comparing 1.000000 == 0.000000
|
||||||
make: Bad conditional expression '1 == == 2' in '1 == == 2?yes:no'
|
make: Bad conditional expression '1 == == 2' in '1 == == 2?yes:no'
|
||||||
lhs = "", rhs = "", op = !=
|
Comparing "" != ""
|
||||||
make: "varmod-ifelse.mk" line 92: warning: Oops, the parse error should have been propagated.
|
make: "varmod-ifelse.mk" line 92: warning: Oops, the parse error should have been propagated.
|
||||||
CondParser_Eval: ${ ${:U\$}{VAR} == value :?ok:bad} != "ok"
|
CondParser_Eval: ${ ${:U\$}{VAR} == value :?ok:bad} != "ok"
|
||||||
CondParser_Eval: ${VAR} == value
|
CondParser_Eval: ${VAR} == value
|
||||||
lhs = "value", rhs = "value", op = ==
|
Comparing "value" == "value"
|
||||||
lhs = "ok", rhs = "ok", op = !=
|
Comparing "ok" != "ok"
|
||||||
make: "varmod-ifelse.mk" line 153: no.
|
make: "varmod-ifelse.mk" line 153: no.
|
||||||
make: "varmod-ifelse.mk" line 154: String comparison operator must be either == or !=
|
make: "varmod-ifelse.mk" line 154: String comparison operator must be either == or !=
|
||||||
make: Bad conditional expression 'string == "literal" || no >= 10' in 'string == "literal" || no >= 10?yes:no'
|
make: Bad conditional expression 'string == "literal" || no >= 10' in 'string == "literal" || no >= 10?yes:no'
|
||||||
|
@ -11,7 +11,7 @@ make: "varmod-indirect.mk" line 156: Unknown modifier "Z"
|
|||||||
make: "varmod-indirect.mk" line 157: before
|
make: "varmod-indirect.mk" line 157: before
|
||||||
make: "varmod-indirect.mk" line 157: after
|
make: "varmod-indirect.mk" line 157: after
|
||||||
Parsing line 166: _:= before ${UNDEF} after
|
Parsing line 166: _:= before ${UNDEF} after
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Var_Parse: ${UNDEF} after (eval-keep-dollar-and-undefined)
|
Var_Parse: ${UNDEF} after (eval-keep-dollar-and-undefined)
|
||||||
Global: _ = before ${UNDEF} after
|
Global: _ = before ${UNDEF} after
|
||||||
Parsing line 169: _:= before ${UNDEF:${:US,a,a,}} after
|
Parsing line 169: _:= before ${UNDEF:${:US,a,a,}} after
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
Parsing line 78: USE_8_DOLLARS= ${:U1:@var@${8_DOLLARS}@} ${8_DOLLARS} $$$$$$$$
|
Parsing line 78: USE_8_DOLLARS= ${:U1:@var@${8_DOLLARS}@} ${8_DOLLARS} $$$$$$$$
|
||||||
CondParser_Eval: ${USE_8_DOLLARS} != "\$\$\$\$ \$\$\$\$ \$\$\$\$"
|
CondParser_Eval: ${USE_8_DOLLARS} != "\$\$\$\$ \$\$\$\$ \$\$\$\$"
|
||||||
lhs = "$$$$ $$$$ $$$$", rhs = "$$$$ $$$$ $$$$", op = !=
|
Comparing "$$$$ $$$$ $$$$" != "$$$$ $$$$ $$$$"
|
||||||
Parsing line 83: SUBST_CONTAINING_LOOP:= ${USE_8_DOLLARS}
|
Parsing line 83: SUBST_CONTAINING_LOOP:= ${USE_8_DOLLARS}
|
||||||
CondParser_Eval: ${SUBST_CONTAINING_LOOP} != "\$\$ \$\$\$\$ \$\$\$\$"
|
CondParser_Eval: ${SUBST_CONTAINING_LOOP} != "\$\$ \$\$\$\$ \$\$\$\$"
|
||||||
lhs = "$$ $$$$ $$$$", rhs = "$$ $$$$ $$$$", op = !=
|
Comparing "$$ $$$$ $$$$" != "$$ $$$$ $$$$"
|
||||||
Parsing line 108: .MAKEFLAGS: -d0
|
Parsing line 108: .MAKEFLAGS: -d0
|
||||||
ParseDependency(.MAKEFLAGS: -d0)
|
ParseDependency(.MAKEFLAGS: -d0)
|
||||||
:varname-overwriting-target: :x1y x2y x3y: ::
|
:varname-overwriting-target: :x1y x2y x3y: ::
|
||||||
|
@ -10,7 +10,7 @@ Evaluating modifier ${SPECIALS:M...} on value "\: : \\ * \*"
|
|||||||
Pattern for ':M' is ":"
|
Pattern for ':M' is ":"
|
||||||
ModifyWords: split "\: : \\ * \*" into 5 words
|
ModifyWords: split "\: : \\ * \*" into 5 words
|
||||||
Result of ${SPECIALS:M\:${:U}} is ":"
|
Result of ${SPECIALS:M\:${:U}} is ":"
|
||||||
lhs = ":", rhs = ":", op = !=
|
Comparing ":" != ":"
|
||||||
Global: VALUES = : :: :\:
|
Global: VALUES = : :: :\:
|
||||||
CondParser_Eval: ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:}
|
CondParser_Eval: ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:}
|
||||||
Var_Parse: ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:} (eval-defined)
|
Var_Parse: ${VALUES:M\:${:U\:}} != ${VALUES:M${:U\:}\:} (eval-defined)
|
||||||
@ -29,7 +29,7 @@ Result of ${:U\:} is ":" (eval-defined, defined)
|
|||||||
Pattern for ':M' is ":\:"
|
Pattern for ':M' is ":\:"
|
||||||
ModifyWords: split ": :: :\:" into 3 words
|
ModifyWords: split ": :: :\:" into 3 words
|
||||||
Result of ${VALUES:M${:U\:}\:} is "::"
|
Result of ${VALUES:M${:U\:}\:} is "::"
|
||||||
lhs = ":", rhs = "::", op = !=
|
Comparing ":" != "::"
|
||||||
make: "varmod-match-escape.mk" line 42: warning: XXX: Oops
|
make: "varmod-match-escape.mk" line 42: warning: XXX: Oops
|
||||||
Global: .MAKEFLAGS = -r -k -d cv -d
|
Global: .MAKEFLAGS = -r -k -d cv -d
|
||||||
Global: .MAKEFLAGS = -r -k -d cv -d 0
|
Global: .MAKEFLAGS = -r -k -d cv -d 0
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
CondParser_Eval: ${NUMBERS:M[A-Z]*} != "One Two Three Four"
|
CondParser_Eval: ${NUMBERS:M[A-Z]*} != "One Two Three Four"
|
||||||
lhs = "One Two Three Four", rhs = "One Two Three Four", op = !=
|
Comparing "One Two Three Four" != "One Two Three Four"
|
||||||
CondParser_Eval: ${NUMBERS:M[^A-Z]*} != "five six seven"
|
CondParser_Eval: ${NUMBERS:M[^A-Z]*} != "five six seven"
|
||||||
lhs = "five six seven", rhs = "five six seven", op = !=
|
Comparing "five six seven" != "five six seven"
|
||||||
CondParser_Eval: ${NUMBERS:M[^s]*[ex]} != "One Three five"
|
CondParser_Eval: ${NUMBERS:M[^s]*[ex]} != "One Three five"
|
||||||
lhs = "One Three five", rhs = "One Three five", op = !=
|
Comparing "One Three five" != "One Three five"
|
||||||
CondParser_Eval: ${:U****************:M****************b}
|
CondParser_Eval: ${:U****************:M****************b}
|
||||||
CondParser_Eval: ${:Ua \$ sign:M*$$*} != "\$"
|
CondParser_Eval: ${:Ua \$ sign:M*$$*} != "\$"
|
||||||
lhs = "$", rhs = "$", op = !=
|
Comparing "$" != "$"
|
||||||
CondParser_Eval: ${:Ua \$ sign any-asterisk:M*\$*} != "any-asterisk"
|
CondParser_Eval: ${:Ua \$ sign any-asterisk:M*\$*} != "any-asterisk"
|
||||||
lhs = "any-asterisk", rhs = "any-asterisk", op = !=
|
Comparing "any-asterisk" != "any-asterisk"
|
||||||
exit status 0
|
make: "varmod-match.mk" line 146: Unknown modifier "]"
|
||||||
|
make: "varmod-match.mk" line 146: Malformed conditional (${ ${:U\:} ${:U\:\:} :L:M[:]} != ":")
|
||||||
|
make: Fatal errors encountered -- cannot continue
|
||||||
|
make: stopped in unit-tests
|
||||||
|
exit status 1
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: varmod-match.mk,v 1.6 2020/11/15 18:33:41 rillig Exp $
|
# $NetBSD: varmod-match.mk,v 1.8 2022/03/27 18:39:01 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the :M variable modifier, which filters words that match the
|
# Tests for the :M variable modifier, which filters words that match the
|
||||||
# given pattern.
|
# given pattern.
|
||||||
@ -56,5 +56,131 @@ ${:U*}= asterisk
|
|||||||
# TODO: ${VAR:M${UNBALANCED}}
|
# TODO: ${VAR:M${UNBALANCED}}
|
||||||
# TODO: ${VAR:M${:U(((\}\}\}}}
|
# TODO: ${VAR:M${:U(((\}\}\}}}
|
||||||
|
|
||||||
all:
|
.MAKEFLAGS: -d0
|
||||||
@:;
|
|
||||||
|
# Special characters:
|
||||||
|
# * matches 0 or more arbitrary characters
|
||||||
|
# ? matches a single arbitrary character
|
||||||
|
# \ starts an escape sequence, only outside ranges
|
||||||
|
# [ starts a set for matching a single character
|
||||||
|
# ] ends a set for matching a single character
|
||||||
|
# - in a set, forms a range of characters
|
||||||
|
# ^ as the first character in a set, negates the set
|
||||||
|
# ( during parsing of the pattern, starts a nesting level
|
||||||
|
# ) during parsing of the pattern, ends a nesting level
|
||||||
|
# { during parsing of the pattern, starts a nesting level
|
||||||
|
# } during parsing of the pattern, ends a nesting level
|
||||||
|
# : during parsing of the pattern, finishes the pattern
|
||||||
|
# $ during parsing of the pattern, starts a nested expression
|
||||||
|
# # in a line except a shell command, starts a comment
|
||||||
|
#
|
||||||
|
# Pattern parts:
|
||||||
|
# * matches 0 or more arbitrary characters
|
||||||
|
# ? matches exactly 1 arbitrary character
|
||||||
|
# \x matches exactly the character 'x'
|
||||||
|
# [...] matches exactly 1 character from the set
|
||||||
|
# [^...] matches exactly 1 character outside the set
|
||||||
|
# [a-z] matches exactly 1 character from the range 'a' to 'z'
|
||||||
|
#
|
||||||
|
|
||||||
|
# [] matches never
|
||||||
|
.if ${ ab a[]b a[b a b :L:M[]} != ""
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# a[]b matches never
|
||||||
|
.if ${ ab a[]b a[b a b [ ] :L:Ma[]b} != ""
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [^] matches exactly 1 arbitrary character
|
||||||
|
.if ${ ab a[]b a[b a b [ ] :L:M[^]} != "a b [ ]"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# a[^]b matches 'a', then exactly 1 arbitrary character, then 'b'
|
||||||
|
.if ${ ab a[]b a[b a b :L:Ma[^]b} != "a[b"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [Nn0] matches exactly 1 character from the set 'N', 'n', '0'
|
||||||
|
.if ${ a b N n 0 Nn0 [ ] :L:M[Nn0]} != "N n 0"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [a-c] matches exactly 1 character from the range 'a' to 'c'
|
||||||
|
.if ${ A B C a b c d [a-c] [a] :L:M[a-c]} != "a b c"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [c-a] matches the same as [a-c]
|
||||||
|
.if ${ A B C a b c d [a-c] [a] :L:M[c-a]} != "a b c"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [^a-c67]
|
||||||
|
# matches a single character, except for 'a', 'b', 'c', '6' or
|
||||||
|
# '7'
|
||||||
|
.if ${ A B C a b c d 5 6 7 8 [a-c] [a] :L:M[^a-c67]} != "A B C d 5 8"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# : terminates the pattern
|
||||||
|
.if ${ A * :L:M:} != ""
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# \: matches a colon
|
||||||
|
.if ${ ${:U\: \:\:} :L:M\:} != ":"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# ${:U\:} matches a colon
|
||||||
|
.if ${ ${:U\:} ${:U\:\:} :L:M${:U\:}} != ":"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [:] matches never since the ':' starts the next modifier
|
||||||
|
# expect+2: Unknown modifier "]"
|
||||||
|
# expect+1: Malformed conditional (${ ${:U\:} ${:U\:\:} :L:M[:]} != ":")
|
||||||
|
.if ${ ${:U\:} ${:U\:\:} :L:M[:]} != ":"
|
||||||
|
. error
|
||||||
|
.else
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# [\] matches exactly a backslash; no escaping takes place in
|
||||||
|
# character ranges
|
||||||
|
# Without the 'a' in the below expressions, the backslash would end a word and
|
||||||
|
# thus influence how the string is split into words.
|
||||||
|
.if ${ ${:U\\a} ${:U\\\\a} :L:M[\]a} != "\\a"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
#.MAKEFLAGS: -dcv
|
||||||
|
#
|
||||||
|
# Incomplete patterns:
|
||||||
|
# [ matches TODO
|
||||||
|
# [x matches TODO
|
||||||
|
# [^ matches TODO
|
||||||
|
# [- matches TODO
|
||||||
|
# [xy matches TODO
|
||||||
|
# [^x matches TODO
|
||||||
|
# [\ matches TODO
|
||||||
|
#
|
||||||
|
# [x- matches exactly 'x', doesn't match 'x-'
|
||||||
|
# [^x- matches TODO
|
||||||
|
# \ matches never
|
||||||
|
|
||||||
|
|
||||||
|
# The modifier ':tW' prevents splitting at whitespace. Even leading and
|
||||||
|
# trailing whitespace is preserved.
|
||||||
|
.if ${ plain string :L:tW:M*} != " plain string "
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
|
||||||
|
# Without the modifier ':tW', the string is split into words. All whitespace
|
||||||
|
# around and between the words is normalized to a single space.
|
||||||
|
.if ${ plain string :L:M*} != "plain string"
|
||||||
|
. error
|
||||||
|
.endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: varmod-order-numeric.mk,v 1.6 2022/02/04 23:43:10 rillig Exp $
|
# $NetBSD: varmod-order-numeric.mk,v 1.7 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the variable modifiers ':On', which returns the words, sorted in
|
# Tests for the variable modifiers ':On', which returns the words, sorted in
|
||||||
# ascending numeric order, and for ':Orn' and ':Onr', which additionally
|
# ascending numeric order, and for ':Orn' and ':Onr', which additionally
|
||||||
@ -32,7 +32,7 @@ NUMBERS= 3 5 7 1 42 -42 5K -3m 1M 1k -2G
|
|||||||
# Duplicate numbers are preserved in the output. In this case the
|
# Duplicate numbers are preserved in the output. In this case the
|
||||||
# equal-valued numbers are spelled the same, so they are indistinguishable in
|
# equal-valued numbers are spelled the same, so they are indistinguishable in
|
||||||
# the output.
|
# the output.
|
||||||
DUPLICATES= 3 1 2 2 1 1 # https://oeis.org/A034002
|
DUPLICATES= 3 1 2 2 1 1 # subsequence of https://oeis.org/A034002
|
||||||
.if ${DUPLICATES:On} != "1 1 1 2 2 3"
|
.if ${DUPLICATES:On} != "1 1 1 2 2 3"
|
||||||
. error ${DUPLICATES:On}
|
. error ${DUPLICATES:On}
|
||||||
.endif
|
.endif
|
||||||
@ -44,7 +44,7 @@ SAME_VALUE:= ${:U 79 80 0x0050 81 :On}
|
|||||||
. error ${SAME_VALUE}
|
. error ${SAME_VALUE}
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
# Hexadecimal and octal numbers are supported as well.
|
# Hexadecimal and octal numbers can be sorted as well.
|
||||||
MIXED_BASE= 0 010 0x7 9
|
MIXED_BASE= 0 010 0x7 9
|
||||||
.if ${MIXED_BASE:On} != "0 0x7 010 9"
|
.if ${MIXED_BASE:On} != "0 0x7 010 9"
|
||||||
. error ${MIXED_BASE:On}
|
. error ${MIXED_BASE:On}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
make: "echo word; false" returned non-zero status
|
make: "echo word; false" returned non-zero status
|
||||||
make: "echo word; false" returned non-zero status
|
make: "echo word; false" returned non-zero status
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Var_Parse: ${:!echo word; ${:Ufalse}!} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${:!echo word; ${:Ufalse}!} (eval-keep-dollar-and-undefined)
|
||||||
Evaluating modifier ${:!...} on value "" (eval-keep-dollar-and-undefined, undefined)
|
Evaluating modifier ${:!...} on value "" (eval-keep-dollar-and-undefined, undefined)
|
||||||
Modifier part: "echo word; false"
|
Modifier part: "echo word; false"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
make: "echo word; false" returned non-zero status
|
make: "echo word; false" returned non-zero status
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Var_Parse: ${echo word; ${:Ufalse}:L:sh} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${echo word; ${:Ufalse}:L:sh} (eval-keep-dollar-and-undefined)
|
||||||
Evaluating modifier ${echo word; false:L} on value "" (eval-keep-dollar-and-undefined, undefined)
|
Evaluating modifier ${echo word; false:L} on value "" (eval-keep-dollar-and-undefined, undefined)
|
||||||
Result of ${echo word; false:L} is "echo word; false" (eval-keep-dollar-and-undefined, defined)
|
Result of ${echo word; false:L} is "echo word; false" (eval-keep-dollar-and-undefined, defined)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: varmod-to-separator.mk,v 1.10 2022/01/23 21:48:59 rillig Exp $
|
# $NetBSD: varmod-to-separator.mk,v 1.11 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for the :ts variable modifier, which joins the words of the variable
|
# Tests for the :ts variable modifier, which joins the words of the variable
|
||||||
# using an arbitrary character as word separator.
|
# using an arbitrary character as word separator.
|
||||||
@ -208,7 +208,7 @@ WORDS= one two three four five six
|
|||||||
. error
|
. error
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
# The word separator must be can only be a single character.
|
# The word separator can only be a single character.
|
||||||
# expect: make: Bad modifier ":ts\X" for variable "WORDS"
|
# expect: make: Bad modifier ":ts\X" for variable "WORDS"
|
||||||
.if ${WORDS:ts\X}
|
.if ${WORDS:ts\X}
|
||||||
. error
|
. error
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Parsing line 10: ORIG_SHELL:= ${.SHELL}
|
Parsing line 10: ORIG_SHELL:= ${.SHELL}
|
||||||
Global: ORIG_SHELL =
|
Global: ORIG_SHELL = # (empty)
|
||||||
Var_Parse: ${.SHELL} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${.SHELL} (eval-keep-dollar-and-undefined)
|
||||||
Global:delete .SHELL (not found)
|
Global: delete .SHELL (not found)
|
||||||
Command: .SHELL = (details omitted)
|
Command: .SHELL = (details omitted)
|
||||||
Global: ORIG_SHELL = (details omitted)
|
Global: ORIG_SHELL = (details omitted)
|
||||||
Parsing line 12: .SHELL= overwritten
|
Parsing line 12: .SHELL= overwritten
|
||||||
@ -9,22 +9,22 @@ Global: .SHELL = overwritten
|
|||||||
CondParser_Eval: ${.SHELL} != ${ORIG_SHELL}
|
CondParser_Eval: ${.SHELL} != ${ORIG_SHELL}
|
||||||
Var_Parse: ${.SHELL} != ${ORIG_SHELL} (eval-defined)
|
Var_Parse: ${.SHELL} != ${ORIG_SHELL} (eval-defined)
|
||||||
Var_Parse: ${ORIG_SHELL} (eval-defined)
|
Var_Parse: ${ORIG_SHELL} (eval-defined)
|
||||||
lhs = "(details omitted)", rhs = "(details omitted)", op = !=
|
Comparing "(details omitted)" != "(details omitted)"
|
||||||
Parsing line 19: .MAKEFLAGS: .SHELL+=appended
|
Parsing line 19: .MAKEFLAGS: .SHELL+=appended
|
||||||
ParseDependency(.MAKEFLAGS: .SHELL+=appended)
|
ParseDependency(.MAKEFLAGS: .SHELL+=appended)
|
||||||
Ignoring append to .SHELL since it is read-only
|
Ignoring append to .SHELL since it is read-only
|
||||||
CondParser_Eval: ${.SHELL} != ${ORIG_SHELL}
|
CondParser_Eval: ${.SHELL} != ${ORIG_SHELL}
|
||||||
Var_Parse: ${.SHELL} != ${ORIG_SHELL} (eval-defined)
|
Var_Parse: ${.SHELL} != ${ORIG_SHELL} (eval-defined)
|
||||||
Var_Parse: ${ORIG_SHELL} (eval-defined)
|
Var_Parse: ${ORIG_SHELL} (eval-defined)
|
||||||
lhs = "(details omitted)", rhs = "(details omitted)", op = !=
|
Comparing "(details omitted)" != "(details omitted)"
|
||||||
Parsing line 27: .undef .SHELL
|
Parsing line 27: .undef .SHELL
|
||||||
Global:delete .SHELL
|
Global: delete .SHELL
|
||||||
Parsing line 28: .SHELL= newly overwritten
|
Parsing line 28: .SHELL= newly overwritten
|
||||||
Global: .SHELL = newly overwritten
|
Global: .SHELL = newly overwritten
|
||||||
CondParser_Eval: ${.SHELL} != ${ORIG_SHELL}
|
CondParser_Eval: ${.SHELL} != ${ORIG_SHELL}
|
||||||
Var_Parse: ${.SHELL} != ${ORIG_SHELL} (eval-defined)
|
Var_Parse: ${.SHELL} != ${ORIG_SHELL} (eval-defined)
|
||||||
Var_Parse: ${ORIG_SHELL} (eval-defined)
|
Var_Parse: ${ORIG_SHELL} (eval-defined)
|
||||||
lhs = "(details omitted)", rhs = "(details omitted)", op = !=
|
Comparing "(details omitted)" != "(details omitted)"
|
||||||
Parsing line 33: .MAKEFLAGS: -d0
|
Parsing line 33: .MAKEFLAGS: -d0
|
||||||
ParseDependency(.MAKEFLAGS: -d0)
|
ParseDependency(.MAKEFLAGS: -d0)
|
||||||
Global: .MAKEFLAGS = -r -k -d cpv -d
|
Global: .MAKEFLAGS = -r -k -d cpv -d
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
Global:delete .SUFFIXES (not found)
|
Global: delete .SUFFIXES (not found)
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d 0
|
Global: .MAKEFLAGS = -r -k -d v -d 0
|
||||||
Global: .SUFFIXES = set ignored (read-only)
|
Global: .SUFFIXES = set ignored (read-only)
|
||||||
Global: .SUFFIXES = append ignored (read-only)
|
Global: .SUFFIXES = append ignored (read-only)
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Var_Parse: ${.SUFFIXES::=assign} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${.SUFFIXES::=assign} (eval-keep-dollar-and-undefined)
|
||||||
Evaluating modifier ${.SUFFIXES::...} on value ".c .o .1 .err .tar.gz" (eval-keep-dollar-and-undefined, regular)
|
Evaluating modifier ${.SUFFIXES::...} on value ".c .o .1 .err .tar.gz" (eval-keep-dollar-and-undefined, regular)
|
||||||
Modifier part: "assign"
|
Modifier part: "assign"
|
||||||
Global: .SUFFIXES = assign ignored (read-only)
|
Global: .SUFFIXES = assign ignored (read-only)
|
||||||
Result of ${.SUFFIXES::=assign} is "" (eval-keep-dollar-and-undefined, regular)
|
Result of ${.SUFFIXES::=assign} is "" (eval-keep-dollar-and-undefined, regular)
|
||||||
Global: _ =
|
Global: _ = # (empty)
|
||||||
Var_Parse: ${preserve:L:_=.SUFFIXES} (eval-keep-dollar-and-undefined)
|
Var_Parse: ${preserve:L:_=.SUFFIXES} (eval-keep-dollar-and-undefined)
|
||||||
Evaluating modifier ${preserve:L} on value "" (eval-keep-dollar-and-undefined, undefined)
|
Evaluating modifier ${preserve:L} on value "" (eval-keep-dollar-and-undefined, undefined)
|
||||||
Result of ${preserve:L} is "preserve" (eval-keep-dollar-and-undefined, defined)
|
Result of ${preserve:L} is "preserve" (eval-keep-dollar-and-undefined, defined)
|
||||||
@ -32,7 +32,7 @@ ModifyWord_Loop: in "1", replace ".SUFFIXES" with "${.SUFFIXES}" to ".c .o .1 .e
|
|||||||
Command: .SUFFIXES = 2 ignored (read-only)
|
Command: .SUFFIXES = 2 ignored (read-only)
|
||||||
Var_Parse: ${.SUFFIXES} (eval-defined)
|
Var_Parse: ${.SUFFIXES} (eval-defined)
|
||||||
ModifyWord_Loop: in "2", replace ".SUFFIXES" with "${.SUFFIXES}" to ".c .o .1 .err .tar.gz"
|
ModifyWord_Loop: in "2", replace ".SUFFIXES" with "${.SUFFIXES}" to ".c .o .1 .err .tar.gz"
|
||||||
Command:delete .SUFFIXES (not found)
|
Command: delete .SUFFIXES (not found)
|
||||||
Result of ${1 2:@.SUFFIXES@${.SUFFIXES}@} is ".c .o .1 .err .tar.gz .c .o .1 .err .tar.gz" (eval-defined, defined)
|
Result of ${1 2:@.SUFFIXES@${.SUFFIXES}@} is ".c .o .1 .err .tar.gz .c .o .1 .err .tar.gz" (eval-defined, defined)
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d 0 -d v -d 0 -d v -d
|
Global: .MAKEFLAGS = -r -k -d v -d 0 -d v -d 0 -d v -d
|
||||||
Global: .MAKEFLAGS = -r -k -d v -d 0 -d v -d 0 -d v -d 0
|
Global: .MAKEFLAGS = -r -k -d v -d 0 -d v -d 0 -d v -d 0
|
||||||
|
@ -2,12 +2,12 @@ Var_SetExpand: variable name "${:U}" expands to empty string, with value "cmdlin
|
|||||||
Var_SetExpand: variable name "" expands to empty string, with value "cmdline-plain" - ignored
|
Var_SetExpand: variable name "" expands to empty string, with value "cmdline-plain" - ignored
|
||||||
Global: .CURDIR = <curdir>
|
Global: .CURDIR = <curdir>
|
||||||
Var_Parse: ${MAKE_OBJDIR_CHECK_WRITABLE} (eval)
|
Var_Parse: ${MAKE_OBJDIR_CHECK_WRITABLE} (eval)
|
||||||
Global: .TARGETS =
|
Global: .TARGETS = # (empty)
|
||||||
Internal: MAKEFILE = varname-empty.mk
|
Internal: MAKEFILE = varname-empty.mk
|
||||||
Global: .MAKE.MAKEFILES = varname-empty.mk
|
Global: .MAKE.MAKEFILES = varname-empty.mk
|
||||||
Global: .PARSEFILE = varname-empty.mk
|
Global: .PARSEFILE = varname-empty.mk
|
||||||
Global:delete .INCLUDEDFROMDIR (not found)
|
Global: delete .INCLUDEDFROMDIR (not found)
|
||||||
Global:delete .INCLUDEDFROMFILE (not found)
|
Global: delete .INCLUDEDFROMFILE (not found)
|
||||||
Var_SetExpand: variable name "" expands to empty string, with value "default" - ignored
|
Var_SetExpand: variable name "" expands to empty string, with value "default" - ignored
|
||||||
Var_SetExpand: variable name "" expands to empty string, with value "assigned" - ignored
|
Var_SetExpand: variable name "" expands to empty string, with value "assigned" - ignored
|
||||||
SetVar: variable name is empty - ignored
|
SetVar: variable name is empty - ignored
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: varname.mk,v 1.9 2022/01/27 10:42:02 rillig Exp $
|
# $NetBSD: varname.mk,v 1.10 2022/02/09 21:09:24 rillig Exp $
|
||||||
#
|
#
|
||||||
# Tests for special variables, such as .MAKE or .PARSEDIR.
|
# Tests for special variables, such as .MAKE or .PARSEDIR.
|
||||||
# And for variable names in general.
|
# And for variable names in general.
|
||||||
@ -42,7 +42,7 @@ ${VARNAME}= try3
|
|||||||
.MAKEFLAGS: -d0
|
.MAKEFLAGS: -d0
|
||||||
|
|
||||||
# All variable names of a scope are stored in the same hash table, using a
|
# All variable names of a scope are stored in the same hash table, using a
|
||||||
# simple hash function. Ensure that HashEntry_KeyEquals handles collisions
|
# simple hash function. Ensure that HashTable_Find handles collisions
|
||||||
# correctly and that the correct variable is looked up. The strings "0x" and
|
# correctly and that the correct variable is looked up. The strings "0x" and
|
||||||
# "1Y" have the same hash code, as 31 * '0' + 'x' == 31 * '1' + 'Y'.
|
# "1Y" have the same hash code, as 31 * '0' + 'x' == 31 * '1' + 'Y'.
|
||||||
V.0x= 0x
|
V.0x= 0x
|
||||||
|
99
var.c
99
var.c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: var.c,v 1.1009 2022/02/04 23:43:10 rillig Exp $ */
|
/* $NetBSD: var.c,v 1.1019 2022/03/27 18:39:01 rillig Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988, 1989, 1990, 1993
|
* Copyright (c) 1988, 1989, 1990, 1993
|
||||||
@ -147,7 +147,7 @@
|
|||||||
#include "metachar.h"
|
#include "metachar.h"
|
||||||
|
|
||||||
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
|
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
|
||||||
MAKE_RCSID("$NetBSD: var.c,v 1.1009 2022/02/04 23:43:10 rillig Exp $");
|
MAKE_RCSID("$NetBSD: var.c,v 1.1019 2022/03/27 18:39:01 rillig Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Variables are defined using one of the VAR=value assignments. Their
|
* Variables are defined using one of the VAR=value assignments. Their
|
||||||
@ -440,11 +440,6 @@ VarFindSubstring(Substring name, GNode *scope, bool elsewhere)
|
|||||||
FStr envName;
|
FStr envName;
|
||||||
const char *envValue;
|
const char *envValue;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: try setting an environment variable with the empty
|
|
||||||
* name, which should be technically possible, just to see
|
|
||||||
* how make reacts. All .for loops should be broken then.
|
|
||||||
*/
|
|
||||||
envName = Substring_Str(name);
|
envName = Substring_Str(name);
|
||||||
envValue = getenv(envName.str);
|
envValue = getenv(envName.str);
|
||||||
if (envValue != NULL)
|
if (envValue != NULL)
|
||||||
@ -484,6 +479,16 @@ VarFreeShortLived(Var *v)
|
|||||||
free(v);
|
free(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
ValueDescription(const char *value)
|
||||||
|
{
|
||||||
|
if (value[0] == '\0')
|
||||||
|
return "# (empty)";
|
||||||
|
if (ch_isspace(value[strlen(value) - 1]))
|
||||||
|
return "# (ends with space)";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a new variable of the given name and value to the given scope. */
|
/* Add a new variable of the given name and value to the given scope. */
|
||||||
static Var *
|
static Var *
|
||||||
VarAdd(const char *name, const char *value, GNode *scope, VarSetFlags flags)
|
VarAdd(const char *name, const char *value, GNode *scope, VarSetFlags flags)
|
||||||
@ -492,7 +497,8 @@ VarAdd(const char *name, const char *value, GNode *scope, VarSetFlags flags)
|
|||||||
Var *v = VarNew(FStr_InitRefer(/* aliased to */ he->key), value,
|
Var *v = VarNew(FStr_InitRefer(/* aliased to */ he->key), value,
|
||||||
false, false, (flags & VAR_SET_READONLY) != 0);
|
false, false, (flags & VAR_SET_READONLY) != 0);
|
||||||
HashEntry_Set(he, v);
|
HashEntry_Set(he, v);
|
||||||
DEBUG3(VAR, "%s: %s = %s\n", scope->name, name, value);
|
DEBUG4(VAR, "%s: %s = %s%s\n",
|
||||||
|
scope->name, name, value, ValueDescription(value));
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,11 +513,12 @@ Var_Delete(GNode *scope, const char *varname)
|
|||||||
Var *v;
|
Var *v;
|
||||||
|
|
||||||
if (he == NULL) {
|
if (he == NULL) {
|
||||||
DEBUG2(VAR, "%s:delete %s (not found)\n", scope->name, varname);
|
DEBUG2(VAR, "%s: delete %s (not found)\n",
|
||||||
|
scope->name, varname);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG2(VAR, "%s:delete %s\n", scope->name, varname);
|
DEBUG2(VAR, "%s: delete %s\n", scope->name, varname);
|
||||||
v = he->value;
|
v = he->value;
|
||||||
if (v->inUse) {
|
if (v->inUse) {
|
||||||
Parse_Error(PARSE_FATAL,
|
Parse_Error(PARSE_FATAL,
|
||||||
@ -519,10 +526,12 @@ Var_Delete(GNode *scope, const char *varname)
|
|||||||
v->name.str);
|
v->name.str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->exported)
|
if (v->exported)
|
||||||
unsetenv(v->name.str);
|
unsetenv(v->name.str);
|
||||||
if (strcmp(v->name.str, MAKE_EXPORTED) == 0)
|
if (strcmp(v->name.str, MAKE_EXPORTED) == 0)
|
||||||
var_exportedVars = VAR_EXPORTED_NONE;
|
var_exportedVars = VAR_EXPORTED_NONE;
|
||||||
|
|
||||||
assert(v->name.freeIt == NULL);
|
assert(v->name.freeIt == NULL);
|
||||||
HashTable_DeleteEntry(&scope->vars, he);
|
HashTable_DeleteEntry(&scope->vars, he);
|
||||||
Buf_Done(&v->val);
|
Buf_Done(&v->val);
|
||||||
@ -989,7 +998,8 @@ Var_SetWithFlags(GNode *scope, const char *name, const char *val,
|
|||||||
Buf_Clear(&v->val);
|
Buf_Clear(&v->val);
|
||||||
Buf_AddStr(&v->val, val);
|
Buf_AddStr(&v->val, val);
|
||||||
|
|
||||||
DEBUG3(VAR, "%s: %s = %s\n", scope->name, name, val);
|
DEBUG4(VAR, "%s: %s = %s%s\n",
|
||||||
|
scope->name, name, val, ValueDescription(val));
|
||||||
if (v->exported)
|
if (v->exported)
|
||||||
ExportVar(name, VEM_PLAIN);
|
ExportVar(name, VEM_PLAIN);
|
||||||
}
|
}
|
||||||
@ -1101,20 +1111,14 @@ Var_Append(GNode *scope, const char *name, const char *val)
|
|||||||
DEBUG3(VAR, "%s: %s = %s\n", scope->name, name, v->val.data);
|
DEBUG3(VAR, "%s: %s = %s\n", scope->name, name, v->val.data);
|
||||||
|
|
||||||
if (v->fromEnvironment) {
|
if (v->fromEnvironment) {
|
||||||
/*
|
/* See VarAdd. */
|
||||||
* The variable originally came from the environment.
|
HashEntry *he =
|
||||||
* Install it in the global scope (we could place it
|
HashTable_CreateEntry(&scope->vars, name, NULL);
|
||||||
* in the environment, but then we should provide a
|
HashEntry_Set(he, v);
|
||||||
* way to export other variables...)
|
FStr_Done(&v->name);
|
||||||
*/
|
v->name = FStr_InitRefer(/* aliased to */ he->key);
|
||||||
v->fromEnvironment = false;
|
|
||||||
v->shortLived = false;
|
v->shortLived = false;
|
||||||
/*
|
v->fromEnvironment = false;
|
||||||
* This is the only place where a variable is
|
|
||||||
* created in a scope, where v->name does not alias
|
|
||||||
* scope->vars->key.
|
|
||||||
*/
|
|
||||||
HashTable_Set(&scope->vars, name, v);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1438,10 +1442,11 @@ ModifyWord_SysVSubst(Substring word, SepBuf *buf, void *data)
|
|||||||
if (Substring_IsEmpty(word))
|
if (Substring_IsEmpty(word))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!Substring_HasPrefix(word, args->lhsPrefix))
|
if (!Substring_HasPrefix(word, args->lhsPrefix) ||
|
||||||
goto no_match;
|
!Substring_HasSuffix(word, args->lhsSuffix)) {
|
||||||
if (!Substring_HasSuffix(word, args->lhsSuffix))
|
SepBuf_AddSubstring(buf, word);
|
||||||
goto no_match;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rhs = FStr_InitRefer(args->rhs);
|
rhs = FStr_InitRefer(args->rhs);
|
||||||
Var_Expand(&rhs, args->scope, VARE_WANTRES);
|
Var_Expand(&rhs, args->scope, VARE_WANTRES);
|
||||||
@ -1457,10 +1462,6 @@ ModifyWord_SysVSubst(Substring word, SepBuf *buf, void *data)
|
|||||||
SepBuf_AddStr(buf, percent != NULL ? percent + 1 : rhs.str);
|
SepBuf_AddStr(buf, percent != NULL ? percent + 1 : rhs.str);
|
||||||
|
|
||||||
FStr_Done(&rhs);
|
FStr_Done(&rhs);
|
||||||
return;
|
|
||||||
|
|
||||||
no_match:
|
|
||||||
SepBuf_AddSubstring(buf, word);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2711,9 +2712,8 @@ ApplyModifier_Range(const char **pp, ModChain *ch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Parse a ':M' or ':N' modifier. */
|
/* Parse a ':M' or ':N' modifier. */
|
||||||
static void
|
static char *
|
||||||
ParseModifier_Match(const char **pp, const ModChain *ch,
|
ParseModifier_Match(const char **pp, const ModChain *ch)
|
||||||
char **out_pattern)
|
|
||||||
{
|
{
|
||||||
const char *mod = *pp;
|
const char *mod = *pp;
|
||||||
Expr *expr = ch->expr;
|
Expr *expr = ch->expr;
|
||||||
@ -2777,6 +2777,10 @@ ParseModifier_Match(const char **pp, const ModChain *ch,
|
|||||||
|
|
||||||
if (needSubst) {
|
if (needSubst) {
|
||||||
char *old_pattern = pattern;
|
char *old_pattern = pattern;
|
||||||
|
/*
|
||||||
|
* XXX: Contrary to ParseModifierPart, a dollar in a ':M' or
|
||||||
|
* ':N' modifier must be escaped as '$$', not as '\$'.
|
||||||
|
*/
|
||||||
(void)Var_Subst(pattern, expr->scope, expr->emode, &pattern);
|
(void)Var_Subst(pattern, expr->scope, expr->emode, &pattern);
|
||||||
/* TODO: handle errors */
|
/* TODO: handle errors */
|
||||||
free(old_pattern);
|
free(old_pattern);
|
||||||
@ -2784,7 +2788,7 @@ ParseModifier_Match(const char **pp, const ModChain *ch,
|
|||||||
|
|
||||||
DEBUG2(VAR, "Pattern for ':%c' is \"%s\"\n", mod[0], pattern);
|
DEBUG2(VAR, "Pattern for ':%c' is \"%s\"\n", mod[0], pattern);
|
||||||
|
|
||||||
*out_pattern = pattern;
|
return pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* :Mpattern or :Npattern */
|
/* :Mpattern or :Npattern */
|
||||||
@ -2794,7 +2798,7 @@ ApplyModifier_Match(const char **pp, ModChain *ch)
|
|||||||
char mod = **pp;
|
char mod = **pp;
|
||||||
char *pattern;
|
char *pattern;
|
||||||
|
|
||||||
ParseModifier_Match(pp, ch, &pattern);
|
pattern = ParseModifier_Match(pp, ch);
|
||||||
|
|
||||||
if (ModChain_ShouldEval(ch)) {
|
if (ModChain_ShouldEval(ch)) {
|
||||||
ModifyWordProc modifyWord =
|
ModifyWordProc modifyWord =
|
||||||
@ -3225,7 +3229,7 @@ ApplyModifier_Words(const char **pp, ModChain *ch)
|
|||||||
/* Normal case: select the words described by first and last. */
|
/* Normal case: select the words described by first and last. */
|
||||||
Expr_SetValueOwn(expr,
|
Expr_SetValueOwn(expr,
|
||||||
VarSelectWords(Expr_Str(expr), first, last,
|
VarSelectWords(Expr_Str(expr), first, last,
|
||||||
ch->sep, ch->oneBigWord));
|
ch->sep, ch->oneBigWord));
|
||||||
|
|
||||||
ok:
|
ok:
|
||||||
FStr_Done(&festr);
|
FStr_Done(&festr);
|
||||||
@ -3488,11 +3492,11 @@ ApplyModifier_Assign(const char **pp, ModChain *ch)
|
|||||||
|
|
||||||
scope = expr->scope; /* scope where v belongs */
|
scope = expr->scope; /* scope where v belongs */
|
||||||
if (expr->defined == DEF_REGULAR && expr->scope != SCOPE_GLOBAL) {
|
if (expr->defined == DEF_REGULAR && expr->scope != SCOPE_GLOBAL) {
|
||||||
Var *gv = VarFind(expr->name, expr->scope, false);
|
Var *v = VarFind(expr->name, expr->scope, false);
|
||||||
if (gv == NULL)
|
if (v == NULL)
|
||||||
scope = SCOPE_GLOBAL;
|
scope = SCOPE_GLOBAL;
|
||||||
else
|
else
|
||||||
VarFreeShortLived(gv);
|
VarFreeShortLived(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op[0] == '+')
|
if (op[0] == '+')
|
||||||
@ -4035,9 +4039,9 @@ ApplyModifiers(
|
|||||||
/*
|
/*
|
||||||
* TODO: Use p + strlen(p) instead, to stop parsing immediately.
|
* TODO: Use p + strlen(p) instead, to stop parsing immediately.
|
||||||
*
|
*
|
||||||
* In the unit tests, this generates a few unterminated strings in the
|
* In the unit tests, this generates a few shell commands with
|
||||||
* shell commands though. Instead of producing these unfinished
|
* unbalanced quotes. Instead of producing these incomplete strings,
|
||||||
* strings, commands with evaluation errors should not be run at all.
|
* commands with evaluation errors should not be run at all.
|
||||||
*
|
*
|
||||||
* To make that happen, Var_Subst must report the actual errors
|
* To make that happen, Var_Subst must report the actual errors
|
||||||
* instead of returning VPR_OK unconditionally.
|
* instead of returning VPR_OK unconditionally.
|
||||||
@ -4047,8 +4051,8 @@ ApplyModifiers(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only 4 of the 7 local variables are treated specially as they are the only
|
* Only 4 of the 7 built-in local variables are treated specially as they are
|
||||||
* ones that will be set when dynamic sources are expanded.
|
* the only ones that will be set when dynamic sources are expanded.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
VarnameIsDynamic(Substring varname)
|
VarnameIsDynamic(Substring varname)
|
||||||
@ -4798,7 +4802,8 @@ Var_Dump(GNode *scope)
|
|||||||
for (i = 0; i < vec.len; i++) {
|
for (i = 0; i < vec.len; i++) {
|
||||||
const char *varname = varnames[i];
|
const char *varname = varnames[i];
|
||||||
Var *var = HashTable_FindValue(&scope->vars, varname);
|
Var *var = HashTable_FindValue(&scope->vars, varname);
|
||||||
debug_printf("%-16s = %s\n", varname, var->val.data);
|
debug_printf("%-16s = %s%s\n", varname,
|
||||||
|
var->val.data, ValueDescription(var->val.data));
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector_Done(&vec);
|
Vector_Done(&vec);
|
||||||
|
Loading…
Reference in New Issue
Block a user