tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: make -V



On Thu, 23 Aug 2012 09:55:45 -0700, "Simon J. Gerraty" writes:
>Alan Barrett writes:
>>At present, in NetBSD, we can use:
>>
>>        make -V VARNAME         # expanded only once
>>        make -V '${VARNAME}'    # expanded recursively
>>
>>and in FreeBSD they have:
>>
>>        make -V VARNAME         # expanded recursively
>
>and recently:
>
>         make -V '${VARNAME}'    # expanded recursively
>
>>        # is there a way to expand only once?

Actually there is:

        make -X -V VARNAME

shows the raw value, but -X conflicts with NetBSD make's option of the
same name.  I think a "debug" flag is more appropriate anyway.

My current patch is below.  It would be trivial to remove the knob
and set expandVars based on the debug flag only, if that ever became
acceptible. 

Thanks
--sjg

--------------------8<--------------------
Add a knob to control whether -V fully expands a plain variable by default.
The default retains the traditional NetBSD behavior, but the knob
can be set so that FreeBSD can retain their expected behavior.
This is a compromise to be sure.

Add a debug flag -dV to override the above, so that regardless of
the knob setting, the raw value of a variable can be easily seen.
--------------------8<--------------------
Index: main.c
===================================================================
RCS file: /cvsroot/src/usr.bin/make/main.c,v
retrieving revision 1.200
diff -u -p -r1.200 main.c
--- main.c      12 Jun 2012 19:21:51 -0000      1.200
+++ main.c      24 Aug 2012 19:25:01 -0000
@@ -159,6 +159,7 @@ int                 maxJobs;        /* -j argument */
 static int             maxJobTokens;   /* -j argument */
 Boolean                        compatMake;     /* -B argument */
 int                    debug;          /* -d argument */
+Boolean                        debugVflag;     /* -dV */
 Boolean                        noExecute;      /* -n flag */
 Boolean                        noRecursiveExecute;     /* -N flag */
 Boolean                        keepgoing;      /* -k flag */
@@ -260,6 +261,9 @@ parse_debug_options(const char *argvalue
                case 't':
                        debug |= DEBUG_TARG;
                        break;
+               case 'V':
+                       debugVflag = TRUE;
+                       break;
                case 'v':
                        debug |= DEBUG_VAR;
                        break;
@@ -877,6 +881,7 @@ main(int argc, char **argv)
        create = Lst_Init(FALSE);
        makefiles = Lst_Init(FALSE);
        printVars = FALSE;
+       debugVflag = FALSE;
        variables = Lst_Init(FALSE);
        beSilent = FALSE;               /* Print commands as executed */
        ignoreErrors = FALSE;           /* Pay attention to non-zero returns */
@@ -1214,7 +1219,12 @@ main(int argc, char **argv)
        /* print the values of any variables requested by the user */
        if (printVars) {
                LstNode ln;
+               Boolean expandVars;
 
+               if (debugVflag)
+                       expandVars = FALSE;
+               else
+                       expandVars = getBoolean(".MAKE.EXPAND_VARIABLES", 
FALSE);
                for (ln = Lst_First(variables); ln != NULL;
                    ln = Lst_Succ(ln)) {
                        char *var = (char *)Lst_Datum(ln);
@@ -1222,6 +1232,13 @@ main(int argc, char **argv)
                        
                        if (strchr(var, '$')) {
                                value = p1 = Var_Subst(NULL, var, VAR_GLOBAL, 
0);
+                       } else if (expandVars) {
+                               char tmp[128];
+                                                               
+                               if (snprintf(tmp, sizeof(tmp), "${%s}", var) >= 
sizeof(tmp))
+                                       Fatal("%s: variable name too big: %s",
+                                             progname, var);
+                               value = p1 = Var_Subst(NULL, tmp, VAR_GLOBAL, 
0);
                        } else {
                                value = Var_Value(var, VAR_GLOBAL, &p1);
                        }
@@ -2019,3 +2036,49 @@ mkTempFile(const char *pattern, char **f
     }
     return fd;
 }
+
+
+/*
+ * Return a Boolean based on setting of a knob.
+ *
+ * If the knob is not set, the supplied default is the return value.
+ * If set, anything that looks or smells like "No", "False", "Off", "0" etc,
+ * is FALSE, otherwise TRUE.
+ */
+Boolean
+getBoolean(const char *name, Boolean bf)
+{
+    char tmp[64];
+    char *cp;
+
+    if (snprintf(tmp, sizeof(tmp), "${%s:tl}", name) < sizeof(tmp)) {
+       cp = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
+
+       if (cp) {
+           switch(*cp) {
+           case '\0':                  /* not set - the default wins */
+               break;
+           case '0':
+           case 'f':
+           case 'n':
+               bf = FALSE;
+               break;
+           case 'o':
+               switch (cp[1]) {
+               case 'f':
+                   bf = FALSE;
+                   break;
+               default:
+                   bf = TRUE;
+                   break;
+               }
+               break;
+           default:
+               bf = TRUE;
+               break;
+           }
+           free(cp);
+       }
+    }
+    return (bf);
+}
Index: nonints.h
===================================================================
RCS file: /cvsroot/src/usr.bin/make/nonints.h,v
retrieving revision 1.64
diff -u -p -r1.64 nonints.h
--- nonints.h   12 Jun 2012 19:21:51 -0000      1.64
+++ nonints.h   24 Aug 2012 19:25:01 -0000
@@ -118,6 +118,7 @@ void Finish(int) MAKE_ATTR_DEAD;
 int eunlink(const char *);
 void execError(const char *, const char *);
 char *getTmpdir(void);
+Boolean getBoolean(const char *, Boolean);
 
 /* parse.c */
 void Parse_Error(int, const char *, ...) MAKE_ATTR_PRINTFLIKE(2, 3);






Home | Main Index | Thread Index | Old Index