.makeenv to .MAKEENV

看板DFBSD_submit作者時間21年前 (2005/04/07 19:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
This is a multi-part message in MIME format. --------------020304030605080706010207 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Matt, If we change the ".makeenv" directive to the special target ".MAKEENV:" like harti requested, would it make sense to change the name to something like ".EXPORT:" ? Will we ever require unexporting variables from make? We can accomplish this ether by adding a ".UNEXPORT:" target, or we can require the user to use ".undef" directive. Which would be similar to what /bin/sh does for export. patch-7.172 o add .MAKEENV: as a special target. It only takes one value argument. Harti, The patch-1.1 and patch 7.172 should add just the ".MAKEENV:" special target work. Any comments? Max --------------020304030605080706010207 Content-Type: text/plain; name="patch-7.172" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-7.172" diff -ru fbsd-src/make/parse.c dfly-src/make/parse.c --- fbsd-src/make/parse.c Thu Apr 7 00:57:37 2005 +++ dfly-src/make/parse.c Thu Apr 7 03:29:25 2005 @@ -165,6 +165,7 @@ Libs, /* .LIBS */ MFlags, /* .MFLAGS or .MAKEFLAGS */ Main, /* .MAIN and we don't have anyth. user-spec. to make */ + MakeEnv, /* .MAKEENV */ NoExport, /* .NOEXPORT */ Not, /* Not special */ NotParallel, /* .NOTPARALELL */ @@ -217,6 +218,7 @@ { ".MAIN", Main, 0 }, { ".MAKE", Attribute, OP_MAKE }, { ".MAKEFLAGS", MFlags, 0 }, + { ".MAKEENV", MakeEnv, 0 }, { ".MFLAGS", MFlags, 0 }, { ".NOTMAIN", Attribute, OP_NOTMAIN }, { ".NOTPARALLEL", NotParallel, 0 }, @@ -1147,6 +1149,9 @@ line = cp; } Lst_Destroy(&paths, NOFREE); + + } else if (specType == MakeEnv) { + Var_SetEnv(line, VAR_GLOBAL); } else { /* list of sources in order */ --------------020304030605080706010207 Content-Type: text/plain; name="patch-1.1" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-1.1" --------------------- PatchSet 28 Date: 2003/11/18 23:49:54 Date: 2004/01/29 22:40:36 Author: dillon Log: o Add a .makeenv directive to make, which allows variables to be exported to the environment. This will be used to support certain ports hacks but it will also be generally useful in the future. o Set a variable indicating that we support .makeenv, so we can conditionalize its use. Members: make.1:1.2->1.3 nonints.h:1.3->1.4 parse.c:1.3->1.4 var.c:1.3->1.4 main.c:1.4->1.5 diff -ru fbsd-src/make/main.c dfly-src/make/main.c --- fbsd-src/make/main.c Sat Mar 19 17:24:36 2005 +++ dfly-src/make/main.c Sat Mar 19 17:24:38 2005 @@ -672,6 +672,7 @@ Dir_InitDot(); /* Initialize the "." directory */ if (objdir != curdir) Path_AddDir(&dirSearchPath, curdir); + Var_Set(".DIRECTIVE_MAKEENV", "YES", VAR_GLOBAL); Var_Set(".CURDIR", curdir, VAR_GLOBAL); Var_Set(".OBJDIR", objdir, VAR_GLOBAL); diff -ru fbsd-src/make/make.1 dfly-src/make/make.1 --- fbsd-src/make/make.1 Sat Mar 19 17:24:31 2005 +++ dfly-src/make/make.1 Sat Mar 19 17:24:38 2005 @@ -810,6 +810,9 @@ .It Ic .undef Ar variable Un-define the specified global variable. Only global variables may be un-defined. +.It Ic \&.makeenv Ar variable +Set the environment flag for a preexisting global variable. The current +and future contents of the variable will be exported to the environment. .It Ic .error Ar message Terminate processing of the makefile immediately. The filename of the diff -ru fbsd-src/make/parse.c dfly-src/make/parse.c --- fbsd-src/make/parse.c Sat Mar 19 17:24:36 2005 +++ dfly-src/make/parse.c Sat Mar 19 17:24:38 2005 @@ -547,6 +547,20 @@ } } +static char * +stripvarname(char *cp) +{ + char *cp2; + + while (isspace((unsigned char)*cp)) + ++cp; + cp2 = cp; + while (*cp2 && !isspace((unsigned char)*cp2)) + ++cp2; + *cp2 = 0; + return (cp); +} + /*- *--------------------------------------------------------------------- @@ -2306,26 +2320,12 @@ ParseDoWarning(cp + 7); goto nextLine; } else if (strncmp(cp, "undef", 5) == 0) { - char *cp2; - for (cp += 5; - isspace((unsigned char)*cp); - cp++) { - continue; - } - - for (cp2 = cp; - !isspace((unsigned char)*cp2) && - *cp2 != '\0'; cp2++) { - continue; - } - - *cp2 = '\0'; - + cp = stripvarname(cp + 5); buf = Var_Subst(NULL, cp, VAR_CMD, FALSE); cp = Buf_Peel(buf); Var_Delete(cp, VAR_GLOBAL); goto nextLine; } } diff -ru fbsd-src/make/var.c dfly-src/make/var.c --- fbsd-src/make/var.c Sat Mar 19 17:24:36 2005 +++ dfly-src/make/var.c Sat Mar 19 17:24:41 2005 @@ -445,10 +445,30 @@ * Any variables given on the command line are automatically exported * to the environment (as per POSIX standard) */ - if (ctxt == VAR_CMD) { + if (ctxt == VAR_CMD || (v != NULL && (v->flags & VAR_TO_ENV))) { setenv(n, val, 1); } free(n); +} + +/* + * Var_SetEnv -- + * Set the VAR_TO_ENV flag on a variable + */ +void +Var_SetEnv(const char *name, GNode *ctxt) +{ + Var *v; + + v = VarFind(name, ctxt, FIND_CMD | FIND_GLOBAL | FIND_ENV); + if (v == NULL) { + Error("Cannot set environment flag on non-existant variable %s", name); + } else { + if ((v->flags & VAR_TO_ENV) == 0) { + v->flags |= VAR_TO_ENV; + setenv(v->name, Buf_Data(v->val), 1); + } + } } /*- diff -ru fbsd-src/make/var.h dfly-src/make/var.h --- fbsd-src/make/var.h Sat Mar 19 17:24:36 2005 +++ dfly-src/make/var.h Sat Mar 19 17:24:41 2005 @@ -62,6 +62,8 @@ * should be destroyed when done with * it. Used by Var_Parse for undefined, * modified variables */ + +#define VAR_TO_ENV 8 /* Place variable in environment */ } Var; /* Var*Pattern flags */ @@ -98,6 +100,7 @@ char *Var_Parse(const char *, struct GNode *, Boolean, size_t *, Boolean *); char *Var_Quote(const char *); void Var_Set(const char *, const char *, struct GNode *); +void Var_SetEnv(const char *, struct GNode *); struct Buffer *Var_Subst(const char *, const char *, struct GNode *, Boolean); char *Var_Value(const char *, struct GNode *, char **); --------------020304030605080706010207--
文章代碼(AID): #12LHev00 (DFBSD_submit)