Import bmake-20220418
Most relevant change: o ignore '.POSIX:' if not in first non-comment line of Makefile as specified by POSIX. add unit-tests for above.
This commit is contained in:
parent
a052cb4320
commit
2061c94e6f
18
ChangeLog
18
ChangeLog
@ -1,3 +1,21 @@
|
||||
2022-04-18 Simon J Gerraty <sjg@beast.crufty.net>
|
||||
|
||||
* VERSION (_MAKE_VERSION): 20220418
|
||||
Merge with NetBSD make, pick up
|
||||
o ignore '.POSIX:' if not in first non-comment line
|
||||
of Makefile as specified by POSIX.
|
||||
add unit-tests for above.
|
||||
o meta.c: make it easier to find usage of identifiers
|
||||
o targ.c: add .USEBEFORE to Targ_PrintType
|
||||
|
||||
2022-04-14 Simon J Gerraty <sjg@beast.crufty.net>
|
||||
|
||||
* VERSION (_MAKE_VERSION): 20220414
|
||||
|
||||
* unit-tests/Makefile: simplify checks for shells with
|
||||
BROKEN_TESTS, this helps with other Linux distros that
|
||||
use dash.
|
||||
|
||||
2022-03-30 Simon J Gerraty <sjg@beast.crufty.net>
|
||||
|
||||
* VERSION (_MAKE_VERSION): 20220330
|
||||
|
2
FILES
2
FILES
@ -274,6 +274,8 @@ unit-tests/deptgt-path.exp
|
||||
unit-tests/deptgt-path.mk
|
||||
unit-tests/deptgt-phony.exp
|
||||
unit-tests/deptgt-phony.mk
|
||||
unit-tests/deptgt-posix.exp
|
||||
unit-tests/deptgt-posix.mk
|
||||
unit-tests/deptgt-precious.exp
|
||||
unit-tests/deptgt-precious.mk
|
||||
unit-tests/deptgt-shell.exp
|
||||
|
2
VERSION
2
VERSION
@ -1,2 +1,2 @@
|
||||
# keep this compatible with sh and make
|
||||
_MAKE_VERSION=20220330
|
||||
_MAKE_VERSION=20220418
|
||||
|
22
bmake.1
22
bmake.1
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: make.1,v 1.307 2022/03/26 15:39:58 sjg Exp $
|
||||
.\" $NetBSD: make.1,v 1.308 2022/04/18 15:06:27 rillig Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@ -29,7 +29,7 @@
|
||||
.\"
|
||||
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
||||
.\"
|
||||
.Dd March 24, 2022
|
||||
.Dd April 18, 2022
|
||||
.Dt BMAKE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -2291,17 +2291,15 @@ Apply the
|
||||
.Ic .PHONY
|
||||
attribute to any specified sources.
|
||||
.It Ic .POSIX
|
||||
This should be the first non-comment line in a Makefile.
|
||||
It results in the variable
|
||||
If this is the first non-comment line in the main makefile,
|
||||
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.
|
||||
is set to the value
|
||||
.Ql 1003.2
|
||||
and the makefile
|
||||
.Ql <posix.mk>
|
||||
is included if it exists,
|
||||
to provide POSIX-compatible default rules.
|
||||
If
|
||||
.Nm
|
||||
is run with the
|
||||
|
13
bmake.cat1
13
bmake.cat1
@ -1468,12 +1468,11 @@ BMAKE(1) FreeBSD General Commands Manual BMAKE(1)
|
||||
|
||||
[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.POSIX [22mIf this is the first non-comment line in the main makefile, the
|
||||
variable [4m%POSIX[24m is set to the value `1003.2' and the makefile
|
||||
`<posix.mk>' is included if it exists, to provide POSIX-compati-
|
||||
ble default rules. If [1mbmake [22mis run with the [1m-r [22mflag, then only
|
||||
`posix.mk' will contribute to the default rules.
|
||||
|
||||
[1m.PRECIOUS[0m
|
||||
Apply the [1m.PRECIOUS [22mattribute to any specified sources. If no
|
||||
@ -1629,4 +1628,4 @@ BMAKE(1) FreeBSD General Commands Manual BMAKE(1)
|
||||
|
||||
There is no way of escaping a space character in a filename.
|
||||
|
||||
FreeBSD 13.0 March 24, 2022 FreeBSD 13.0
|
||||
FreeBSD 13.0 April 18, 2022 FreeBSD 13.0
|
||||
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
6
cond.c
6
cond.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cond.c,v 1.333 2022/03/03 19:46:31 rillig Exp $ */
|
||||
/* $NetBSD: cond.c,v 1.334 2022/04/15 09:33:20 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
@ -95,7 +95,7 @@
|
||||
#include "dir.h"
|
||||
|
||||
/* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */
|
||||
MAKE_RCSID("$NetBSD: cond.c,v 1.333 2022/03/03 19:46:31 rillig Exp $");
|
||||
MAKE_RCSID("$NetBSD: cond.c,v 1.334 2022/04/15 09:33:20 rillig Exp $");
|
||||
|
||||
/*
|
||||
* Conditional expressions conform to this grammar:
|
||||
@ -710,7 +710,7 @@ CondParser_FuncCallEmpty(CondParser *par, bool doEval, Token *out_token)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Parse a function call expression, such as 'defined(${file})'. */
|
||||
/* Parse a function call expression, such as 'exists(${file})'. */
|
||||
static bool
|
||||
CondParser_FuncCall(CondParser *par, bool doEval, Token *out_token)
|
||||
{
|
||||
|
5
main.c
5
main.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.579 2022/03/22 23:37:09 rillig Exp $ */
|
||||
/* $NetBSD: main.c,v 1.580 2022/04/18 15:06:27 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -111,7 +111,7 @@
|
||||
#include "trace.h"
|
||||
|
||||
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
|
||||
MAKE_RCSID("$NetBSD: main.c,v 1.579 2022/03/22 23:37:09 rillig Exp $");
|
||||
MAKE_RCSID("$NetBSD: main.c,v 1.580 2022/04/18 15:06:27 rillig Exp $");
|
||||
#if defined(MAKE_NATIVE) && !defined(lint)
|
||||
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
|
||||
"The Regents of the University of California. "
|
||||
@ -1507,6 +1507,7 @@ main_ReadFiles(void)
|
||||
if (!opts.noBuiltins)
|
||||
ReadBuiltinRules();
|
||||
|
||||
posix_state = PS_MAYBE_NEXT_LINE;
|
||||
if (!Lst_IsEmpty(&opts.makefiles))
|
||||
ReadAllMakefiles(&opts.makefiles);
|
||||
else
|
||||
|
22
make.1
22
make.1
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: make.1,v 1.307 2022/03/26 15:39:58 sjg Exp $
|
||||
.\" $NetBSD: make.1,v 1.308 2022/04/18 15:06:27 rillig Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@ -29,7 +29,7 @@
|
||||
.\"
|
||||
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
||||
.\"
|
||||
.Dd March 24, 2022
|
||||
.Dd April 18, 2022
|
||||
.Dt MAKE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -2291,17 +2291,15 @@ Apply the
|
||||
.Ic .PHONY
|
||||
attribute to any specified sources.
|
||||
.It Ic .POSIX
|
||||
This should be the first non-comment line in a Makefile.
|
||||
It results in the variable
|
||||
If this is the first non-comment line in the main makefile,
|
||||
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.
|
||||
is set to the value
|
||||
.Ql 1003.2
|
||||
and the makefile
|
||||
.Ql <posix.mk>
|
||||
is included if it exists,
|
||||
to provide POSIX-compatible default rules.
|
||||
If
|
||||
.Nm
|
||||
is run with the
|
||||
|
13
make.h
13
make.h
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: make.h,v 1.299 2022/03/26 14:02:40 rillig Exp $ */
|
||||
/* $NetBSD: make.h,v 1.300 2022/04/18 15:06:27 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -522,6 +522,17 @@ typedef struct GNode {
|
||||
unsigned lineno;
|
||||
} GNode;
|
||||
|
||||
/*
|
||||
* Keep track of whether to include <posix.mk> when parsing the line
|
||||
* '.POSIX:'.
|
||||
*/
|
||||
extern enum PosixState {
|
||||
PS_NOT_YET,
|
||||
PS_MAYBE_NEXT_LINE,
|
||||
PS_NOW_OR_NEVER,
|
||||
PS_TOO_LATE
|
||||
} posix_state;
|
||||
|
||||
/* Error levels for diagnostics during parsing. */
|
||||
typedef enum ParseErrorLevel {
|
||||
/*
|
||||
|
20
meta.c
20
meta.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: meta.c,v 1.199 2022/03/04 23:17:16 sjg Exp $ */
|
||||
/* $NetBSD: meta.c,v 1.200 2022/04/15 12:28:16 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Implement 'meta' mode.
|
||||
@ -387,12 +387,10 @@ printCMDs(GNode *gn, FILE *fp)
|
||||
/*
|
||||
* Certain node types never get a .meta file
|
||||
*/
|
||||
#define SKIP_META_TYPE(_type) do { \
|
||||
if ((gn->type & __CONCAT(OP_, _type))) { \
|
||||
if (verbose) { \
|
||||
debug_printf("Skipping meta for %s: .%s\n", \
|
||||
gn->name, __STRING(_type)); \
|
||||
} \
|
||||
#define SKIP_META_TYPE(flag, str) do { \
|
||||
if ((gn->type & (flag))) { \
|
||||
if (verbose) \
|
||||
debug_printf("Skipping meta for %s: .%s\n", gn->name, str); \
|
||||
return false; \
|
||||
} \
|
||||
} while (false)
|
||||
@ -413,12 +411,12 @@ meta_needed(GNode *gn, const char *dname,
|
||||
/* This may be a phony node which we don't want meta data for... */
|
||||
/* Skip .meta for .BEGIN, .END, .ERROR etc as well. */
|
||||
/* Or it may be explicitly flagged as .NOMETA */
|
||||
SKIP_META_TYPE(NOMETA);
|
||||
SKIP_META_TYPE(OP_NOMETA, "NOMETA");
|
||||
/* Unless it is explicitly flagged as .META */
|
||||
if (!(gn->type & OP_META)) {
|
||||
SKIP_META_TYPE(PHONY);
|
||||
SKIP_META_TYPE(SPECIAL);
|
||||
SKIP_META_TYPE(MAKE);
|
||||
SKIP_META_TYPE(OP_PHONY, "PHONY");
|
||||
SKIP_META_TYPE(OP_SPECIAL, "SPECIAL");
|
||||
SKIP_META_TYPE(OP_MAKE, "MAKE");
|
||||
}
|
||||
|
||||
/* Check if there are no commands to execute. */
|
||||
|
30
parse.c
30
parse.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: parse.c,v 1.668 2022/03/25 21:16:04 sjg Exp $ */
|
||||
/* $NetBSD: parse.c,v 1.670 2022/04/18 16:09:05 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -121,7 +121,7 @@
|
||||
#include "pathnames.h"
|
||||
|
||||
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
|
||||
MAKE_RCSID("$NetBSD: parse.c,v 1.668 2022/03/25 21:16:04 sjg Exp $");
|
||||
MAKE_RCSID("$NetBSD: parse.c,v 1.670 2022/04/18 16:09:05 sjg Exp $");
|
||||
|
||||
/*
|
||||
* A file being read.
|
||||
@ -309,6 +309,7 @@ static const struct {
|
||||
{ ".WAIT", SP_WAIT, OP_NONE },
|
||||
};
|
||||
|
||||
enum PosixState posix_state = PS_NOT_YET;
|
||||
|
||||
static IncludedFile *
|
||||
GetInclude(size_t i)
|
||||
@ -1267,23 +1268,14 @@ HandleDependencySourcesEmpty(ParseSpecial special, SearchPathList *paths)
|
||||
break;
|
||||
#ifdef POSIX
|
||||
case SP_POSIX:
|
||||
Global_Set("%POSIX", "1003.2");
|
||||
{
|
||||
static bool first_posix = true;
|
||||
|
||||
if (posix_state == PS_NOW_OR_NEVER) {
|
||||
/*
|
||||
* 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'.
|
||||
* With '-r', 'posix.mk' (if it exists)
|
||||
* can effectively substitute for 'sys.mk',
|
||||
* otherwise it is an extension.
|
||||
*/
|
||||
if (first_posix) {
|
||||
first_posix = false;
|
||||
IncludeFile("posix.mk", true, false, true);
|
||||
}
|
||||
Global_Set("%POSIX", "1003.2");
|
||||
IncludeFile("posix.mk", true, false, true);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
@ -2605,6 +2597,10 @@ ReadHighLevelLine(void)
|
||||
|
||||
for (;;) {
|
||||
line = ReadLowLevelLine(LK_NONEMPTY);
|
||||
if (posix_state == PS_MAYBE_NEXT_LINE)
|
||||
posix_state = PS_NOW_OR_NEVER;
|
||||
else
|
||||
posix_state = PS_TOO_LATE;
|
||||
if (line == NULL)
|
||||
return NULL;
|
||||
|
||||
|
5
targ.c
5
targ.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: targ.c,v 1.176 2022/01/07 20:50:35 rillig Exp $ */
|
||||
/* $NetBSD: targ.c,v 1.177 2022/04/15 12:19:28 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -107,7 +107,7 @@
|
||||
#include "dir.h"
|
||||
|
||||
/* "@(#)targ.c 8.2 (Berkeley) 3/19/94" */
|
||||
MAKE_RCSID("$NetBSD: targ.c,v 1.176 2022/01/07 20:50:35 rillig Exp $");
|
||||
MAKE_RCSID("$NetBSD: targ.c,v 1.177 2022/04/15 12:19:28 rillig Exp $");
|
||||
|
||||
/*
|
||||
* All target nodes that appeared on the left-hand side of one of the
|
||||
@ -410,6 +410,7 @@ Targ_PrintType(GNodeType type)
|
||||
{ OP_IGNORE, false, "IGNORE" },
|
||||
{ OP_EXEC, false, "EXEC" },
|
||||
{ OP_USE, false, "USE" },
|
||||
{ OP_USEBEFORE, false, "USEBEFORE" },
|
||||
{ OP_OPTIONAL, false, "OPTIONAL" },
|
||||
};
|
||||
size_t i;
|
||||
|
@ -1,6 +1,6 @@
|
||||
# $Id: Makefile,v 1.178 2022/03/26 23:10:27 sjg Exp $
|
||||
# $Id: Makefile,v 1.180 2022/04/18 21:25:37 sjg Exp $
|
||||
#
|
||||
# $NetBSD: Makefile,v 1.311 2022/03/26 12:44:57 rillig Exp $
|
||||
# $NetBSD: Makefile,v 1.312 2022/04/18 15:06:28 rillig Exp $
|
||||
#
|
||||
# Unit tests for make(1)
|
||||
#
|
||||
@ -142,6 +142,7 @@ TESTS+= deptgt-order
|
||||
TESTS+= deptgt-path
|
||||
TESTS+= deptgt-path-suffix
|
||||
TESTS+= deptgt-phony
|
||||
TESTS+= deptgt-posix
|
||||
TESTS+= deptgt-precious
|
||||
TESTS+= deptgt-shell
|
||||
TESTS+= deptgt-silent
|
||||
@ -440,31 +441,26 @@ TESTS+= varparse-mod
|
||||
TESTS+= varparse-undef-partial
|
||||
TESTS+= varquote
|
||||
|
||||
# for now at least
|
||||
.if ${.SHELL:T} == "ksh"
|
||||
# some shells have quirks
|
||||
_shell := ${.SHELL:tA:T}
|
||||
.if ${_shell} == "dash"
|
||||
# dash fails -x output
|
||||
BROKEN_TESTS+= opt-debug-x-trace
|
||||
.elif ${_shell} == "ksh"
|
||||
BROKEN_TESTS+= sh-flags
|
||||
.endif
|
||||
|
||||
.if ${.MAKE.OS:NDarwin} == ""
|
||||
BROKEN_TESTS+= shell-ksh
|
||||
.endif
|
||||
.if ${.MAKE.OS} == "Linux" && ${.SHELL:tA:T} != "bash"
|
||||
.if exists(/etc/os-release)
|
||||
distro!= . /etc/os-release && echo $$NAME
|
||||
.endif
|
||||
# dash fails -x output
|
||||
# .SHELL is not bash so may be dash
|
||||
# if distro is Ubuntu or we cannot tell, assume the worst
|
||||
.if ${distro:U:NUbuntu} == ""
|
||||
BROKEN_TESTS+= opt-debug-x-trace
|
||||
.endif
|
||||
.endif
|
||||
|
||||
.if ${.MAKE.OS} == "SCO_SV"
|
||||
BROKEN_TESTS+= \
|
||||
opt-debug-graph[23] \
|
||||
varmod-localtime \
|
||||
varmod-to-separator \
|
||||
|
||||
.if ${.SHELL:T} == "bash"
|
||||
.if ${_shell} == "bash"
|
||||
BROKEN_TESTS+= job-output-null
|
||||
.else
|
||||
BROKEN_TESTS+= \
|
||||
|
@ -2,5 +2,9 @@ first 1
|
||||
first 2
|
||||
second 1
|
||||
second 2
|
||||
first-first 1
|
||||
first-first 2
|
||||
first-second 1
|
||||
first-second 2
|
||||
directly
|
||||
exit status 0
|
||||
|
@ -1,7 +1,11 @@
|
||||
# $NetBSD: depsrc-use.mk,v 1.5 2021/12/28 14:22:51 rillig Exp $
|
||||
# $NetBSD: depsrc-use.mk,v 1.6 2022/04/18 14:38:24 rillig Exp $
|
||||
#
|
||||
# Tests for the special source .USE in dependency declarations,
|
||||
# which allows to append common commands to other targets.
|
||||
#
|
||||
# See also:
|
||||
# .USEBEFORE
|
||||
# depsrc-usebefore.mk
|
||||
|
||||
# Before make.h 1.280 from 2021-12-28, a .USEBEFORE target was accidentally
|
||||
# regarded as a candidate for the main target. On the other hand, a .USE
|
||||
@ -10,9 +14,15 @@ not-a-main-candidate: .USE
|
||||
|
||||
all: action directly
|
||||
|
||||
first: .USE
|
||||
first: .USE first-first first-second
|
||||
@echo first 1 # Using ${.TARGET} here would expand to "action"
|
||||
@echo first 2
|
||||
first-first: .USE
|
||||
@echo first-first 1
|
||||
@echo first-first 2
|
||||
first-second: .USE
|
||||
@echo first-second 1
|
||||
@echo first-second 2
|
||||
|
||||
second: .USE
|
||||
@echo second 1
|
||||
@ -22,7 +32,7 @@ second: .USE
|
||||
# This may happen as the result of expanding a .for loop.
|
||||
empty: .USE
|
||||
|
||||
# It's possible but uncommon to directly make a .USEBEFORE target.
|
||||
# It's possible but uncommon to directly make a .USE target.
|
||||
directly: .USE
|
||||
@echo directly
|
||||
|
||||
|
@ -1,6 +1,42 @@
|
||||
first 1
|
||||
first 2
|
||||
second 1
|
||||
second 2
|
||||
directly
|
||||
after-2-before-2 1
|
||||
after-2-before-2 2
|
||||
after-2-before-1 1
|
||||
after-2-before-1 2
|
||||
after-1-before-2 1
|
||||
after-1-before-2 2
|
||||
after-1-before-1 1
|
||||
after-1-before-1 2
|
||||
before-2-before-2 1
|
||||
before-2-before-2 2
|
||||
before-2-before-1 1
|
||||
before-2-before-1 2
|
||||
before-1-before-2 1
|
||||
before-1-before-2 2
|
||||
before-1-before-1 1
|
||||
before-1-before-1 2
|
||||
before-2 1
|
||||
before-2 2
|
||||
before-1 1
|
||||
before-1 2
|
||||
after-1 1
|
||||
after-1 2
|
||||
after-2 1
|
||||
after-2 2
|
||||
before-1-after-1 1
|
||||
before-1-after-1 2
|
||||
before-1-after-2 1
|
||||
before-1-after-2 2
|
||||
before-2-after-1 1
|
||||
before-2-after-1 2
|
||||
before-2-after-2 1
|
||||
before-2-after-2 2
|
||||
after-1-after-1 1
|
||||
after-1-after-1 2
|
||||
after-1-after-2 1
|
||||
after-1-after-2 2
|
||||
after-2-after-1 1
|
||||
after-2-after-1 2
|
||||
after-2-after-2 1
|
||||
after-2-after-2 2
|
||||
`directly' is up to date.
|
||||
exit status 0
|
||||
|
@ -1,8 +1,14 @@
|
||||
# $NetBSD: depsrc-usebefore.mk,v 1.7 2021/12/28 14:22:51 rillig Exp $
|
||||
# $NetBSD: depsrc-usebefore.mk,v 1.9 2022/04/18 14:41:42 rillig Exp $
|
||||
#
|
||||
# Tests for the special source .USEBEFORE in dependency declarations,
|
||||
# which allows to prepend common commands to other targets.
|
||||
#
|
||||
# If a target depends on several .USE or .USEBEFORE nodes, the commands get
|
||||
# appended or prepended in declaration order. For .USE nodes, this is the
|
||||
# expected order, for .USEBEFORE nodes the order is somewhat reversed, and for
|
||||
# .USE or .USEBEFORE nodes that depend on other .USE or .USEBEFORE nodes, it
|
||||
# gets even more complicated.
|
||||
#
|
||||
# See also:
|
||||
# .USE
|
||||
# depsrc-use.mk
|
||||
@ -12,22 +18,98 @@
|
||||
# target was not.
|
||||
not-a-main-candidate: .USEBEFORE
|
||||
|
||||
all: action directly
|
||||
all:
|
||||
@${MAKE} -r -f ${MAKEFILE} ordering
|
||||
@${MAKE} -r -f ${MAKEFILE} directly
|
||||
|
||||
first: .USEBEFORE
|
||||
@echo first 1 # Using ${.TARGET} here would expand to "action"
|
||||
@echo first 2 # Using ${.TARGET} here would expand to "action"
|
||||
ordering: before-1 before-2 after-1 after-2
|
||||
|
||||
second: .USEBEFORE
|
||||
@echo second 1
|
||||
@echo second 2
|
||||
before-1: .USEBEFORE before-1-before-1 before-1-before-2 before-1-after-1 before-1-after-2
|
||||
@echo before-1 1
|
||||
@echo before-1 2
|
||||
|
||||
before-1-before-1: .USEBEFORE
|
||||
@echo before-1-before-1 1
|
||||
@echo before-1-before-1 2
|
||||
|
||||
before-1-before-2: .USEBEFORE
|
||||
@echo before-1-before-2 1
|
||||
@echo before-1-before-2 2
|
||||
|
||||
before-1-after-1: .USE
|
||||
@echo before-1-after-1 1
|
||||
@echo before-1-after-1 2
|
||||
|
||||
before-1-after-2: .USE
|
||||
@echo before-1-after-2 1
|
||||
@echo before-1-after-2 2
|
||||
|
||||
before-2: .USEBEFORE before-2-before-1 before-2-before-2 before-2-after-1 before-2-after-2
|
||||
@echo before-2 1
|
||||
@echo before-2 2
|
||||
|
||||
before-2-before-1: .USEBEFORE
|
||||
@echo before-2-before-1 1
|
||||
@echo before-2-before-1 2
|
||||
|
||||
before-2-before-2: .USEBEFORE
|
||||
@echo before-2-before-2 1
|
||||
@echo before-2-before-2 2
|
||||
|
||||
before-2-after-1: .USE
|
||||
@echo before-2-after-1 1
|
||||
@echo before-2-after-1 2
|
||||
|
||||
before-2-after-2: .USE
|
||||
@echo before-2-after-2 1
|
||||
@echo before-2-after-2 2
|
||||
|
||||
after-1: .USE after-1-before-1 after-1-before-2 after-1-after-1 after-1-after-2
|
||||
@echo after-1 1
|
||||
@echo after-1 2
|
||||
|
||||
after-1-before-1: .USEBEFORE
|
||||
@echo after-1-before-1 1
|
||||
@echo after-1-before-1 2
|
||||
|
||||
after-1-before-2: .USEBEFORE
|
||||
@echo after-1-before-2 1
|
||||
@echo after-1-before-2 2
|
||||
|
||||
after-1-after-1: .USE
|
||||
@echo after-1-after-1 1
|
||||
@echo after-1-after-1 2
|
||||
|
||||
after-1-after-2: .USE
|
||||
@echo after-1-after-2 1
|
||||
@echo after-1-after-2 2
|
||||
|
||||
after-2: .USE after-2-before-1 after-2-before-2 after-2-after-1 after-2-after-2
|
||||
@echo after-2 1
|
||||
@echo after-2 2
|
||||
|
||||
after-2-before-1: .USEBEFORE
|
||||
@echo after-2-before-1 1
|
||||
@echo after-2-before-1 2
|
||||
|
||||
after-2-before-2: .USEBEFORE
|
||||
@echo after-2-before-2 1
|
||||
@echo after-2-before-2 2
|
||||
|
||||
after-2-after-1: .USE
|
||||
@echo after-2-after-1 1
|
||||
@echo after-2-after-1 2
|
||||
|
||||
after-2-after-2: .USE
|
||||
@echo after-2-after-2 1
|
||||
@echo after-2-after-2 2
|
||||
|
||||
# It is possible but uncommon to have a .USEBEFORE target with no commands.
|
||||
# This may happen as the result of expanding a .for loop.
|
||||
empty: .USEBEFORE
|
||||
|
||||
# It is possible but uncommon to directly make a .USEBEFORE target.
|
||||
# It is technically possible to directly make a .USEBEFORE target, but it
|
||||
# doesn't make sense since GNode_IsOODate considers such a target to always be
|
||||
# up to date.
|
||||
directly: .USEBEFORE
|
||||
@echo directly
|
||||
|
||||
action: second first empty
|
||||
|
1
unit-tests/deptgt-posix.exp
Normal file
1
unit-tests/deptgt-posix.exp
Normal file
@ -0,0 +1 @@
|
||||
exit status 0
|
116
unit-tests/deptgt-posix.mk
Normal file
116
unit-tests/deptgt-posix.mk
Normal file
@ -0,0 +1,116 @@
|
||||
# $NetBSD: deptgt-posix.mk,v 1.2 2022/04/18 15:59:39 sjg Exp $
|
||||
#
|
||||
# Tests for the special target '.POSIX', which enables POSIX mode.
|
||||
#
|
||||
# As of 2022-04-18, this only means that the variable '%POSIX' is defined and
|
||||
# that the variables and rules specified by POSIX replace the default ones.
|
||||
# This is done by loading <posix.mk>, if available. That file is not included
|
||||
# in NetBSD, but only in the bmake distribution. As of 2022-04-18, POSIX
|
||||
# support is not complete.
|
||||
#
|
||||
# Implementation node: this test needs to be isolated from the usual test
|
||||
# to prevent unit-tests/posix.mk from interfering with the posix.mk from the
|
||||
# system directory that this test uses.
|
||||
#
|
||||
# See also:
|
||||
# https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
|
||||
|
||||
TESTTMP= ${TMPDIR:U/tmp}/make.test.deptgt-posix
|
||||
SYSDIR= ${TESTTMP}/sysdir
|
||||
MAIN_MK= ${TESTTMP}/main.mk
|
||||
INCLUDED_MK= ${TESTTMP}/included.mk
|
||||
|
||||
all: .PHONY
|
||||
.SILENT:
|
||||
|
||||
set-up-sysdir: .USEBEFORE
|
||||
mkdir -p ${SYSDIR}
|
||||
printf '%s\n' > ${SYSDIR}/sys.mk \
|
||||
'CC=sys-cc' \
|
||||
'SEEN_SYS_MK=yes'
|
||||
printf '%s\n' > ${SYSDIR}/posix.mk \
|
||||
'CC=posix-cc'
|
||||
|
||||
check-is-posix: .USE
|
||||
printf '%s\n' >> ${MAIN_MK} \
|
||||
'.if $${CC} != "posix-cc"' \
|
||||
'. error' \
|
||||
'.endif' \
|
||||
'.if $${%POSIX} != "1003.2"' \
|
||||
'. error' \
|
||||
'.endif' \
|
||||
'all: .PHONY'
|
||||
|
||||
check-not-posix: .USE
|
||||
printf '%s\n' >> ${MAIN_MK} \
|
||||
'.if $${CC} != "sys-cc"' \
|
||||
'. error' \
|
||||
'.endif' \
|
||||
'.if defined(%POSIX)' \
|
||||
'. error' \
|
||||
'.endif' \
|
||||
'all: .PHONY'
|
||||
|
||||
check-not-seen-sys-mk: .USE
|
||||
printf '%s\n' >> ${MAIN_MK} \
|
||||
'.if defined(SEEN_SYS_MK)' \
|
||||
'. error' \
|
||||
'.endif'
|
||||
|
||||
run: .USE
|
||||
(cd "${TESTTMP}" && MAKEFLAGS=${MAKEFLAGS.${.TARGET}:Q} ${MAKE} \
|
||||
-m "${SYSDIR}" -f ${MAIN_MK:T})
|
||||
rm -rf ${TESTTMP}
|
||||
|
||||
# If the main makefile has a '.for' loop as its first non-comment line, a
|
||||
# strict reading of POSIX 2018 makes the makefile non-conforming.
|
||||
all: after-for
|
||||
after-for: .PHONY set-up-sysdir check-not-posix run
|
||||
printf '%s\n' > ${MAIN_MK} \
|
||||
'# comment' \
|
||||
'' \
|
||||
'.for i in once' \
|
||||
'.POSIX:' \
|
||||
'.endfor'
|
||||
|
||||
# If the main makefile has an '.if' conditional as its first non-comment line,
|
||||
# a strict reading of POSIX 2018 makes the makefile non-conforming.
|
||||
all: after-if
|
||||
after-if: .PHONY set-up-sysdir check-not-posix run
|
||||
printf '%s\n' > ${MAIN_MK} \
|
||||
'# comment' \
|
||||
'' \
|
||||
'.if 1' \
|
||||
'.POSIX:' \
|
||||
'.endif'
|
||||
|
||||
# If the main makefile first includes another makefile and that included
|
||||
# makefile tries to switch to POSIX mode, that's too late.
|
||||
all: in-included-file
|
||||
in-included-file: .PHONY set-up-sysdir check-not-posix run
|
||||
printf 'include included.mk\n' > ${MAIN_MK}
|
||||
printf '.POSIX:\n' > ${INCLUDED_MK}
|
||||
|
||||
# If the main makefile switches to POSIX mode in its very first line, before
|
||||
# and comment lines or empty lines, that works.
|
||||
all: in-first-line
|
||||
in-first-line: .PHONY set-up-sysdir check-is-posix run
|
||||
printf '%s\n' > ${MAIN_MK} \
|
||||
'.POSIX:'
|
||||
|
||||
# The only allowed lines before switching to POSIX mode are comment lines.
|
||||
# POSIX defines that empty and blank lines are called comment lines as well.
|
||||
all: after-comment-lines
|
||||
after-comment-lines: .PHONY set-up-sysdir check-is-posix run
|
||||
printf '%s\n' > ${MAIN_MK} \
|
||||
'# comment' \
|
||||
'' \
|
||||
'.POSIX:'
|
||||
|
||||
# Running make with the option '-r' skips the builtin rules from <sys.mk>.
|
||||
# In that mode, '.POSIX:' just loads <posix.mk>, which works as well.
|
||||
MAKEFLAGS.no-builtins= -r
|
||||
all: no-builtins
|
||||
no-builtins: .PHONY set-up-sysdir check-is-posix check-not-seen-sys-mk run
|
||||
printf '%s\n' > ${MAIN_MK} \
|
||||
'.POSIX:'
|
@ -1,4 +1,4 @@
|
||||
# $NetBSD: deptgt-silent-jobs.mk,v 1.2 2022/02/12 11:14:48 rillig Exp $
|
||||
# $NetBSD: deptgt-silent-jobs.mk,v 1.3 2022/04/15 09:33:20 rillig Exp $
|
||||
#
|
||||
# Ensure that the special dependency target '.SILENT' only affects the amount
|
||||
# of output, but not the kind of error handling.
|
||||
@ -28,7 +28,6 @@ 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:
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $NetBSD: opt-debug-cond.mk,v 1.2 2022/01/23 16:09:38 rillig Exp $
|
||||
# $NetBSD: opt-debug-cond.mk,v 1.3 2022/04/15 09:33:20 rillig Exp $
|
||||
#
|
||||
# Tests for the -dc command line option, which adds debug logging for the
|
||||
# evaluation of conditional expressions, such as in .if directives and
|
||||
@ -7,11 +7,11 @@
|
||||
.MAKEFLAGS: -dc
|
||||
|
||||
# expect: CondParser_Eval: ${:U12345} > ${:U55555}
|
||||
# expect: lhs = 12345.000000, rhs = 55555.000000, op = >
|
||||
# expect: Comparing 12345.000000 > 55555.000000
|
||||
.if ${:U12345} > ${:U55555}
|
||||
|
||||
# expect: CondParser_Eval: "string" != "string"
|
||||
# expect: lhs = "string", rhs = "string", op = !=
|
||||
# expect: Comparing "string" != "string"
|
||||
.elif "string" != "string"
|
||||
|
||||
# expect: CondParser_Eval: "nonempty"
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $NetBSD: varname-dot-suffixes.mk,v 1.2 2022/01/15 12:35:18 rillig Exp $
|
||||
# $NetBSD: varname-dot-suffixes.mk,v 1.3 2022/04/15 09:33:20 rillig Exp $
|
||||
#
|
||||
# Tests for the special "variable" .SUFFIXES, which lists the suffixes that
|
||||
# have been registered for use in suffix transformation rules. Suffixes are
|
||||
@ -51,7 +51,7 @@
|
||||
# Deleting .SUFFIXES has no effect since there is no actual variable of that
|
||||
# name.
|
||||
.MAKEFLAGS: -dv
|
||||
# expect: Global:delete .SUFFIXES (not found)
|
||||
# expect: Global: delete .SUFFIXES (not found)
|
||||
.undef .SUFFIXES
|
||||
.MAKEFLAGS: -d0
|
||||
.if ${.SUFFIXES} != ".c .o .1 .err .tar.gz"
|
||||
@ -97,7 +97,7 @@ _:= ${preserve:L:_=.SUFFIXES}
|
||||
# expect: Command: .SUFFIXES = 1 ignored (read-only)
|
||||
# expect: Command: .SUFFIXES = 2 ignored (read-only)
|
||||
# XXX: Missing space after ':'
|
||||
# expect: Command:delete .SUFFIXES (not found)
|
||||
# expect: Command: delete .SUFFIXES (not found)
|
||||
.if ${1 2:L:@.SUFFIXES@${.SUFFIXES}@} != ".c .o .1 .err .tar.gz .c .o .1 .err .tar.gz"
|
||||
. error
|
||||
.endif
|
||||
|
Loading…
Reference in New Issue
Block a user