Diff below implements the ${<D} and ${<F} variables for make, as documented in the manual. These variables are equivalent to ${<:H} and ${<:T} repectively, however the former variants are more portable, as they are also understood by GNU, FreeBSD and NetBSD make.
Absence of those variables reported by Dario Niedermann on bugs@. Ok? natano Index: Makefile =================================================================== RCS file: /cvs/src/usr.bin/make/Makefile,v retrieving revision 1.60 diff -u -p -r1.60 Makefile --- Makefile 14 Oct 2015 13:50:22 -0000 1.60 +++ Makefile 9 Oct 2016 20:06:23 -0000 @@ -29,7 +29,7 @@ CLEANFILES+= varhashconsts.h condhashcon beforedepend: varhashconsts.h condhashconsts.h nodehashconsts.h # may need tweaking if you add variable synonyms or change the hash function -MAGICVARSLOTS=77 +MAGICVARSLOTS=82 MAGICCONDSLOTS=65 varhashconsts.h: generate Index: generate.c =================================================================== RCS file: /cvs/src/usr.bin/make/generate.c,v retrieving revision 1.17 diff -u -p -r1.17 generate.c --- generate.c 18 Apr 2015 18:28:37 -0000 1.17 +++ generate.c 9 Oct 2016 20:06:23 -0000 @@ -61,6 +61,8 @@ char *table_var[] = { M(DARCHIVE), M(FMEMBER), M(DMEMBER), + M(FIMPSRC), + M(DIMPSRC), NULL }; Index: var.c =================================================================== RCS file: /cvs/src/usr.bin/make/var.c,v retrieving revision 1.99 diff -u -p -r1.99 var.c --- var.c 27 Sep 2015 16:58:16 -0000 1.99 +++ var.c 9 Oct 2016 20:06:23 -0000 @@ -147,9 +147,9 @@ static char *varnames[] = { PREFIX, ARCHIVE, MEMBER, + IMPSRC, OODATE, ALLSRC, - IMPSRC, FTARGET, DTARGET, FPREFIX, @@ -157,7 +157,9 @@ static char *varnames[] = { FARCHIVE, DARCHIVE, FMEMBER, - DMEMBER + DMEMBER, + FIMPSRC, + DIMPSRC }; static bool xtlist[] = { @@ -166,9 +168,9 @@ static bool xtlist[] = { false, /* $* */ false, /* $! */ true, /* $% */ + true, /* $< */ false, /* $? */ false, /* $> */ - true, /* $< */ true, /* ${@F} */ true, /* ${@D} */ false, /* ${*F} */ @@ -177,6 +179,8 @@ static bool xtlist[] = { false, /* ${!D} */ true, /* ${%F} */ true, /* ${%D} */ + true, /* ${<F} */ + true, /* ${<D} */ }; /* so that we can access tlist[-1] */ @@ -194,6 +198,8 @@ static bool *tlist = xtlist+1; #define DARCHIVE_INDEX 12 #define FMEMBER_INDEX 13 #define DMEMBER_INDEX 14 +#define FIMPSRC_INDEX 15 +#define DIMPSRC_INDEX 16 #define GLOBAL_INDEX -1 @@ -365,7 +371,15 @@ classify_var(const char *name, const cha break; case K_DMEMBER % MAGICSLOTS1: if (name[0] == DMEMBER[0] && name[1] == DMEMBER[1] && len == 2) - return DMEMBER_INDEX; + return DMEMBER_INDEX; + break; + case K_FIMPSRC % MAGICSLOTS1: + if (name[0] == FIMPSRC[0] && name[1] == FIMPSRC[1] && len == 2) + return FIMPSRC_INDEX; + break; + case K_DIMPSRC % MAGICSLOTS1: + if (name[0] == DIMPSRC[0] && name[1] == DIMPSRC[1] && len == 2) + return DIMPSRC_INDEX; break; default: break; Index: var.h =================================================================== RCS file: /cvs/src/usr.bin/make/var.h,v retrieving revision 1.17 diff -u -p -r1.17 var.h --- var.h 6 Jan 2014 12:08:18 -0000 1.17 +++ var.h 9 Oct 2016 20:06:23 -0000 @@ -64,9 +64,9 @@ extern void Var_Deletei(const char *, co #define PREFIX_INDEX 1 #define ARCHIVE_INDEX 2 #define MEMBER_INDEX 3 -#define OODATE_INDEX 4 -#define ALLSRC_INDEX 5 -#define IMPSRC_INDEX 6 +#define IMPSRC_INDEX 4 +#define OODATE_INDEX 5 +#define ALLSRC_INDEX 6 #define Var(idx, gn) ((gn)->context.locals[idx])