aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorSimon J. Gerraty <sjg@FreeBSD.org>2017-04-15 00:51:18 +0000
committerSimon J. Gerraty <sjg@FreeBSD.org>2017-04-15 00:51:18 +0000
commit85813b0c12abc28e502c1b1ae68d71ccfbd89b86 (patch)
tree15fee7050cc8d838064875460fa4480606d2e0c9 /main.c
parent60a7ffecc77c5e3bf4aa5462ebf16bbd377a5af8 (diff)
Import bmake-20170413vendor/NetBSD/bmake/20170413
Notes
svn path=/vendor/NetBSD/bmake/dist/; revision=316947 svn path=/vendor/NetBSD/bmake/20170413/; revision=316948; tag=vendor/NetBSD/bmake/20170413
Diffstat (limited to 'main.c')
-rw-r--r--main.c58
1 files changed, 39 insertions, 19 deletions
diff --git a/main.c b/main.c
index 870eefd6e591..cf9a64dba531 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.257 2017/02/08 17:47:36 christos Exp $ */
+/* $NetBSD: main.c,v 1.260 2017/04/13 13:55:23 christos Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,7 +69,7 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: main.c,v 1.257 2017/02/08 17:47:36 christos Exp $";
+static char rcsid[] = "$NetBSD: main.c,v 1.260 2017/04/13 13:55:23 christos Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
@@ -81,7 +81,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993\
#if 0
static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 3/19/94";
#else
-__RCSID("$NetBSD: main.c,v 1.257 2017/02/08 17:47:36 christos Exp $");
+__RCSID("$NetBSD: main.c,v 1.260 2017/04/13 13:55:23 christos Exp $");
#endif
#endif /* not lint */
#endif
@@ -458,7 +458,8 @@ rearg:
(void)fprintf(stderr, "%s: %s.\n", progname, strerror(errno));
exit(2);
}
- if (stat(argvalue, &sa) != -1 &&
+ if (argvalue[0] == '/' &&
+ stat(argvalue, &sa) != -1 &&
stat(curdir, &sb) != -1 &&
sa.st_ino == sb.st_ino &&
sa.st_dev == sb.st_dev)
@@ -721,22 +722,15 @@ Boolean
Main_SetObjdir(const char *fmt, ...)
{
struct stat sb;
- char *p, *path;
- char buf[MAXPATHLEN + 1], pbuf[MAXPATHLEN + 1];
+ char *path;
+ char buf[MAXPATHLEN + 1];
Boolean rc = FALSE;
va_list ap;
va_start(ap, fmt);
- vsnprintf(path = pbuf, MAXPATHLEN, fmt, ap);
+ vsnprintf(path = buf, MAXPATHLEN, fmt, ap);
va_end(ap);
- /* expand variable substitutions */
- if (strchr(path, '$') != 0) {
- snprintf(buf, MAXPATHLEN, "%s", path);
- path = p = Var_Subst(NULL, buf, VAR_GLOBAL, VARF_WANTRES);
- } else
- p = NULL;
-
if (path[0] != '/') {
snprintf(buf, MAXPATHLEN, "%s/%s", curdir, path);
path = buf;
@@ -752,25 +746,35 @@ Main_SetObjdir(const char *fmt, ...)
Var_Set(".OBJDIR", objdir, VAR_GLOBAL, 0);
setenv("PWD", objdir, 1);
Dir_InitDot();
+ cached_realpath(".OBJDIR", NULL); /* purge */
rc = TRUE;
if (enterFlag && strcmp(objdir, curdir) != 0)
enterFlagObj = TRUE;
}
}
- free(p);
return rc;
}
static Boolean
Main_SetVarObjdir(const char *var, const char *suffix)
{
- char *p1, *path;
- if ((path = Var_Value(var, VAR_CMD, &p1)) == NULL)
+ char *p, *path, *xpath;
+
+ if ((path = Var_Value(var, VAR_CMD, &p)) == NULL)
return FALSE;
- (void)Main_SetObjdir("%s%s", path, suffix);
- free(p1);
+ /* expand variable substitutions */
+ if (strchr(path, '$') != 0)
+ xpath = Var_Subst(NULL, path, VAR_GLOBAL, VARF_WANTRES);
+ else
+ xpath = path;
+
+ (void)Main_SetObjdir("%s%s", xpath, suffix);
+
+ if (xpath != path)
+ free(xpath);
+ free(p);
return TRUE;
}
@@ -1922,7 +1926,23 @@ cached_realpath(const char *pathname, char *resolved)
cache->flags = INTERNAL;
#endif
}
+ if (resolved == NULL && strcmp(pathname, ".OBJDIR") == 0) {
+ /* purge any relative paths */
+ Hash_Entry *he, *nhe;
+ Hash_Search hs;
+ he = Hash_EnumFirst(&cache->context, &hs);
+ while (he) {
+ nhe = Hash_EnumNext(&hs);
+ if (he->name[0] != '/') {
+ if (DEBUG(DIR))
+ fprintf(stderr, "cached_realpath: purging %s\n", he->name);
+ Hash_DeleteEntry(&cache->context, he);
+ }
+ he = nhe;
+ }
+ return NULL;
+ }
if ((rp = Var_Value(pathname, cache, &cp)) != NULL) {
/* a hit */
strlcpy(resolved, rp, MAXPATHLEN);