autodep.mk revision 302408
1272209Sandrew# 2272209Sandrew# RCSid: 3272209Sandrew# $Id: autodep.mk,v 1.36 2016/04/05 15:58:37 sjg Exp $ 4272209Sandrew# 5272209Sandrew# @(#) Copyright (c) 1999-2010, Simon J. Gerraty 6272209Sandrew# 7272209Sandrew# This file is provided in the hope that it will 8272209Sandrew# be of use. There is absolutely NO WARRANTY. 9272209Sandrew# Permission to copy, redistribute or otherwise 10272209Sandrew# use this file is hereby granted provided that 11272209Sandrew# the above copyright notice and this notice are 12272209Sandrew# left intact. 13272209Sandrew# 14272209Sandrew# Please send copies of changes and bug-fixes to: 15272209Sandrew# sjg@crufty.net 16272209Sandrew 17272209Sandrew# This module provides automagic dependency generation along the 18272209Sandrew# lines suggested in the GNU make.info 19272209Sandrew# The depend target is mainly for backwards compatibility, 20272209Sandrew# dependencies are normally updated as part of compilation. 21272209Sandrew 22272209Sandrew.if !target(__${.PARSEFILE}__) 23272209Sandrew__${.PARSEFILE}__: 24272209Sandrew 25272209SandrewDEPENDFILE?= .depend 26272209Sandrew.for d in ${DEPENDFILE:N.depend} 27272209Sandrew# bmake only groks .depend 28272209Sandrew.if ${MAKE_VERSION} < 20160218 29272209Sandrew.-include <$d> 30272209Sandrew.else 31272209Sandrew.dinclude <$d> 32272209Sandrew.endif 33272209Sandrew.endfor 34272209Sandrew 35272209Sandrew# it does nothing if SRCS is not defined or is empty 36272209Sandrew.if defined(SRCS) && !empty(SRCS) 37272209SandrewDEPSRCS?=${SRCS} 38272209Sandrew__depsrcs=${DEPSRCS:M*.c} 39272209Sandrew__depsrcs+=${DEPSRCS:M*.y} 40272209Sandrew__depsrcs+=${DEPSRCS:M*.l} 41272209Sandrew__depsrcs+=${DEPSRCS:M*.s} 42272209Sandrew__depsrcs+=${DEPSRCS:M*.S} 43272209Sandrew__depsrcs+=${DEPSRCS:M*.cc} 44272209Sandrew__depsrcs+=${DEPSRCS:M*.cpp} 45272209Sandrew__depsrcs+=${DEPSRCS:M*.C} 46272209Sandrew__depsrcs+=${DEPSRCS:M*.cxx} 47272209Sandrew__depsrcs+=${DEPSRCS:M*.pc} 48272209Sandrew 49272209Sandrew.for s in ${__depsrcs} 50272209Sandrew${s:T:R}.d: $s 51272209Sandrew.endfor 52272209Sandrew 53272209Sandrew__depsrcs:=${__depsrcs:T:R:S/$/.d/g} 54272209Sandrew# we also need to handle makefiles where the .d's from __depsrcs 55272209Sandrew# don't match those from OBJS 56272209Sandrew# we avoid using := here, since the modifier applied to OBJS 57272209Sandrew# can cause trouble if there are any undefined vars in OBJS. 58272209Sandrew__dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/} 59272209Sandrew__dependsrcs= ${__dependsrcsx:O:u} 60272209Sandrew 61272209Sandrew# clean up any .c files we may have generated 62272209Sandrew#__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l} 63272209Sandrew#CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g} 64272209Sandrew 65272209Sandrew# set this to -MMD to ignore /usr/include 66272209Sandrew# actually it ignores <> so may not be a great idea 67272209SandrewCFLAGS_MD?=-MD 68272209Sandrew# -MF etc not available on all gcc versions. 69272209Sandrew# we "fix" the .o later 70272209SandrewCFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o 71272209SandrewCFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF} 72272209SandrewRM?= rm 73272209Sandrew 74272209Sandrew# watch out for people who don't use CPPFLAGS 75272209SandrewCPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} 76272209SandrewCXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} 77272209Sandrew 78272209Sandrew# just in case these need to be different 79272209SandrewCC_MD?=${CC} 80272209SandrewCXX_MD?=${CXX} 81272209Sandrew 82272209Sandrew# should have been set by sys.mk 83272209SandrewCXX_SUFFIXES?= .cc .cpp .cxx .C 84272209Sandrew 85272209Sandrew# so we can do an explicit make depend, but not otherwise 86272209Sandrew.if make(depend) 87272209Sandrew.SUFFIXES: .d 88272209Sandrew 89272209Sandrew.if empty(CFLAGS_MD) 90272209Sandrew.y.d: 91272209Sandrew @echo updating dependencies for $< 92272209Sandrew @${YACC} ${YFLAGS} $< 93272209Sandrew @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; } 94272209Sandrew @${RM} -f y.tab.c 95272209Sandrew 96272209Sandrew.l.d: 97272209Sandrew @echo updating dependencies for $< 98272209Sandrew ${LEX} ${LFLAGS} $< 99272209Sandrew @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; } 100272209Sandrew @${RM} -f lex.yy.c 101272209Sandrew 102272209Sandrew.c.d: 103272209Sandrew @echo updating dependencies for $< 104272209Sandrew @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 105272209Sandrew 106272209Sandrew.s.d .S.d: 107272209Sandrew @echo updating dependencies for $< 108272209Sandrew @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 109272209Sandrew 110272209Sandrew${CXX_SUFFIXES:%=%.d}: 111272209Sandrew @echo updating dependencies for $< 112272209Sandrew @${SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 113272209Sandrew.else 114272209Sandrew.y.d: 115272209Sandrew ${YACC} ${YFLAGS} $< 116272209Sandrew ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; } 117272209Sandrew ${RM} -f y.tab.c 118272209Sandrew 119272209Sandrew.l.d: 120272209Sandrew ${LEX} ${LFLAGS} $< 121272209Sandrew ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; } 122272209Sandrew ${RM} -f lex.yy.c 123272209Sandrew 124272209Sandrew.c.d: 125272209Sandrew ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 126272209Sandrew 127272209Sandrew.s.d .S.d: 128272209Sandrew ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; } 129272209Sandrew 130272209Sandrew${CXX_SUFFIXES:%=%.d}: 131272209Sandrew ${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 132272209Sandrew.endif 133272209Sandrew 134272209Sandrew.if !target(depend) 135272209Sandrewdepend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE 136272209Sandrew 137272209Sandrew${DEPENDFILE}: ${DEPSRCS} ${__dependsrcs} 138272209Sandrew.NOPATH: ${__dependsrcs} 139272209Sandrew.OPTIONAL: ${__dependsrcs} 140272209Sandrew.endif 141272209Sandrew.endif # make(depend) 142272209Sandrew 143272209Sandrew.if empty(CFLAGS_MD) 144272209Sandrew# make sure the .d's are generated/updated 145272209Sandrew${PROG} ${_LIBS}: ${DEPENDFILE} 146272209Sandrew.endif 147272209Sandrew 148272209Sandrew.ORDER: beforedepend ${DEPENDFILE} afterdepend 149272209Sandrew 150272209Sandrew.if ${.OBJDIR} != ${.CURDIR} 151272209Sandrew__depfiles= *.d 152272209Sandrew.else 153272209Sandrew__depfiles= ${__dependsrcs} 154272209Sandrew.endif 155272209Sandrew 156272209SandrewDEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d 157272209Sandrew 158272209Sandrewcleandir: cleanautodepend 159272209Sandrewcleanautodepend: 160272209Sandrew ${RM} -f ${DEPCLEANFILES} 161272209Sandrew 162272209SandrewCLEANFILES+= ${DEPCLEANFILES} 163272209Sandrew 164272209Sandrew.if defined(__dependsrcs) && !empty(__dependsrcs) 165272209Sandrew.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*)) 166272209Sandrew# this ensures we do the right thing if only building a shared or 167272209Sandrew# profiled lib 168272209SandrewOBJ_EXTENSIONS?=.o .po .so .So 169272209SandrewMDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},' 170272209Sandrew.ifdef NOMD_SED 171272209Sandrew.ifdef LIB 172272209SandrewMD_SED=sed ${MDLIB_SED} 173272209Sandrew.else 174272209SandrewMD_SED=cat 175272209Sandrew.endif 176272209Sandrew.else 177272209Sandrew# arrange to put some variable names into ${DEPENDFILE} 178272209Sandrew.ifdef LIB 179272209SandrewMD_SED=sed ${MDLIB_SED} 180272209Sandrew.else 181272209SandrewMD_SED=sed 182272209Sandrew.endif 183272209SandrewSUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR 184272209Sandrew.for v in ${SUBST_DEPVARS} 185272209Sandrew.if defined(${v}) && !empty(${v}) 186272209SandrewMD_SED+= -e 's,${$v},$${$v},' 187272209Sandrew.endif 188272209Sandrew.endfor 189272209Sandrew.endif 190272209Sandrew.if (${MD_SED} == "sed") 191272209SandrewMD_SED=cat 192272209Sandrew.endif 193272209Sandrew 194272209Sandrew# this will be done whenever make finishes successfully 195272209Sandrew.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530 196272209Sandrew.END: 197272209Sandrew.else 198272209Sandrew.END: ${DEPENDFILE} 199272209Sandrew# we do not want to trigger building .d's just use them if they exist 200272209Sandrew${DEPENDFILE}: ${__dependsrcs:@d@${exists($d):?$d:}@} 201272209Sandrew.endif 202272209Sandrew -@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \ 203272209Sandrew test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \ 204272209Sandrew ${RM} -f ${DEPENDFILE}.new 205272209Sandrew.endif 206272209Sandrew.endif 207272209Sandrew.else 208272209Sandrewdepend: beforedepend afterdepend _SUBDIRUSE 209272209Sandrew.endif 210272209Sandrew 211272209Sandrew.if !target(beforedepend) 212272209Sandrewbeforedepend: 213272209Sandrew.endif 214272209Sandrew.if !target(afterdepend) 215272209Sandrewafterdepend: 216272209Sandrew.endif 217272209Sandrew 218272209Sandrew.endif 219272209Sandrew