1# 2# RCSid: 3# $Id: autodep.mk,v 1.38 2020/08/19 17:51:53 sjg Exp $ 4# 5# @(#) Copyright (c) 1999-2010, Simon J. Gerraty 6# 7# This file is provided in the hope that it will 8# be of use. There is absolutely NO WARRANTY. 9# Permission to copy, redistribute or otherwise 10# use this file is hereby granted provided that 11# the above copyright notice and this notice are 12# left intact. 13# 14# Please send copies of changes and bug-fixes to: 15# sjg@crufty.net 16 17# This module provides automagic dependency generation along the 18# lines suggested in the GNU make.info 19# The depend target is mainly for backwards compatibility, 20# dependencies are normally updated as part of compilation. 21 22.if !target(__${.PARSEFILE}__) 23__${.PARSEFILE}__: 24 25DEPENDFILE?= .depend 26.for d in ${DEPENDFILE:N.depend} 27# bmake only groks .depend 28.if ${MAKE_VERSION} < 20160218 29.-include <$d> 30.else 31.dinclude <$d> 32.endif 33.endfor 34 35# it does nothing if SRCS is not defined or is empty 36.if defined(SRCS) && !empty(SRCS) 37DEPSRCS?=${SRCS} 38__depsrcs=${DEPSRCS:M*.c} 39__depsrcs+=${DEPSRCS:M*.y} 40__depsrcs+=${DEPSRCS:M*.l} 41__depsrcs+=${DEPSRCS:M*.s} 42__depsrcs+=${DEPSRCS:M*.S} 43__depsrcs+=${DEPSRCS:M*.cc} 44__depsrcs+=${DEPSRCS:M*.cpp} 45__depsrcs+=${DEPSRCS:M*.C} 46__depsrcs+=${DEPSRCS:M*.cxx} 47__depsrcs+=${DEPSRCS:M*.pc} 48 49.for s in ${__depsrcs} 50${s:T:R}.d: $s 51.endfor 52 53__depsrcs:=${__depsrcs:T:R:S/$/.d/g} 54# we also need to handle makefiles where the .d's from __depsrcs 55# don't match those from OBJS 56# we avoid using := here, since the modifier applied to OBJS 57# can cause trouble if there are any undefined vars in OBJS. 58__dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/} 59__dependsrcs= ${__dependsrcsx:O:u} 60 61# clean up any .c files we may have generated 62#__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l} 63#CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g} 64 65# set this to -MMD to ignore /usr/include 66# actually it ignores <> so may not be a great idea 67CFLAGS_MD?=-MD 68# -MF etc not available on all gcc versions. 69# we "fix" the .o later 70CFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o 71CFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF} 72RM?= rm 73MAKE_SHELL?= sh 74 75# watch out for people who don't use CPPFLAGS 76CPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} 77CXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} 78 79# just in case these need to be different 80CC_MD?=${CC} 81CXX_MD?=${CXX} 82 83# should have been set by sys.mk 84CXX_SUFFIXES?= .cc .cpp .cxx .C 85 86# so we can do an explicit make depend, but not otherwise 87.if make(depend) 88.SUFFIXES: .d 89 90.if empty(CFLAGS_MD) 91.y.d: 92 @echo updating dependencies for $< 93 @${YACC} ${YFLAGS} $< 94 @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; } 95 @${RM} -f y.tab.c 96 97.l.d: 98 @echo updating dependencies for $< 99 ${LEX} ${LFLAGS} $< 100 @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; } 101 @${RM} -f lex.yy.c 102 103.c.d: 104 @echo updating dependencies for $< 105 @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 106 107.s.d .S.d: 108 @echo updating dependencies for $< 109 @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 110 111${CXX_SUFFIXES:%=%.d}: 112 @echo updating dependencies for $< 113 @${MAKE_SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 114.else 115.y.d: 116 ${YACC} ${YFLAGS} $< 117 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; } 118 ${RM} -f y.tab.c 119 120.l.d: 121 ${LEX} ${LFLAGS} $< 122 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; } 123 ${RM} -f lex.yy.c 124 125.c.d: 126 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 127 128.s.d .S.d: 129 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; } 130 131${CXX_SUFFIXES:%=%.d}: 132 ${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 133.endif 134 135.if !target(depend) 136depend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE 137 138${DEPENDFILE}: ${DEPSRCS} ${__dependsrcs} 139.NOPATH: ${__dependsrcs} 140.OPTIONAL: ${__dependsrcs} 141.endif 142.endif # make(depend) 143 144.if empty(CFLAGS_MD) 145# make sure the .d's are generated/updated 146${PROG} ${_LIBS}: ${DEPENDFILE} 147.endif 148 149.ORDER: beforedepend ${DEPENDFILE} afterdepend 150 151.if ${.OBJDIR} != ${.CURDIR} 152__depfiles= *.d 153.else 154__depfiles= ${__dependsrcs} 155.endif 156 157DEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d 158 159cleandir: cleanautodepend 160cleanautodepend: 161 ${RM} -f ${DEPCLEANFILES} 162 163CLEANFILES+= ${DEPCLEANFILES} 164 165.if defined(__dependsrcs) && !empty(__dependsrcs) 166.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*)) 167# this ensures we do the right thing if only building a shared or 168# profiled lib 169OBJ_EXTENSIONS?=.o .po .so .So 170MDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},' 171.ifdef NOMD_SED 172.ifdef LIB 173MD_SED=sed ${MDLIB_SED} 174.else 175MD_SED=cat 176.endif 177.else 178# arrange to put some variable names into ${DEPENDFILE} 179.ifdef LIB 180MD_SED=sed ${MDLIB_SED} 181.else 182MD_SED=sed 183.endif 184SUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR 185.for v in ${SUBST_DEPVARS} 186.if defined(${v}) && !empty(${v}) 187MD_SED+= -e 's,${$v},$${$v},' 188.endif 189.endfor 190.endif 191.if (${MD_SED} == "sed") 192MD_SED=cat 193.endif 194 195# this will be done whenever make finishes successfully 196.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530 197.END: 198.else 199.END: ${DEPENDFILE} 200# we do not want to trigger building .d's just use them if they exist 201${DEPENDFILE}: ${__dependsrcs:@d@${exists($d):?$d:}@} 202.endif 203 -@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \ 204 test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \ 205 ${RM} -f ${DEPENDFILE}.new 206.endif 207.endif 208.else 209depend: beforedepend afterdepend _SUBDIRUSE 210.endif 211 212.if !target(beforedepend) 213beforedepend: 214.endif 215.if !target(afterdepend) 216afterdepend: 217.endif 218 219.endif 220