Module Name: src
Committed By: sjg
Date: Thu Nov 12 23:35:21 UTC 2020
Modified Files:
src/usr.bin/make: main.c make.1 make.h parse.c
src/usr.bin/make/unit-tests: Makefile
Added Files:
src/usr.bin/make/unit-tests: objdir-writable.exp objdir-writable.mk
Log Message:
Pass a writable flag to Main_SetObjdir to control writable check
For curdir and an explicit .OBJDIR target, we allow for
the directory to be read-only.
During InitObjdir we otherwise default to requiring objdir to be
writable - this can be controlled by env variable
MAKE_OBJDIR_CHECK_WRITABLE
Add unit-tests/objdir-writable
Reviewed by: christos rillig
To generate a diff of this commit:
cvs rdiff -u -r1.455 -r1.456 src/usr.bin/make/main.c
cvs rdiff -u -r1.290 -r1.291 src/usr.bin/make/make.1
cvs rdiff -u -r1.205 -r1.206 src/usr.bin/make/make.h
cvs rdiff -u -r1.437 -r1.438 src/usr.bin/make/parse.c
cvs rdiff -u -r1.197 -r1.198 src/usr.bin/make/unit-tests/Makefile
cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/objdir-writable.exp \
src/usr.bin/make/unit-tests/objdir-writable.mk
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/make/main.c
diff -u src/usr.bin/make/main.c:1.455 src/usr.bin/make/main.c:1.456
--- src/usr.bin/make/main.c:1.455 Sun Nov 8 23:38:02 2020
+++ src/usr.bin/make/main.c Thu Nov 12 23:35:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.455 2020/11/08 23:38:02 rillig Exp $ */
+/* $NetBSD: main.c,v 1.456 2020/11/12 23:35:21 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -109,7 +109,7 @@
#include "trace.h"
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: main.c,v 1.455 2020/11/08 23:38:02 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.456 2020/11/12 23:35:21 sjg Exp $");
#if defined(MAKE_NATIVE) && !defined(lint)
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
"The Regents of the University of California. "
@@ -710,7 +710,7 @@ Main_ParseArgLine(const char *line)
}
Boolean
-Main_SetObjdir(const char *fmt, ...)
+Main_SetObjdir(Boolean writable, const char *fmt, ...)
{
struct stat sb;
char *path;
@@ -730,8 +730,7 @@ Main_SetObjdir(const char *fmt, ...)
/* look for the directory and try to chdir there */
if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) {
- /* if not .CURDIR it must be writable */
- if ((strcmp(path, curdir) != 0 && access(path, W_OK) != 0) ||
+ if ((writable && access(path, W_OK) != 0) ||
(chdir(path) != 0)) {
(void)fprintf(stderr, "make warning: %s: %s.\n",
path, strerror(errno));
@@ -751,7 +750,7 @@ Main_SetObjdir(const char *fmt, ...)
}
static Boolean
-Main_SetVarObjdir(const char *var, const char *suffix)
+Main_SetVarObjdir(Boolean writable, const char *var, const char *suffix)
{
void *path_freeIt;
const char *path = Var_Value(var, VAR_CMDLINE, &path_freeIt);
@@ -772,7 +771,7 @@ Main_SetVarObjdir(const char *var, const
xpath = xpath_freeIt;
}
- (void)Main_SetObjdir("%s%s", xpath, suffix);
+ (void)Main_SetObjdir(writable, "%s%s", xpath, suffix);
bmake_free(xpath_freeIt);
bmake_free(path_freeIt);
@@ -1093,15 +1092,18 @@ ignore_pwd:
static void
InitObjdir(const char *machine, const char *machine_arch)
{
+ Boolean writable;
+
Dir_InitDir(curdir);
- (void)Main_SetObjdir("%s", curdir);
+ writable = GetBooleanVar("MAKE_OBJDIR_CHECK_WRITABLE", TRUE);
+ (void)Main_SetObjdir(FALSE, "%s", curdir);
- if (!Main_SetVarObjdir("MAKEOBJDIRPREFIX", curdir) &&
- !Main_SetVarObjdir("MAKEOBJDIR", "") &&
- !Main_SetObjdir("%s.%s-%s", _PATH_OBJDIR, machine, machine_arch) &&
- !Main_SetObjdir("%s.%s", _PATH_OBJDIR, machine) &&
- !Main_SetObjdir("%s", _PATH_OBJDIR))
- (void)Main_SetObjdir("%s%s", _PATH_OBJDIRPREFIX, curdir);
+ if (!Main_SetVarObjdir(writable, "MAKEOBJDIRPREFIX", curdir) &&
+ !Main_SetVarObjdir(writable, "MAKEOBJDIR", "") &&
+ !Main_SetObjdir(writable, "%s.%s-%s", _PATH_OBJDIR, machine, machine_arch) &&
+ !Main_SetObjdir(writable, "%s.%s", _PATH_OBJDIR, machine) &&
+ !Main_SetObjdir(writable, "%s", _PATH_OBJDIR))
+ (void)Main_SetObjdir(writable, "%s%s", _PATH_OBJDIRPREFIX, curdir);
}
/* get rid of resource limit on file descriptors */
Index: src/usr.bin/make/make.1
diff -u src/usr.bin/make/make.1:1.290 src/usr.bin/make/make.1:1.291
--- src/usr.bin/make/make.1:1.290 Sun Nov 1 20:24:45 2020
+++ src/usr.bin/make/make.1 Thu Nov 12 23:35:21 2020
@@ -1,4 +1,4 @@
-.\" $NetBSD: make.1,v 1.290 2020/11/01 20:24:45 rillig Exp $
+.\" $NetBSD: make.1,v 1.291 2020/11/12 23:35:21 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 November 1, 2020
+.Dd November 12, 2020
.Dt MAKE 1
.Os
.Sh NAME
@@ -1089,6 +1089,15 @@ to the specified directory if it exists,
and
.Ql Ev PWD
to that directory before executing any targets.
+.Pp
+Except in the case of an explicit
+.Ql Ic .OBJDIR
+target,
+.Nm
+will check that the specified directory is writable and ignore it if not.
+This check can be skipped by setting the environment variable
+.Ql Ev MAKE_OBJDIR_CHECK_WRITABLE
+to "no".
.
.It Va .PARSEDIR
A path to the directory of the current
Index: src/usr.bin/make/make.h
diff -u src/usr.bin/make/make.h:1.205 src/usr.bin/make/make.h:1.206
--- src/usr.bin/make/make.h:1.205 Tue Nov 10 00:32:12 2020
+++ src/usr.bin/make/make.h Thu Nov 12 23:35:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: make.h,v 1.205 2020/11/10 00:32:12 rillig Exp $ */
+/* $NetBSD: make.h,v 1.206 2020/11/12 23:35:21 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -652,7 +652,7 @@ Boolean Make_Run(GNodeList *);
Boolean shouldDieQuietly(GNode *, int);
void PrintOnError(GNode *, const char *);
void Main_ExportMAKEFLAGS(Boolean);
-Boolean Main_SetObjdir(const char *, ...) MAKE_ATTR_PRINTFLIKE(1, 2);
+Boolean Main_SetObjdir(Boolean, const char *, ...) MAKE_ATTR_PRINTFLIKE(2, 3);
int mkTempFile(const char *, char **);
int str2Lst_Append(StringList *, char *, const char *);
void GNode_FprintDetails(FILE *, const char *, const GNode *, const char *);
Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.437 src/usr.bin/make/parse.c:1.438
--- src/usr.bin/make/parse.c:1.437 Sun Nov 8 23:38:02 2020
+++ src/usr.bin/make/parse.c Thu Nov 12 23:35:21 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.437 2020/11/08 23:38:02 rillig Exp $ */
+/* $NetBSD: parse.c,v 1.438 2020/11/12 23:35:21 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -117,7 +117,7 @@
#include "pathnames.h"
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: parse.c,v 1.437 2020/11/08 23:38:02 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.438 2020/11/12 23:35:21 sjg Exp $");
/* types and constants */
@@ -1429,7 +1429,7 @@ ParseDoDependencySourceSpecial(ParseSpec
Suff_SetNull(word);
break;
case SP_OBJDIR:
- Main_SetObjdir("%s", word);
+ Main_SetObjdir(FALSE, "%s", word);
break;
default:
break;
Index: src/usr.bin/make/unit-tests/Makefile
diff -u src/usr.bin/make/unit-tests/Makefile:1.197 src/usr.bin/make/unit-tests/Makefile:1.198
--- src/usr.bin/make/unit-tests/Makefile:1.197 Tue Nov 10 22:23:37 2020
+++ src/usr.bin/make/unit-tests/Makefile Thu Nov 12 23:35:21 2020
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.197 2020/11/10 22:23:37 rillig Exp $
+# $NetBSD: Makefile,v 1.198 2020/11/12 23:35:21 sjg Exp $
#
# Unit tests for make(1)
#
@@ -188,6 +188,7 @@ TESTS+= modmatch
TESTS+= modmisc
TESTS+= modts
TESTS+= modword
+TESTS+= objdir-writable
TESTS+= opt
TESTS+= opt-backwards
TESTS+= opt-chdir
@@ -379,10 +380,16 @@ TESTS+= varparse-mod
TESTS+= varparse-undef-partial
TESTS+= varquote
+.if ${.OBJDIR} != ${.CURDIR}
+RO_OBJDIR:= ${.OBJDIR}/roobj
+.else
+RO_OBJDIR:= ${TMPDIR:U/tmp}/roobj
+.endif
# Additional environment variables for some of the tests.
# The base environment is -i PATH="$PATH".
ENV.depsrc-optional+= TZ=UTC
ENV.envfirst= FROM_ENV=value-from-env
+ENV.objdir-writable+= RO_OBJDIR=${RO_OBJDIR}
ENV.varmisc= FROM_ENV=env
ENV.varmisc+= FROM_ENV_BEFORE=env
ENV.varmisc+= FROM_ENV_AFTER=env
@@ -409,6 +416,7 @@ SED_CMDS.job-output-long-lines= \
${:D marker should always be at the beginning of the line. } \
-e '/^aa*--- job-b ---$$/d' \
-e '/^bb*--- job-a ---$$/d'
+SED_CMDS.objdir-writable= -e 's,${RO_OBJDIR},OBJDIR/roobj,g'
SED_CMDS.opt-debug-graph1= \
-e 's,${.CURDIR},CURDIR,'
SED_CMDS.opt-debug-graph1+= \
Added files:
Index: src/usr.bin/make/unit-tests/objdir-writable.exp
diff -u /dev/null src/usr.bin/make/unit-tests/objdir-writable.exp:1.1
--- /dev/null Thu Nov 12 23:35:21 2020
+++ src/usr.bin/make/unit-tests/objdir-writable.exp Thu Nov 12 23:35:21 2020
@@ -0,0 +1,5 @@
+make warning: OBJDIR/roobj: Permission denied.
+/tmp
+OBJDIR/roobj
+OBJDIR/roobj
+exit status 0
Index: src/usr.bin/make/unit-tests/objdir-writable.mk
diff -u /dev/null src/usr.bin/make/unit-tests/objdir-writable.mk:1.1
--- /dev/null Thu Nov 12 23:35:21 2020
+++ src/usr.bin/make/unit-tests/objdir-writable.mk Thu Nov 12 23:35:21 2020
@@ -0,0 +1,27 @@
+# $NetBSD: objdir-writable.mk,v 1.1 2020/11/12 23:35:21 sjg Exp $
+
+# test checking for writable objdir
+
+RO_OBJDIR?= ${TMPDIR:U/tmp}/roobj
+
+.if make(do-objdir)
+# this should succeed
+.OBJDIR: ${RO_OBJDIR}
+
+do-objdir:
+.else
+all: no-objdir ro-objdir explicit-objdir
+
+# make it now
+x!= echo; mkdir -p ${RO_OBJDIR}; chmod 555 ${RO_OBJDIR}
+
+no-objdir:
+ @MAKEOBJDIR=${RO_OBJDIR} ${.MAKE} -r -f /dev/null -C /tmp -V .OBJDIR
+
+ro-objdir:
+ @MAKEOBJDIR=${RO_OBJDIR} ${.MAKE} -r -f /dev/null -C /tmp -V .OBJDIR MAKE_OBJDIR_CHECK_WRITABLE=no
+
+explicit-objdir:
+ @${.MAKE} -r -f ${MAKEFILE} -C /tmp do-objdir -V .OBJDIR
+.endif
+