xref: /freebsd/contrib/bmake/mk/autodep.mk (revision c59c3bf34db360695f07735bebc76a768cac5afc)
1*c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
23cbdda60SSimon J. Gerraty#
33cbdda60SSimon J. Gerraty# RCSid:
4*c59c3bf3SSimon J. Gerraty#	$Id: autodep.mk,v 1.43 2024/02/17 17:26:57 sjg Exp $
53cbdda60SSimon J. Gerraty#
6*c59c3bf3SSimon J. Gerraty#	@(#) Copyright (c) 1999-2024, Simon J. Gerraty
73cbdda60SSimon J. Gerraty#
83cbdda60SSimon J. Gerraty#	This file is provided in the hope that it will
93cbdda60SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
103cbdda60SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
113cbdda60SSimon J. Gerraty#	use this file is hereby granted provided that
123cbdda60SSimon J. Gerraty#	the above copyright notice and this notice are
133cbdda60SSimon J. Gerraty#	left intact.
143cbdda60SSimon J. Gerraty#
153cbdda60SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
163cbdda60SSimon J. Gerraty#	sjg@crufty.net
173cbdda60SSimon J. Gerraty
183cbdda60SSimon J. Gerraty# This module provides automagic dependency generation along the
193cbdda60SSimon J. Gerraty# lines suggested in the GNU make.info
205bcb7424SSimon J. Gerraty# The depend target is mainly for backwards compatibility,
213cbdda60SSimon J. Gerraty# dependencies are normally updated as part of compilation.
223cbdda60SSimon J. Gerraty
233cbdda60SSimon J. Gerraty.if !target(__${.PARSEFILE}__)
2412904384SSimon J. Gerraty__${.PARSEFILE}__: .NOTMAIN
253cbdda60SSimon J. Gerraty
263cbdda60SSimon J. GerratyDEPENDFILE?= .depend
273cbdda60SSimon J. Gerraty.for d in ${DEPENDFILE:N.depend}
283cbdda60SSimon J. Gerraty# bmake only groks .depend
29e48f47ddSSimon J. Gerraty.if ${MAKE_VERSION} < 20160218
30e48f47ddSSimon J. Gerraty.-include <$d>
31e48f47ddSSimon J. Gerraty.else
32e48f47ddSSimon J. Gerraty.dinclude <$d>
33e48f47ddSSimon J. Gerraty.endif
343cbdda60SSimon J. Gerraty.endfor
353cbdda60SSimon J. Gerraty
36*c59c3bf3SSimon J. Gerraty# should have been set by sys.mk
37*c59c3bf3SSimon J. GerratyCXX_SUFFIXES ?= .cc .ccm .cpp .cxx .C
38*c59c3bf3SSimon J. Gerraty
393cbdda60SSimon J. Gerraty# it does nothing if SRCS is not defined or is empty
403cbdda60SSimon J. Gerraty.if defined(SRCS) && !empty(SRCS)
413cbdda60SSimon J. GerratyDEPSRCS ?= ${SRCS}
423cbdda60SSimon J. Gerraty__depsrcs = ${DEPSRCS:M*.c}
433cbdda60SSimon J. Gerraty__depsrcs += ${DEPSRCS:M*.y}
443cbdda60SSimon J. Gerraty__depsrcs += ${DEPSRCS:M*.l}
453cbdda60SSimon J. Gerraty__depsrcs += ${DEPSRCS:M*.s}
463cbdda60SSimon J. Gerraty__depsrcs += ${DEPSRCS:M*.S}
473cbdda60SSimon J. Gerraty__depsrcs += ${DEPSRCS:M*.pc}
48*c59c3bf3SSimon J. Gerraty.for s in ${CXX_SUFFIXES}
49*c59c3bf3SSimon J. Gerraty__depsrcs += ${DEPSRCS:M*$s}
50*c59c3bf3SSimon J. Gerraty.endfor
513cbdda60SSimon J. Gerraty
523cbdda60SSimon J. Gerraty.for s in ${__depsrcs}
533cbdda60SSimon J. Gerraty${s:T:R}.d:	$s
543cbdda60SSimon J. Gerraty.endfor
553cbdda60SSimon J. Gerraty
563cbdda60SSimon J. Gerraty__depsrcs := ${__depsrcs:T:R:S/$/.d/g}
573cbdda60SSimon J. Gerraty# we also need to handle makefiles where the .d's from __depsrcs
583cbdda60SSimon J. Gerraty# don't  match those from OBJS
593cbdda60SSimon J. Gerraty# we avoid using := here, since the modifier applied to OBJS
603cbdda60SSimon J. Gerraty# can cause trouble if there are any undefined vars in OBJS.
613cbdda60SSimon J. Gerraty__dependsrcsx ?= ${__depsrcs} ${OBJS:S/.o/.d/}
623cbdda60SSimon J. Gerraty__dependsrcs = ${__dependsrcsx:O:u}
633cbdda60SSimon J. Gerraty
643cbdda60SSimon J. Gerraty# clean up any .c files we may have generated
653cbdda60SSimon J. Gerraty#__gensrcs := ${DEPSRCS:M*.y} ${DEPSRCS:M*.l}
663cbdda60SSimon J. Gerraty#CLEANFILES += ${__gensrcs:T:R:S/$/.c/g}
673cbdda60SSimon J. Gerraty
683cbdda60SSimon J. Gerraty# set this to -MMD to ignore /usr/include
693cbdda60SSimon J. Gerraty# actually it ignores <> so may not be a great idea
703cbdda60SSimon J. GerratyCFLAGS_MD ?= -MD
713cbdda60SSimon J. Gerraty# -MF etc not available on all gcc versions.
723cbdda60SSimon J. Gerraty# we "fix" the .o later
7312904384SSimon J. Gerraty.if ${COMPILER_TYPE:Ugcc} == "gcc" && ${COMPILER_VERSION:U0} < 30000
7412904384SSimon J. GerratyCFLAGS_MF =
7512904384SSimon J. Gerraty.endif
763cbdda60SSimon J. GerratyCFLAGS_MF ?= -MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o
773cbdda60SSimon J. GerratyCFLAGS += ${CFLAGS_MD} ${CFLAGS_MF}
783cbdda60SSimon J. GerratyRM?= rm
7949caa483SSimon J. GerratyMAKE_SHELL ?= sh
803cbdda60SSimon J. Gerraty
813cbdda60SSimon J. Gerraty# watch out for people who don't use CPPFLAGS
823cbdda60SSimon J. GerratyCPPFLAGS_MD = ${CFLAGS:M-[IUD]*} ${CPPFLAGS}
833cbdda60SSimon J. GerratyCXXFLAGS_MD = ${CXXFLAGS:M-[IUD]*} ${CPPFLAGS}
843cbdda60SSimon J. Gerraty
853cbdda60SSimon J. Gerraty# just in case these need to be different
863cbdda60SSimon J. GerratyCC_MD ?= ${CC}
873cbdda60SSimon J. GerratyCXX_MD ?= ${CXX}
883cbdda60SSimon J. Gerraty
893cbdda60SSimon J. Gerraty# so we can do an explicit make depend, but not otherwise
903cbdda60SSimon J. Gerraty.if make(depend)
913cbdda60SSimon J. Gerraty.SUFFIXES:	.d
923cbdda60SSimon J. Gerraty
933cbdda60SSimon J. Gerraty.if empty(CFLAGS_MD)
943cbdda60SSimon J. Gerraty.y.d:
953cbdda60SSimon J. Gerraty	@echo updating dependencies for $<
963cbdda60SSimon J. Gerraty	@${YACC} ${YFLAGS} $<
9749caa483SSimon J. Gerraty	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; }
983cbdda60SSimon J. Gerraty	@${RM} -f y.tab.c
993cbdda60SSimon J. Gerraty
1003cbdda60SSimon J. Gerraty.l.d:
1013cbdda60SSimon J. Gerraty	@echo updating dependencies for $<
1023cbdda60SSimon J. Gerraty	${LEX} ${LFLAGS} $<
10349caa483SSimon J. Gerraty	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; }
1043cbdda60SSimon J. Gerraty	@${RM} -f lex.yy.c
1053cbdda60SSimon J. Gerraty
1063cbdda60SSimon J. Gerraty.c.d:
1073cbdda60SSimon J. Gerraty	@echo updating dependencies for $<
10849caa483SSimon J. Gerraty	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
1093cbdda60SSimon J. Gerraty
1103cbdda60SSimon J. Gerraty.s.d .S.d:
1113cbdda60SSimon J. Gerraty	@echo updating dependencies for $<
11249caa483SSimon J. Gerraty	@${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
1133cbdda60SSimon J. Gerraty
114e48f47ddSSimon J. Gerraty${CXX_SUFFIXES:%=%.d}:
1153cbdda60SSimon J. Gerraty	@echo updating dependencies for $<
11649caa483SSimon J. Gerraty	@${MAKE_SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
117*c59c3bf3SSimon J. Gerraty
1183cbdda60SSimon J. Gerraty.else
119*c59c3bf3SSimon J. Gerraty
1203cbdda60SSimon J. Gerraty.y.d:
1213cbdda60SSimon J. Gerraty	${YACC} ${YFLAGS} $<
1223cbdda60SSimon J. Gerraty	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; }
1233cbdda60SSimon J. Gerraty	${RM} -f y.tab.c
1243cbdda60SSimon J. Gerraty
1253cbdda60SSimon J. Gerraty.l.d:
1263cbdda60SSimon J. Gerraty	${LEX} ${LFLAGS} $<
1273cbdda60SSimon J. Gerraty	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; }
1283cbdda60SSimon J. Gerraty	${RM} -f lex.yy.c
1293cbdda60SSimon J. Gerraty
1303cbdda60SSimon J. Gerraty.c.d:
1313cbdda60SSimon J. Gerraty	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
1323cbdda60SSimon J. Gerraty
1333cbdda60SSimon J. Gerraty.s.d .S.d:
1343cbdda60SSimon J. Gerraty	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; }
1353cbdda60SSimon J. Gerraty
136e48f47ddSSimon J. Gerraty${CXX_SUFFIXES:%=%.d}:
1373cbdda60SSimon J. Gerraty	${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
138*c59c3bf3SSimon J. Gerraty
1393cbdda60SSimon J. Gerraty.endif
1403cbdda60SSimon J. Gerraty
1413cbdda60SSimon J. Gerraty.if !target(depend)
1423cbdda60SSimon J. Gerratydepend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE
1433cbdda60SSimon J. Gerraty
1443cbdda60SSimon J. Gerraty${DEPENDFILE}:	${DEPSRCS} ${__dependsrcs}
1453cbdda60SSimon J. Gerraty.NOPATH:	${__dependsrcs}
1463cbdda60SSimon J. Gerraty.OPTIONAL:	${__dependsrcs}
1473cbdda60SSimon J. Gerraty.endif
1483cbdda60SSimon J. Gerraty.endif				# make(depend)
1493cbdda60SSimon J. Gerraty
1503cbdda60SSimon J. Gerraty.if empty(CFLAGS_MD)
1513cbdda60SSimon J. Gerraty# make sure the .d's are generated/updated
1523cbdda60SSimon J. Gerraty${PROG} ${_LIBS}:	${DEPENDFILE}
1533cbdda60SSimon J. Gerraty.endif
1543cbdda60SSimon J. Gerraty
1553cbdda60SSimon J. Gerraty.ORDER:	beforedepend ${DEPENDFILE} afterdepend
1563cbdda60SSimon J. Gerraty
1573cbdda60SSimon J. Gerraty.if ${.OBJDIR} != ${.CURDIR}
1583cbdda60SSimon J. Gerraty__depfiles = *.d
1593cbdda60SSimon J. Gerraty.else
1603cbdda60SSimon J. Gerraty__depfiles = ${__dependsrcs}
1613cbdda60SSimon J. Gerraty.endif
1623cbdda60SSimon J. Gerraty
1633cbdda60SSimon J. GerratyDEPCLEANFILES = ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d
1643cbdda60SSimon J. Gerraty
1653cbdda60SSimon J. Gerratycleandir: cleanautodepend
1663cbdda60SSimon J. Gerratycleanautodepend:
1673cbdda60SSimon J. Gerraty	${RM} -f ${DEPCLEANFILES}
1683cbdda60SSimon J. Gerraty
1693cbdda60SSimon J. GerratyCLEANFILES += ${DEPCLEANFILES}
1703cbdda60SSimon J. Gerraty
1713cbdda60SSimon J. Gerraty.if defined(__dependsrcs) && !empty(__dependsrcs)
1723cbdda60SSimon J. Gerraty.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*))
1733cbdda60SSimon J. Gerraty# this ensures we do the right thing if only building a shared or
1743cbdda60SSimon J. Gerraty# profiled lib
175*c59c3bf3SSimon J. GerratyOBJ_SUFFIXES ?= .o .po .so .So
176*c59c3bf3SSimon J. GerratyMDLIB_SED = -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_SUFFIXES:S,^,\1,},'
1773cbdda60SSimon J. Gerraty.ifdef NOMD_SED
1783cbdda60SSimon J. Gerraty.ifdef LIB
1793cbdda60SSimon J. GerratyMD_SED = sed ${MDLIB_SED}
1803cbdda60SSimon J. Gerraty.else
1813cbdda60SSimon J. GerratyMD_SED = cat
1823cbdda60SSimon J. Gerraty.endif
1833cbdda60SSimon J. Gerraty.else
1843cbdda60SSimon J. Gerraty# arrange to put some variable names into ${DEPENDFILE}
1853cbdda60SSimon J. Gerraty.ifdef LIB
1863cbdda60SSimon J. GerratyMD_SED = sed ${MDLIB_SED}
1873cbdda60SSimon J. Gerraty.else
1883cbdda60SSimon J. GerratyMD_SED = sed
1893cbdda60SSimon J. Gerraty.endif
1903cbdda60SSimon J. GerratySUBST_DEPVARS += SB TOP BACKING SRC SRCDIR BASE BASEDIR
1913cbdda60SSimon J. Gerraty.for v in ${SUBST_DEPVARS}
1923cbdda60SSimon J. Gerraty.if defined(${v}) && !empty(${v})
1933cbdda60SSimon J. GerratyMD_SED += -e 's,${$v},$${$v},'
1943cbdda60SSimon J. Gerraty.endif
1953cbdda60SSimon J. Gerraty.endfor
1963cbdda60SSimon J. Gerraty.endif
1973cbdda60SSimon J. Gerraty.if (${MD_SED} == "sed")
1983cbdda60SSimon J. GerratyMD_SED = cat
1993cbdda60SSimon J. Gerraty.endif
2003cbdda60SSimon J. Gerraty
2013cbdda60SSimon J. Gerraty# this will be done whenever make finishes successfully
2023cbdda60SSimon J. Gerraty.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530
2033cbdda60SSimon J. Gerraty.END:
2043cbdda60SSimon J. Gerraty.else
2053cbdda60SSimon J. Gerraty.END:	${DEPENDFILE}
2063cbdda60SSimon J. Gerraty# we do not want to trigger building .d's just use them if they exist
2073cbdda60SSimon J. Gerraty${DEPENDFILE}:	${__dependsrcs:@d@${exists($d):?$d:}@}
2083cbdda60SSimon J. Gerraty.endif
2093cbdda60SSimon J. Gerraty	-@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \
2103cbdda60SSimon J. Gerraty	test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \
2113cbdda60SSimon J. Gerraty	${RM} -f ${DEPENDFILE}.new
2123cbdda60SSimon J. Gerraty.endif
2133cbdda60SSimon J. Gerraty.endif
2143cbdda60SSimon J. Gerraty.else
2153cbdda60SSimon J. Gerratydepend: beforedepend afterdepend _SUBDIRUSE
2163cbdda60SSimon J. Gerraty.endif
2173cbdda60SSimon J. Gerraty
2183cbdda60SSimon J. Gerraty.if !target(beforedepend)
2193cbdda60SSimon J. Gerratybeforedepend:
2203cbdda60SSimon J. Gerraty.endif
2213cbdda60SSimon J. Gerraty.if !target(afterdepend)
2223cbdda60SSimon J. Gerratyafterdepend:
2233cbdda60SSimon J. Gerraty.endif
2243cbdda60SSimon J. Gerraty
225*c59c3bf3SSimon J. Gerraty.-include <ccm.dep.mk>
226*c59c3bf3SSimon J. Gerraty
2273cbdda60SSimon J. Gerraty.endif
228