After some musings, I realized I just had to reorder a few things to
make MAKEOBJDIR way more powerful (and possibly useful)
The idea here is to init vars early, which is easy, and to set up
.CURDIR, MACHINE, MACHINE_ARCH, MACHINE_CPU, so that
MAKEOBJDIR can actually become a full-blown make expression.
e.g., with this something like
MAKEOBJDIR='${.CURDIR}:S/src/obj/}'
will work.
any takers ?
Index: init.c
===================================================================
RCS file: /cvs/src/usr.bin/make/init.c,v
retrieving revision 1.7
diff -u -p -r1.7 init.c
--- init.c 2 Oct 2012 10:29:30 -0000 1.7
+++ init.c 29 Aug 2019 11:01:19 -0000
@@ -48,8 +48,6 @@ Init(void)
* can be processed correctly */
Parse_Init(); /* Need to initialize the paths of #include
* directories */
- Var_Init(); /* As well as the lists of variables for
- * parsing arguments */
Arch_Init();
Suff_Init();
}
Index: main.c
===================================================================
RCS file: /cvs/src/usr.bin/make/main.c,v
retrieving revision 1.123
diff -u -p -r1.123 main.c
--- main.c 22 Apr 2019 18:32:09 -0000 1.123
+++ main.c 29 Aug 2019 11:01:19 -0000
@@ -558,12 +558,16 @@ setup_CURDIR_OBJDIR(struct dirs *d)
* and modify the paths for the Makefiles appropriately. The
* current directory is also placed as a variable for make scripts.
*/
- if ((path = getenv("MAKEOBJDIR")) == NULL) {
+ Var_Set(".CURDIR", d->current);
+ if ((path = getenv("MAKEOBJDIR")) == NULL)
path = _PATH_OBJDIR;
- }
+ /* if there's a $ in there, allow substitution */
+ else if (strchr(path, '$'))
+ path = Var_Subst(path, NULL, false);
d->object = chdir_verify_path(path, d);
if (d->object == NULL)
d->object = d->current;
+ Var_Set(".OBJDIR", d->object);
}
/*
@@ -656,6 +660,11 @@ main(int argc, char **argv)
bool read_depend = true;/* false if we don't want to read .depend */
MainParseChdir(argc, argv);
+ Var_Init(); /* do this early for OBJDIR */
+ Var_Set("MACHINE", machine);
+ Var_Set("MACHINE_ARCH", machine_arch);
+ Var_Set("MACHINE_CPU", machine_cpu);
+
setup_CURDIR_OBJDIR(&d);
esetenv("PWD", d.object);
@@ -687,8 +696,6 @@ main(int argc, char **argv)
if (d.object != d.current)
Dir_AddDir(defaultPath, d.current);
- Var_Set(".CURDIR", d.current);
- Var_Set(".OBJDIR", d.object);
Parse_setcurdir(d.current);
Targ_setdirs(d.current, d.object);
@@ -702,9 +709,6 @@ main(int argc, char **argv)
Var_Set(".MAKE", argv[0]);
Var_Set(MAKEFLAGS, "");
Var_Set("MFLAGS", "");
- Var_Set("MACHINE", machine);
- Var_Set("MACHINE_ARCH", machine_arch);
- Var_Set("MACHINE_CPU", machine_cpu);
/*
* First snag any flags out of the MAKEFLAGS environment variable.