summaryrefslogtreecommitdiff
path: root/devel/bmake/files/var.c
diff options
context:
space:
mode:
authorjoerg <joerg@pkgsrc.org>2010-04-20 13:32:15 +0000
committerjoerg <joerg@pkgsrc.org>2010-04-20 13:32:15 +0000
commit75156626a2b9871f49248f4d7653cef0267f9214 (patch)
treebfc75dd360e181f365d9d55eae81b6553d89b2ef /devel/bmake/files/var.c
parent1869e779310e24b43754c694c616566fa8eca3d7 (diff)
downloadpkgsrc-75156626a2b9871f49248f4d7653cef0267f9214.tar.gz
Import bmake-20100414:
- Resolve argv[0] with realpath if needed - Add :tA to realpath(3)ify variables - Support for .info, .warning, .error, .ERROR - Unit tests for .ERROR / .error; never make .ERROR the default target - Fix for .ALLSRC being populated twice - Support for .MAKE_MODE, .MAKE.MAKEFILE_PREFERENCE, .MAKE_DEPENDFILE - Haiku support - Improved diagnostics for .for with multiple variables - Rewrite bootstrap to not use make - Fix for -m .../ - Add support for .unexport - Catch typoes in .el*if etc - Fix parsing of :S;...;...; applied to .for loop iterators appearing in dependency lines
Diffstat (limited to 'devel/bmake/files/var.c')
-rw-r--r--devel/bmake/files/var.c143
1 files changed, 139 insertions, 4 deletions
diff --git a/devel/bmake/files/var.c b/devel/bmake/files/var.c
index 9744fae5747..f412e7bf985 100644
--- a/devel/bmake/files/var.c
+++ b/devel/bmake/files/var.c
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1.1.5 2009/09/18 20:55:32 joerg Exp $ */
+/* $NetBSD: var.c,v 1.1.1.6 2010/04/20 13:32:37 joerg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.1.1.5 2009/09/18 20:55:32 joerg Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.1.1.6 2010/04/20 13:32:37 joerg Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
#else
-__RCSID("$NetBSD: var.c,v 1.1.1.5 2009/09/18 20:55:32 joerg Exp $");
+__RCSID("$NetBSD: var.c,v 1.1.1.6 2010/04/20 13:32:37 joerg Exp $");
#endif
#endif /* not lint */
#endif
@@ -527,6 +527,9 @@ Var_Delete(const char *name, GNode *ctxt)
if ((v->flags & VAR_EXPORTED)) {
unsetenv(v->name);
}
+ if (strcmp(MAKE_EXPORTED, v->name) == 0) {
+ var_exportedVars = VAR_EXPORTED_NONE;
+ }
if (v->name != ln->name)
free(v->name);
Hash_DeleteEntry(&ctxt->context, ln);
@@ -711,6 +714,107 @@ Var_Export(char *str, int isExport)
free(av);
}
+
+/*
+ * This is called when .unexport[-env] is seen.
+ */
+void
+Var_UnExport(char *str)
+{
+ char tmp[BUFSIZ];
+ char *vlist;
+ char *cp;
+ Boolean unexport_env;
+ int n;
+
+ if (!str || !str[0]) {
+ return; /* assert? */
+ }
+
+ vlist = NULL;
+
+ str += 8;
+ unexport_env = (strncmp(str, "-env", 4) == 0);
+ if (unexport_env) {
+ extern char **environ;
+ static char **savenv;
+ char **newenv;
+
+ cp = getenv(MAKE_LEVEL); /* we should preserve this */
+ if (environ == savenv) {
+ /* we have been here before! */
+ newenv = bmake_realloc(environ, 2 * sizeof(char *));
+ } else {
+ if (savenv) {
+ free(savenv);
+ savenv = NULL;
+ }
+ newenv = bmake_malloc(2 * sizeof(char *));
+ }
+ if (!newenv)
+ return;
+ /* Note: we cannot safely free() the original environ. */
+ environ = savenv = newenv;
+ newenv[0] = NULL;
+ newenv[1] = NULL;
+ setenv(MAKE_LEVEL, cp, 1);
+ } else {
+ for (; *str != '\n' && isspace((unsigned char) *str); str++)
+ continue;
+ if (str[0] && str[0] != '\n') {
+ vlist = str;
+ }
+ }
+
+ if (!vlist) {
+ /* Using .MAKE.EXPORTED */
+ n = snprintf(tmp, sizeof(tmp), "${" MAKE_EXPORTED ":O:u}");
+ if (n < (int)sizeof(tmp)) {
+ vlist = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
+ }
+ }
+ if (vlist) {
+ Var *v;
+ char **av;
+ char *as;
+ int ac;
+ int i;
+
+ av = brk_string(vlist, &ac, FALSE, &as);
+ for (i = 0; i < ac; i++) {
+ v = VarFind(av[i], VAR_GLOBAL, 0);
+ if (!v)
+ continue;
+ if (!unexport_env &&
+ (v->flags & (VAR_EXPORTED|VAR_REEXPORT)) == VAR_EXPORTED) {
+ unsetenv(v->name);
+ }
+ v->flags &= ~(VAR_EXPORTED|VAR_REEXPORT);
+ /*
+ * If we are unexporting a list,
+ * remove each one from .MAKE.EXPORTED.
+ * If we are removing them all,
+ * just delete .MAKE.EXPORTED below.
+ */
+ if (vlist == str) {
+ n = snprintf(tmp, sizeof(tmp),
+ "${" MAKE_EXPORTED ":N%s}", v->name);
+ if (n < (int)sizeof(tmp)) {
+ cp = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
+ Var_Set(MAKE_EXPORTED, cp, VAR_GLOBAL, 0);
+ free(cp);
+ }
+ }
+ }
+ free(as);
+ free(av);
+ if (vlist != str) {
+ Var_Delete(MAKE_EXPORTED, VAR_GLOBAL);
+ free(vlist);
+ }
+ }
+}
+
/*-
*-----------------------------------------------------------------------
* Var_Set --
@@ -1755,6 +1859,32 @@ VarSelectWords(GNode *ctx __unused, Var_Parse_State *vpstate,
return Buf_Destroy(&buf, FALSE);
}
+
+/*-
+ * VarRealpath --
+ * Replace each word with the result of realpath()
+ * if successful.
+ */
+static Boolean
+VarRealpath(GNode *ctx __unused, Var_Parse_State *vpstate,
+ char *word, Boolean addSpace, Buffer *buf,
+ void *patternp __unused)
+{
+ char rbuf[MAXPATHLEN];
+ char *rp;
+
+ if (addSpace && vpstate->varSpace) {
+ Buf_AddByte(buf, vpstate->varSpace);
+ }
+ addSpace = TRUE;
+ rp = realpath(word, rbuf);
+ if (rp && *rp == '/')
+ word = rp;
+
+ Buf_AddBytes(buf, strlen(word), word);
+ return(addSpace);
+}
+
/*-
*-----------------------------------------------------------------------
* VarModify --
@@ -2745,7 +2875,12 @@ ApplyModifiers(char *nstr, const char *tstr,
* Check for two-character options:
* ":tu", ":tl"
*/
- if (tstr[1] == 'u' || tstr[1] == 'l') {
+ if (tstr[1] == 'A') { /* absolute path */
+ newStr = VarModify(ctxt, &parsestate, nstr,
+ VarRealpath, NULL);
+ cp = tstr + 2;
+ termc = *cp;
+ } else if (tstr[1] == 'u' || tstr[1] == 'l') {
newStr = VarChangeCase(nstr, (tstr[1] == 'u'));
cp = tstr + 2;
termc = *cp;