xref: /dflybsd-src/contrib/bmake/mk/autodep.mk (revision 9e7ae5a0527a977cab412aede3a532cfe2903bbb)
15f1e34d9SAlexandre Perrin#
25f1e34d9SAlexandre Perrin# RCSid:
3*6eef5f0cSAntonio Huete Jimenez#	$Id: autodep.mk,v 1.40 2021/12/08 05:56:50 sjg Exp $
45f1e34d9SAlexandre Perrin#
55f1e34d9SAlexandre Perrin#	@(#) Copyright (c) 1999-2010, Simon J. Gerraty
65f1e34d9SAlexandre Perrin#
75f1e34d9SAlexandre Perrin#	This file is provided in the hope that it will
85f1e34d9SAlexandre Perrin#	be of use.  There is absolutely NO WARRANTY.
95f1e34d9SAlexandre Perrin#	Permission to copy, redistribute or otherwise
105f1e34d9SAlexandre Perrin#	use this file is hereby granted provided that
115f1e34d9SAlexandre Perrin#	the above copyright notice and this notice are
125f1e34d9SAlexandre Perrin#	left intact.
135f1e34d9SAlexandre Perrin#
145f1e34d9SAlexandre Perrin#	Please send copies of changes and bug-fixes to:
155f1e34d9SAlexandre Perrin#	sjg@crufty.net
165f1e34d9SAlexandre Perrin
175f1e34d9SAlexandre Perrin# This module provides automagic dependency generation along the
185f1e34d9SAlexandre Perrin# lines suggested in the GNU make.info
196a91b982SJohn Marino# The depend target is mainly for backwards compatibility,
205f1e34d9SAlexandre Perrin# dependencies are normally updated as part of compilation.
215f1e34d9SAlexandre Perrin
225f1e34d9SAlexandre Perrin.if !target(__${.PARSEFILE}__)
23*6eef5f0cSAntonio Huete Jimenez__${.PARSEFILE}__: .NOTMAIN
245f1e34d9SAlexandre Perrin
255f1e34d9SAlexandre PerrinDEPENDFILE?= .depend
265f1e34d9SAlexandre Perrin.for d in ${DEPENDFILE:N.depend}
275f1e34d9SAlexandre Perrin# bmake only groks .depend
28f445c897SJohn Marino.if ${MAKE_VERSION} < 20160218
29f445c897SJohn Marino.-include <$d>
30f445c897SJohn Marino.else
31f445c897SJohn Marino.dinclude <$d>
32f445c897SJohn Marino.endif
335f1e34d9SAlexandre Perrin.endfor
345f1e34d9SAlexandre Perrin
355f1e34d9SAlexandre Perrin# it does nothing if SRCS is not defined or is empty
365f1e34d9SAlexandre Perrin.if defined(SRCS) && !empty(SRCS)
375f1e34d9SAlexandre PerrinDEPSRCS?=${SRCS}
385f1e34d9SAlexandre Perrin__depsrcs=${DEPSRCS:M*.c}
395f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.y}
405f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.l}
415f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.s}
425f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.S}
435f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.cc}
445f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.cpp}
455f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.C}
465f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.cxx}
475f1e34d9SAlexandre Perrin__depsrcs+=${DEPSRCS:M*.pc}
485f1e34d9SAlexandre Perrin
495f1e34d9SAlexandre Perrin.for s in ${__depsrcs}
505f1e34d9SAlexandre Perrin${s:T:R}.d:	$s
515f1e34d9SAlexandre Perrin.endfor
525f1e34d9SAlexandre Perrin
535f1e34d9SAlexandre Perrin__depsrcs:=${__depsrcs:T:R:S/$/.d/g}
545f1e34d9SAlexandre Perrin# we also need to handle makefiles where the .d's from __depsrcs
555f1e34d9SAlexandre Perrin# don't  match those from OBJS
565f1e34d9SAlexandre Perrin# we avoid using := here, since the modifier applied to OBJS
575f1e34d9SAlexandre Perrin# can cause trouble if there are any undefined vars in OBJS.
585f1e34d9SAlexandre Perrin__dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/}
595f1e34d9SAlexandre Perrin__dependsrcs= ${__dependsrcsx:O:u}
605f1e34d9SAlexandre Perrin
615f1e34d9SAlexandre Perrin# clean up any .c files we may have generated
625f1e34d9SAlexandre Perrin#__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l}
635f1e34d9SAlexandre Perrin#CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g}
645f1e34d9SAlexandre Perrin
655f1e34d9SAlexandre Perrin# set this to -MMD to ignore /usr/include
665f1e34d9SAlexandre Perrin# actually it ignores <> so may not be a great idea
675f1e34d9SAlexandre PerrinCFLAGS_MD?=-MD
685f1e34d9SAlexandre Perrin# -MF etc not available on all gcc versions.
695f1e34d9SAlexandre Perrin# we "fix" the .o later
70*6eef5f0cSAntonio Huete Jimenez.if ${COMPILER_TYPE:Ugcc} == "gcc" && ${COMPILER_VERSION:U0} < 30000
71*6eef5f0cSAntonio Huete JimenezCFLAGS_MF=
72*6eef5f0cSAntonio Huete Jimenez.endif
735f1e34d9SAlexandre PerrinCFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o
745f1e34d9SAlexandre PerrinCFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF}
755f1e34d9SAlexandre PerrinRM?= rm
76ca58f742SDaniel FojtMAKE_SHELL?= sh
775f1e34d9SAlexandre Perrin
785f1e34d9SAlexandre Perrin# watch out for people who don't use CPPFLAGS
795f1e34d9SAlexandre PerrinCPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS}
805f1e34d9SAlexandre PerrinCXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS}
815f1e34d9SAlexandre Perrin
825f1e34d9SAlexandre Perrin# just in case these need to be different
835f1e34d9SAlexandre PerrinCC_MD?=${CC}
845f1e34d9SAlexandre PerrinCXX_MD?=${CXX}
855f1e34d9SAlexandre Perrin
86f445c897SJohn Marino# should have been set by sys.mk
87f445c897SJohn MarinoCXX_SUFFIXES?= .cc .cpp .cxx .C
88f445c897SJohn Marino
895f1e34d9SAlexandre Perrin# so we can do an explicit make depend, but not otherwise
905f1e34d9SAlexandre Perrin.if make(depend)
915f1e34d9SAlexandre Perrin.SUFFIXES:	.d
925f1e34d9SAlexandre Perrin
935f1e34d9SAlexandre Perrin.if empty(CFLAGS_MD)
945f1e34d9SAlexandre Perrin.y.d:
955f1e34d9SAlexandre Perrin	@echo updating dependencies for $<
965f1e34d9SAlexandre Perrin	@${YACC} ${YFLAGS} $<
97ca58f742SDaniel Fojt	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; }
985f1e34d9SAlexandre Perrin	@${RM} -f y.tab.c
995f1e34d9SAlexandre Perrin
1005f1e34d9SAlexandre Perrin.l.d:
1015f1e34d9SAlexandre Perrin	@echo updating dependencies for $<
1025f1e34d9SAlexandre Perrin	${LEX} ${LFLAGS} $<
103ca58f742SDaniel Fojt	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; }
1045f1e34d9SAlexandre Perrin	@${RM} -f lex.yy.c
1055f1e34d9SAlexandre Perrin
1065f1e34d9SAlexandre Perrin.c.d:
1075f1e34d9SAlexandre Perrin	@echo updating dependencies for $<
108ca58f742SDaniel Fojt	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
1095f1e34d9SAlexandre Perrin
1105f1e34d9SAlexandre Perrin.s.d .S.d:
1115f1e34d9SAlexandre Perrin	@echo updating dependencies for $<
112ca58f742SDaniel Fojt	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
1135f1e34d9SAlexandre Perrin
114f445c897SJohn Marino${CXX_SUFFIXES:%=%.d}:
1155f1e34d9SAlexandre Perrin	@echo updating dependencies for $<
116ca58f742SDaniel Fojt	@${MAKE_SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
1175f1e34d9SAlexandre Perrin.else
1185f1e34d9SAlexandre Perrin.y.d:
1195f1e34d9SAlexandre Perrin	${YACC} ${YFLAGS} $<
1205f1e34d9SAlexandre Perrin	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; }
1215f1e34d9SAlexandre Perrin	${RM} -f y.tab.c
1225f1e34d9SAlexandre Perrin
1235f1e34d9SAlexandre Perrin.l.d:
1245f1e34d9SAlexandre Perrin	${LEX} ${LFLAGS} $<
1255f1e34d9SAlexandre Perrin	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; }
1265f1e34d9SAlexandre Perrin	${RM} -f lex.yy.c
1275f1e34d9SAlexandre Perrin
1285f1e34d9SAlexandre Perrin.c.d:
1295f1e34d9SAlexandre Perrin	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
1305f1e34d9SAlexandre Perrin
1315f1e34d9SAlexandre Perrin.s.d .S.d:
1325f1e34d9SAlexandre Perrin	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; }
1335f1e34d9SAlexandre Perrin
134f445c897SJohn Marino${CXX_SUFFIXES:%=%.d}:
1355f1e34d9SAlexandre Perrin	${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
1365f1e34d9SAlexandre Perrin.endif
1375f1e34d9SAlexandre Perrin
1385f1e34d9SAlexandre Perrin.if !target(depend)
1395f1e34d9SAlexandre Perrindepend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE
1405f1e34d9SAlexandre Perrin
1415f1e34d9SAlexandre Perrin${DEPENDFILE}:	${DEPSRCS} ${__dependsrcs}
1425f1e34d9SAlexandre Perrin.NOPATH:	${__dependsrcs}
1435f1e34d9SAlexandre Perrin.OPTIONAL:	${__dependsrcs}
1445f1e34d9SAlexandre Perrin.endif
1455f1e34d9SAlexandre Perrin.endif				# make(depend)
1465f1e34d9SAlexandre Perrin
1475f1e34d9SAlexandre Perrin.if empty(CFLAGS_MD)
1485f1e34d9SAlexandre Perrin# make sure the .d's are generated/updated
1495f1e34d9SAlexandre Perrin${PROG} ${_LIBS}:	${DEPENDFILE}
1505f1e34d9SAlexandre Perrin.endif
1515f1e34d9SAlexandre Perrin
1525f1e34d9SAlexandre Perrin.ORDER:	beforedepend ${DEPENDFILE} afterdepend
1535f1e34d9SAlexandre Perrin
1545f1e34d9SAlexandre Perrin.if ${.OBJDIR} != ${.CURDIR}
1555f1e34d9SAlexandre Perrin__depfiles= *.d
1565f1e34d9SAlexandre Perrin.else
1575f1e34d9SAlexandre Perrin__depfiles= ${__dependsrcs}
1585f1e34d9SAlexandre Perrin.endif
1595f1e34d9SAlexandre Perrin
1605f1e34d9SAlexandre PerrinDEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d
1615f1e34d9SAlexandre Perrin
1625f1e34d9SAlexandre Perrincleandir: cleanautodepend
1635f1e34d9SAlexandre Perrincleanautodepend:
1645f1e34d9SAlexandre Perrin	${RM} -f ${DEPCLEANFILES}
1655f1e34d9SAlexandre Perrin
1665f1e34d9SAlexandre PerrinCLEANFILES+= ${DEPCLEANFILES}
1675f1e34d9SAlexandre Perrin
1685f1e34d9SAlexandre Perrin.if defined(__dependsrcs) && !empty(__dependsrcs)
1695f1e34d9SAlexandre Perrin.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*))
1705f1e34d9SAlexandre Perrin# this ensures we do the right thing if only building a shared or
1715f1e34d9SAlexandre Perrin# profiled lib
1725f1e34d9SAlexandre PerrinOBJ_EXTENSIONS?=.o .po .so .So
1735f1e34d9SAlexandre PerrinMDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},'
1745f1e34d9SAlexandre Perrin.ifdef NOMD_SED
1755f1e34d9SAlexandre Perrin.ifdef LIB
1765f1e34d9SAlexandre PerrinMD_SED=sed ${MDLIB_SED}
1775f1e34d9SAlexandre Perrin.else
1785f1e34d9SAlexandre PerrinMD_SED=cat
1795f1e34d9SAlexandre Perrin.endif
1805f1e34d9SAlexandre Perrin.else
1815f1e34d9SAlexandre Perrin# arrange to put some variable names into ${DEPENDFILE}
1825f1e34d9SAlexandre Perrin.ifdef LIB
1835f1e34d9SAlexandre PerrinMD_SED=sed ${MDLIB_SED}
1845f1e34d9SAlexandre Perrin.else
1855f1e34d9SAlexandre PerrinMD_SED=sed
1865f1e34d9SAlexandre Perrin.endif
1875f1e34d9SAlexandre PerrinSUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR
1885f1e34d9SAlexandre Perrin.for v in ${SUBST_DEPVARS}
1895f1e34d9SAlexandre Perrin.if defined(${v}) && !empty(${v})
1905f1e34d9SAlexandre PerrinMD_SED+= -e 's,${$v},$${$v},'
1915f1e34d9SAlexandre Perrin.endif
1925f1e34d9SAlexandre Perrin.endfor
1935f1e34d9SAlexandre Perrin.endif
1945f1e34d9SAlexandre Perrin.if (${MD_SED} == "sed")
1955f1e34d9SAlexandre PerrinMD_SED=cat
1965f1e34d9SAlexandre Perrin.endif
1975f1e34d9SAlexandre Perrin
1985f1e34d9SAlexandre Perrin# this will be done whenever make finishes successfully
1995f1e34d9SAlexandre Perrin.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530
2005f1e34d9SAlexandre Perrin.END:
2015f1e34d9SAlexandre Perrin.else
2025f1e34d9SAlexandre Perrin.END:	${DEPENDFILE}
2035f1e34d9SAlexandre Perrin# we do not want to trigger building .d's just use them if they exist
2045f1e34d9SAlexandre Perrin${DEPENDFILE}:	${__dependsrcs:@d@${exists($d):?$d:}@}
2055f1e34d9SAlexandre Perrin.endif
2065f1e34d9SAlexandre Perrin	-@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \
2075f1e34d9SAlexandre Perrin	test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \
2085f1e34d9SAlexandre Perrin	${RM} -f ${DEPENDFILE}.new
2095f1e34d9SAlexandre Perrin.endif
2105f1e34d9SAlexandre Perrin.endif
2115f1e34d9SAlexandre Perrin.else
2125f1e34d9SAlexandre Perrindepend: beforedepend afterdepend _SUBDIRUSE
2135f1e34d9SAlexandre Perrin.endif
2145f1e34d9SAlexandre Perrin
2155f1e34d9SAlexandre Perrin.if !target(beforedepend)
2165f1e34d9SAlexandre Perrinbeforedepend:
2175f1e34d9SAlexandre Perrin.endif
2185f1e34d9SAlexandre Perrin.if !target(afterdepend)
2195f1e34d9SAlexandre Perrinafterdepend:
2205f1e34d9SAlexandre Perrin.endif
2215f1e34d9SAlexandre Perrin
2225f1e34d9SAlexandre Perrin.endif
223