From 74eb567570b01612e2c92060c1873698204567c4 Mon Sep 17 00:00:00 2001 From: sjg Date: Sat, 22 Aug 2020 19:30:58 +0000 Subject: [PATCH] Add .SHELL as read-only variable The .SHELL variable represents the shellPath used to run scripts. Reviewed by: rillig, christos --- usr.bin/make/job.c | 7 ++++--- usr.bin/make/make.1 | 7 +++++-- usr.bin/make/nonints.h | 9 +++++++- usr.bin/make/unit-tests/export.exp | 1 - usr.bin/make/var.c | 33 +++++++++++++++++++++--------- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c index 6f903b4cda2a..297f3001997b 100644 --- a/usr.bin/make/job.c +++ b/usr.bin/make/job.c @@ -1,4 +1,4 @@ -/* $NetBSD: job.c,v 1.212 2020/08/22 15:43:32 rillig Exp $ */ +/* $NetBSD: job.c,v 1.213 2020/08/22 19:30:58 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -70,14 +70,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: job.c,v 1.212 2020/08/22 15:43:32 rillig Exp $"; +static char rcsid[] = "$NetBSD: job.c,v 1.213 2020/08/22 19:30:58 sjg Exp $"; #else #include #ifndef lint #if 0 static char sccsid[] = "@(#)job.c 8.2 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: job.c,v 1.212 2020/08/22 15:43:32 rillig Exp $"); +__RCSID("$NetBSD: job.c,v 1.213 2020/08/22 19:30:58 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -2201,6 +2201,7 @@ Shell_Init(void) #endif shellPath = str_concat3(_PATH_DEFSHELLDIR, "/", shellName); } + Var_Set_with_flags(".SHELL", shellPath, VAR_CMD, VAR_SET_READONLY); if (commandShell->exit == NULL) { commandShell->exit = ""; } diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1 index 3c3cbd16cfa9..1019221187eb 100644 --- a/usr.bin/make/make.1 +++ b/usr.bin/make/make.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.287 2020/08/19 06:10:06 rillig Exp $ +.\" $NetBSD: make.1,v 1.288 2020/08/22 19:30:58 sjg 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 August 19, 2020 +.Dd August 22, 2020 .Dt MAKE 1 .Os .Sh NAME @@ -1140,6 +1140,9 @@ is set to the value of for all programs which .Nm executes. +.It Ev .SHELL +The pathname of the shell used to run target scripts. +It is read-only. .It Ev .TARGETS The list of targets explicitly specified on the command line, if any. .It Ev VPATH diff --git a/usr.bin/make/nonints.h b/usr.bin/make/nonints.h index 11b6db8de691..c88245a8d0cb 100644 --- a/usr.bin/make/nonints.h +++ b/usr.bin/make/nonints.h @@ -1,4 +1,4 @@ -/* $NetBSD: nonints.h,v 1.95 2020/08/21 23:28:11 rillig Exp $ */ +/* $NetBSD: nonints.h,v 1.96 2020/08/22 19:30:58 sjg Exp $ */ /*- * Copyright (c) 1988, 1989, 1990, 1993 @@ -186,8 +186,15 @@ typedef enum { VARE_ASSIGN = 0x04 } VarEvalFlags; +typedef enum { + VAR_NO_EXPORT = 0x01, /* do not export */ + VAR_SET_READONLY = 0x02 +} VarSet_Flags; + + void Var_Delete(const char *, GNode *); void Var_Set(const char *, const char *, GNode *); +void Var_Set_with_flags(const char *, const char *, GNode *, VarSet_Flags); void Var_Append(const char *, const char *, GNode *); Boolean Var_Exists(const char *, GNode *); const char *Var_Value(const char *, GNode *, char **); diff --git a/usr.bin/make/unit-tests/export.exp b/usr.bin/make/unit-tests/export.exp index d8ebe1839730..c0e9b98c5a44 100644 --- a/usr.bin/make/unit-tests/export.exp +++ b/usr.bin/make/unit-tests/export.exp @@ -1,5 +1,4 @@ &=ampersand -.MAKE.LEVEL.ENV=MAKELEVEL MAKELEVEL=1 UT_DOLLAR=This is $UT_FU UT_FOO=foobar is fubar diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index eb6463ce2049..e77c8abdd8c5 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.456 2020/08/22 17:34:25 rillig Exp $ */ +/* $NetBSD: var.c,v 1.457 2020/08/22 19:30:58 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.456 2020/08/22 17:34:25 rillig Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.457 2020/08/22 19:30:58 sjg Exp $"; #else #include #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.456 2020/08/22 17:34:25 rillig Exp $"); +__RCSID("$NetBSD: var.c,v 1.457 2020/08/22 19:30:58 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -229,7 +229,8 @@ typedef enum { * variable can then be resolved. */ VAR_REEXPORT = 0x20, /* The variable came from command line. */ - VAR_FROM_CMD = 0x40 + VAR_FROM_CMD = 0x40, + VAR_READONLY = 0x80 } VarFlags; ENUM_RTTI_7(VarFlags, @@ -281,10 +282,6 @@ typedef enum { VARP_ANCHOR_END = 0x08 /* Match at end of word */ } VarPatternFlags; -typedef enum { - VAR_NO_EXPORT = 0x01 /* do not export */ -} VarSet_Flags; - #define BROPEN '{' #define BRCLOSE '}' #define PROPEN '(' @@ -346,6 +343,12 @@ VarFind(const char *name, GNode *ctxt, VarFindFlags flags) if (strcmp(name, ".PREFIX") == 0) name = PREFIX; break; + case 'S': + if (strcmp(name, ".SHELL") == 0 ) { + if (!shellPath) + Shell_Init(); + } + break; case 'T': if (strcmp(name, ".TARGET") == 0) name = TARGET; @@ -771,7 +774,7 @@ Var_UnExport(const char *str) } /* See Var_Set for documentation. */ -static void +void Var_Set_with_flags(const char *name, const char *val, GNode *ctxt, VarSet_Flags flags) { @@ -817,7 +820,16 @@ Var_Set_with_flags(const char *name, const char *val, GNode *ctxt, Var_Delete(name, VAR_GLOBAL); } VarAdd(name, val, ctxt); + if (flags & VAR_SET_READONLY) { + v = VarFind(name, ctxt, 0); + v->flags |= VAR_READONLY; + } } else { + if ((v->flags & VAR_READONLY) && !(flags & VAR_SET_READONLY)) { + VAR_DEBUG("%s:%s = %s ignored (read-only)\n", + ctxt->name, name, val); + goto out; + } Buf_Empty(&v->val); if (val) Buf_AddStr(&v->val, val); @@ -830,8 +842,9 @@ Var_Set_with_flags(const char *name, const char *val, GNode *ctxt, /* * Any variables given on the command line are automatically exported * to the environment (as per POSIX standard) + * Other than internals. */ - if (ctxt == VAR_CMD && !(flags & VAR_NO_EXPORT)) { + if (ctxt == VAR_CMD && !(flags & VAR_NO_EXPORT) && name[0] != '.') { if (v == NULL) { /* we just added it */ v = VarFind(name, ctxt, 0);