diff options
author | joerg <joerg@pkgsrc.org> | 2010-04-20 13:32:15 +0000 |
---|---|---|
committer | joerg <joerg@pkgsrc.org> | 2010-04-20 13:32:15 +0000 |
commit | 75156626a2b9871f49248f4d7653cef0267f9214 (patch) | |
tree | bfc75dd360e181f365d9d55eae81b6553d89b2ef /devel/bmake/files/var.c | |
parent | 1869e779310e24b43754c694c616566fa8eca3d7 (diff) | |
download | pkgsrc-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.c | 143 |
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; |