From owner-freebsd-hackers Sat Jul 13 20:19:48 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id UAA29573 for hackers-outgoing; Sat, 13 Jul 1996 20:19:48 -0700 (PDT) Received: from godzilla.zeta.org.au (godzilla.zeta.org.au [203.2.228.19]) by freefall.freebsd.org (8.7.5/8.7.3) with SMTP id UAA29511 for ; Sat, 13 Jul 1996 20:19:20 -0700 (PDT) Received: (from bde@localhost) by godzilla.zeta.org.au (8.6.12/8.6.9) id NAA11238; Sun, 14 Jul 1996 13:07:50 +1000 Date: Sun, 14 Jul 1996 13:07:50 +1000 From: Bruce Evans Message-Id: <199607140307.NAA11238@godzilla.zeta.org.au> To: bde@zeta.org.au, mark@linus.demon.co.uk, pst@freefall.freebsd.org Subject: Re: cvs commit: src/share/mk bsd.obj.mk Cc: hackers@freebsd.org Sender: owner-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk [redirected again from hackers@freebad.org :-)] > From: Bruce Evans > Date: Fri 12 Jul, 1996 > Subject: Re: cvs commit: src/share/mk bsd.obj.mk [redirected from the CVS commit lists] > > Modified: share/mk bsd.obj.mk > > Log: > > Add whereobj target to find that pesky obj dir > > I still think that this is important enough to justify builtin support. > E.g., `make -P variable' could print make's idea of the value of `variable'. > Then `make -P .OBJDIR' would show where the obj dir is. Yes! I'd been puzzling over a way to do this which wasn't a special purpose hack. So, here's an implementation (the man page patch also includes a small bug fix for the description of the -D option). -P was (sort of) taken, so I used -V. (This patch is against -current's make; I actually compiled and lightly tested a variant of this - against a slightly older make [prior to jkh's changes].) Jordan's recent modifications to quite a few makefiles changed them from one bad assumption to another. This change allows a simpler fix than the one I saw in a random OpenBSD makefile, which generated a small makefile on the fly to echo ${.OBJDIR}. Such a fix would allow all those makefiles to work with both the old and new build systems. For example, for /usr/src/games/boggle/Makefile: MKDICTOBJ != cd ${.CURDIR}/mkdict; make -V .OBJDIR MKINDXOBJ != cd ${.CURDIR}/mkindex; make -V .OBJDIR MKDICT = ${MKDICTOBJ}/mkdict MKINDX = ${MKINDXOBJ}/mkindex The old version of the Makefile failed for most obj directory configurations; the -current version of the Makefile (and the new build system in general) only allows one (broken) way to do obj directories. Mark. --- make.1.ctm Thu Apr 11 22:02:30 1996 +++ make.1 Fri Jul 12 21:44:37 1996 @@ -47,6 +47,7 @@ .Bk -words .Op Fl j Ar max_jobs .Ek +.Op Fl V Ar variable .Op Ar variable=value .Op Ar target ... .Sh DESCRIPTION @@ -74,7 +75,8 @@ The options are as follows: .Bl -tag -width Ds .It Fl D Ar variable -Define Ar variable +Define +.Ar variable to be 1, in the global context. .It Fl d Ar flags Turn on debugging, and specify which portions of @@ -155,6 +157,16 @@ .It Fl t Rather than re-building a target as specified in the makefile, create it or update its modification time to make it appear up-to-date. +.It Fl V Ar variable +Print +.Nm make Ns 's +idea of the value of +.Ar variable , +in the global context. +Do not build any targets. +Multiple instances of this option may be specified; +the variables will be printed one per line, +with a blank line for each null or undefined variable. .It Ar variable=value Set the value of the variable .Ar variable --- main.c.ctm Wed Jul 10 01:12:08 1996 +++ main.c.new Fri Jul 12 21:22:53 1996 @@ -107,6 +107,8 @@ static Boolean noBuiltins; /* -r flag */ static Lst makefiles; /* ordered list of makefiles to read */ +static Boolean printVars; /* print value of one or more vars */ +static Lst variables; /* list of variables to print */ int maxJobs; /* -J argument */ static int maxLocal; /* -L argument */ Boolean compatMake; /* -B argument */ @@ -153,9 +155,9 @@ optind = 1; /* since we're called more than once */ #ifdef notyet -# define OPTFLAGS "BD:I:L:PSd:ef:ij:knqrst" +# define OPTFLAGS "BD:I:L:PSVd:ef:ij:knqrst" #else -# define OPTFLAGS "D:I:d:ef:ij:knqrst" +# define OPTFLAGS "DV:I:d:ef:ij:knqrst" #endif rearg: while((c = getopt(argc, argv, OPTFLAGS)) != EOF) { switch(c) { @@ -169,6 +171,12 @@ Var_Append(MAKEFLAGS, "-I", VAR_GLOBAL); Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL); break; + case 'V': + printVars = TRUE; + (void)Lst_AtEnd(variables, (ClientData)optarg); + Var_Append(MAKEFLAGS, "-V", VAR_GLOBAL); + Var_Append(MAKEFLAGS, optarg, VAR_GLOBAL); + break; #ifdef notyet case 'B': compatMake = TRUE; @@ -453,6 +461,8 @@ create = Lst_Init(FALSE); makefiles = Lst_Init(FALSE); + printVars = FALSE; + variables = Lst_Init(FALSE); beSilent = FALSE; /* Print commands as executed */ ignoreErrors = FALSE; /* Pay attention to non-zero returns */ noExecute = FALSE; /* Execute all commands */ @@ -622,6 +632,20 @@ if (DEBUG(GRAPH1)) Targ_PrintGraph(1); + /* print the values of any variables requested by the user */ + if (printVars) { + LstNode ln; + + for (ln = Lst_First(variables); ln != NILLNODE; + ln = Lst_Succ(ln)) { + char *value = Var_Value((char *)Lst_Datum(ln), + VAR_GLOBAL, &p1); + printf("%s\n", value? value : ""); + if (p1) + free(p1); + } + } + /* * Have now read the entire graph and need to make a list of targets * to create. If none was given on the command line, we consult the @@ -636,7 +660,7 @@ * this was original amMake -- want to allow parallelism, so put this * back in, eventually. */ - if (!compatMake) { + if (!compatMake && !printVars) { /* * Initialize job module before traversing the graph, now that * any .BEGIN and .END targets have been read. This is done @@ -652,14 +676,16 @@ /* Traverse the graph, checking on all the targets */ outOfDate = Make_Run(targs); - } else + } else if (!printVars) { /* * Compat_Init will take care of creating all the targets as * well as initializing the module. */ Compat_Run(targs); + } Lst_Destroy(targs, NOFREE); + Lst_Destroy(variables, NOFREE); Lst_Destroy(makefiles, NOFREE); Lst_Destroy(create, (void (*) __P((ClientData))) free); -- Mark Valentine at Home