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