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