From 7d462af531b4c59511ce10bcfe1e1276684cef6f Mon Sep 17 00:00:00 2001 From: zrj Date: Mon, 7 Nov 2016 14:33:52 +0200 Subject: [PATCH] bsd.crunchgen.mk: Sync with FreeBSD. This finally allows not to relink rescue image if there are no changes and have clean stage of "4d: building everything.."! Helps a lot on LTO quick rebuilds. While there, remove hack from crunchgen(1), it no longer should be needed. Please report build races if any. Taken-from: FreeBSD --- share/mk/bsd.crunchgen.mk | 19 +++++++++++++++---- usr.bin/crunch/crunchgen/crunchgen.c | 12 +++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/share/mk/bsd.crunchgen.mk b/share/mk/bsd.crunchgen.mk index 7c3a96a665..1b2a8cb7ae 100644 --- a/share/mk/bsd.crunchgen.mk +++ b/share/mk/bsd.crunchgen.mk @@ -27,7 +27,7 @@ # If CRUNCH_GENERATE_LINKS is set to no, no links will be generated. # -# $FreeBSD: head/share/mk/bsd.crunchgen.mk 251512 2013-06-07 21:40:02Z emaste $ +# $FreeBSD: head/share/mk/bsd.crunchgen.mk 305257 2016-09-01 23:52:20Z bdrewery $ ################################################################## # The following is pretty nearly a generic crunchgen-handling makefile @@ -67,7 +67,9 @@ LINKS+= ${BINDIR}/${PROG} ${BINDIR}/${A} .endfor .endfor +.if !defined(_SKIP_BUILD) all: ${PROG} +.endif exe: ${PROG} ${CONF}: Makefile @@ -103,15 +105,24 @@ ${CONF}: Makefile CRUNCHGEN?= crunchgen CRUNCHENV?= # empty .ORDER: ${OUTPUTS} objs +${OUTPUTS:[1]}: .META +${OUTPUTS:[2..-1]}: .NOMETA ${OUTPUTS}: ${CONF} MAKE=${MAKE} ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ ${CRUNCHGEN} -fq -m ${OUTMK} -c ${OUTC} ${CONF} + # Avoid redundantly calling 'make objs' which we've done by our + # own dependencies. + sed -i '' -e "s/^\(${PROG}:.*\) \$$(SUBMAKE_TARGETS)/\1/" ${OUTMK} -${PROG}: ${OUTPUTS} objs +# These 2 targets cannot use .MAKE since they depend on the generated +# ${OUTMK} above. +${PROG}: ${OUTPUTS} objs .NOMETA .PHONY ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ - ${MAKE} -f ${OUTMK} exe + ${MAKE} .MAKE.MODE="${.MAKE.MODE} curdirOk=yes" \ + .MAKE.META.IGNORE_PATHS="${.MAKE.META.IGNORE_PATHS}" \ + -f ${OUTMK} exe -objs: ${OUTMK} +objs: ${OUTMK} .META ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ ${MAKE} -f ${OUTMK} objs diff --git a/usr.bin/crunch/crunchgen/crunchgen.c b/usr.bin/crunch/crunchgen/crunchgen.c index 93aec68a6f..7a83ef2834 100644 --- a/usr.bin/crunch/crunchgen/crunchgen.c +++ b/usr.bin/crunch/crunchgen/crunchgen.c @@ -1055,6 +1055,7 @@ prog_makefile_rules(FILE *outmk, prog_t *p) } fprintf(outmk, "\n"); } + fprintf(outmk, "$(%s_OBJPATHS): .NOMETA\n", p->ident); if (p->srcdir && p->objs) { fprintf(outmk, "%s_SRCDIR=%s\n", p->ident, p->srcdir); @@ -1101,15 +1102,8 @@ prog_makefile_rules(FILE *outmk, prog_t *p) "int _crunched_%s_stub(int argc, char **argv, char **envp)" "{return main(argc,argv,envp);}\" >%s_stub.c\n", p->ident, p->name); - - /* - * Needs dependency to ensure objects are built before .lo. - * the $(%s_OBJPATHS) are dangling (the Makefile does not have - * direct knowledge of what the objs depend on). So make - * %s.lo depend on %s_make. - */ - fprintf(outmk, "%s.lo: %s_stub.o %s_make $(%s_OBJPATHS)", - p->name, p->name, p->name, p->ident); + fprintf(outmk, "%s.lo: %s_stub.o $(%s_OBJPATHS)", + p->name, p->name, p->ident); if (p->libs) fprintf(outmk, " $(%s_LIBS)", p->ident); -- 2.11.4.GIT