1246149Ssjg# 2246149Ssjg# RCSid: 3321964Ssjg# $Id: autodep.mk,v 1.36 2016/04/05 15:58:37 sjg Exp $ 4246149Ssjg# 5246149Ssjg# @(#) Copyright (c) 1999-2010, Simon J. Gerraty 6246149Ssjg# 7246149Ssjg# This file is provided in the hope that it will 8246149Ssjg# be of use. There is absolutely NO WARRANTY. 9246149Ssjg# Permission to copy, redistribute or otherwise 10246149Ssjg# use this file is hereby granted provided that 11246149Ssjg# the above copyright notice and this notice are 12246149Ssjg# left intact. 13246149Ssjg# 14246149Ssjg# Please send copies of changes and bug-fixes to: 15246149Ssjg# sjg@crufty.net 16246149Ssjg 17246149Ssjg# This module provides automagic dependency generation along the 18246149Ssjg# lines suggested in the GNU make.info 19276305Sngie# The depend target is mainly for backwards compatibility, 20246149Ssjg# dependencies are normally updated as part of compilation. 21246149Ssjg 22246149Ssjg.if !target(__${.PARSEFILE}__) 23246149Ssjg__${.PARSEFILE}__: 24246149Ssjg 25246149SsjgDEPENDFILE?= .depend 26246149Ssjg.for d in ${DEPENDFILE:N.depend} 27246149Ssjg# bmake only groks .depend 28321964Ssjg.if ${MAKE_VERSION} < 20160218 29321964Ssjg.-include <$d> 30321964Ssjg.else 31321964Ssjg.dinclude <$d> 32321964Ssjg.endif 33246149Ssjg.endfor 34246149Ssjg 35246149Ssjg# it does nothing if SRCS is not defined or is empty 36246149Ssjg.if defined(SRCS) && !empty(SRCS) 37246149SsjgDEPSRCS?=${SRCS} 38246149Ssjg__depsrcs=${DEPSRCS:M*.c} 39246149Ssjg__depsrcs+=${DEPSRCS:M*.y} 40246149Ssjg__depsrcs+=${DEPSRCS:M*.l} 41246149Ssjg__depsrcs+=${DEPSRCS:M*.s} 42246149Ssjg__depsrcs+=${DEPSRCS:M*.S} 43246149Ssjg__depsrcs+=${DEPSRCS:M*.cc} 44246149Ssjg__depsrcs+=${DEPSRCS:M*.cpp} 45246149Ssjg__depsrcs+=${DEPSRCS:M*.C} 46246149Ssjg__depsrcs+=${DEPSRCS:M*.cxx} 47246149Ssjg__depsrcs+=${DEPSRCS:M*.pc} 48246149Ssjg 49246149Ssjg.for s in ${__depsrcs} 50246149Ssjg${s:T:R}.d: $s 51246149Ssjg.endfor 52246149Ssjg 53246149Ssjg__depsrcs:=${__depsrcs:T:R:S/$/.d/g} 54246149Ssjg# we also need to handle makefiles where the .d's from __depsrcs 55246149Ssjg# don't match those from OBJS 56246149Ssjg# we avoid using := here, since the modifier applied to OBJS 57246149Ssjg# can cause trouble if there are any undefined vars in OBJS. 58246149Ssjg__dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/} 59246149Ssjg__dependsrcs= ${__dependsrcsx:O:u} 60246149Ssjg 61246149Ssjg# clean up any .c files we may have generated 62246149Ssjg#__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l} 63246149Ssjg#CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g} 64246149Ssjg 65246149Ssjg# set this to -MMD to ignore /usr/include 66246149Ssjg# actually it ignores <> so may not be a great idea 67246149SsjgCFLAGS_MD?=-MD 68246149Ssjg# -MF etc not available on all gcc versions. 69246149Ssjg# we "fix" the .o later 70246149SsjgCFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o 71246149SsjgCFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF} 72246149SsjgRM?= rm 73246149Ssjg 74246149Ssjg# watch out for people who don't use CPPFLAGS 75246149SsjgCPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} 76246149SsjgCXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} 77246149Ssjg 78246149Ssjg# just in case these need to be different 79246149SsjgCC_MD?=${CC} 80246149SsjgCXX_MD?=${CXX} 81246149Ssjg 82321964Ssjg# should have been set by sys.mk 83321964SsjgCXX_SUFFIXES?= .cc .cpp .cxx .C 84321964Ssjg 85246149Ssjg# so we can do an explicit make depend, but not otherwise 86246149Ssjg.if make(depend) 87246149Ssjg.SUFFIXES: .d 88246149Ssjg 89246149Ssjg.if empty(CFLAGS_MD) 90246149Ssjg.y.d: 91246149Ssjg @echo updating dependencies for $< 92246149Ssjg @${YACC} ${YFLAGS} $< 93246149Ssjg @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; } 94246149Ssjg @${RM} -f y.tab.c 95246149Ssjg 96246149Ssjg.l.d: 97246149Ssjg @echo updating dependencies for $< 98246149Ssjg ${LEX} ${LFLAGS} $< 99246149Ssjg @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; } 100246149Ssjg @${RM} -f lex.yy.c 101246149Ssjg 102246149Ssjg.c.d: 103246149Ssjg @echo updating dependencies for $< 104246149Ssjg @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 105246149Ssjg 106246149Ssjg.s.d .S.d: 107246149Ssjg @echo updating dependencies for $< 108246149Ssjg @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 109246149Ssjg 110321964Ssjg${CXX_SUFFIXES:%=%.d}: 111246149Ssjg @echo updating dependencies for $< 112246149Ssjg @${SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 113246149Ssjg.else 114246149Ssjg.y.d: 115246149Ssjg ${YACC} ${YFLAGS} $< 116246149Ssjg ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; } 117246149Ssjg ${RM} -f y.tab.c 118246149Ssjg 119246149Ssjg.l.d: 120246149Ssjg ${LEX} ${LFLAGS} $< 121246149Ssjg ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; } 122246149Ssjg ${RM} -f lex.yy.c 123246149Ssjg 124246149Ssjg.c.d: 125246149Ssjg ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 126246149Ssjg 127246149Ssjg.s.d .S.d: 128246149Ssjg ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; } 129246149Ssjg 130321964Ssjg${CXX_SUFFIXES:%=%.d}: 131246149Ssjg ${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 132246149Ssjg.endif 133246149Ssjg 134246149Ssjg.if !target(depend) 135246149Ssjgdepend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE 136246149Ssjg 137246149Ssjg${DEPENDFILE}: ${DEPSRCS} ${__dependsrcs} 138246149Ssjg.NOPATH: ${__dependsrcs} 139246149Ssjg.OPTIONAL: ${__dependsrcs} 140246149Ssjg.endif 141246149Ssjg.endif # make(depend) 142246149Ssjg 143246149Ssjg.if empty(CFLAGS_MD) 144246149Ssjg# make sure the .d's are generated/updated 145246149Ssjg${PROG} ${_LIBS}: ${DEPENDFILE} 146246149Ssjg.endif 147246149Ssjg 148246149Ssjg.ORDER: beforedepend ${DEPENDFILE} afterdepend 149246149Ssjg 150246149Ssjg.if ${.OBJDIR} != ${.CURDIR} 151246149Ssjg__depfiles= *.d 152246149Ssjg.else 153246149Ssjg__depfiles= ${__dependsrcs} 154246149Ssjg.endif 155246149Ssjg 156246149SsjgDEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d 157246149Ssjg 158246149Ssjgcleandir: cleanautodepend 159246149Ssjgcleanautodepend: 160246149Ssjg ${RM} -f ${DEPCLEANFILES} 161246149Ssjg 162246149SsjgCLEANFILES+= ${DEPCLEANFILES} 163246149Ssjg 164246149Ssjg.if defined(__dependsrcs) && !empty(__dependsrcs) 165246149Ssjg.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*)) 166246149Ssjg# this ensures we do the right thing if only building a shared or 167246149Ssjg# profiled lib 168246149SsjgOBJ_EXTENSIONS?=.o .po .so .So 169246149SsjgMDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},' 170246149Ssjg.ifdef NOMD_SED 171246149Ssjg.ifdef LIB 172246149SsjgMD_SED=sed ${MDLIB_SED} 173246149Ssjg.else 174246149SsjgMD_SED=cat 175246149Ssjg.endif 176246149Ssjg.else 177246149Ssjg# arrange to put some variable names into ${DEPENDFILE} 178246149Ssjg.ifdef LIB 179246149SsjgMD_SED=sed ${MDLIB_SED} 180246149Ssjg.else 181246149SsjgMD_SED=sed 182246149Ssjg.endif 183246149SsjgSUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR 184246149Ssjg.for v in ${SUBST_DEPVARS} 185246149Ssjg.if defined(${v}) && !empty(${v}) 186246149SsjgMD_SED+= -e 's,${$v},$${$v},' 187246149Ssjg.endif 188246149Ssjg.endfor 189246149Ssjg.endif 190246149Ssjg.if (${MD_SED} == "sed") 191246149SsjgMD_SED=cat 192246149Ssjg.endif 193246149Ssjg 194246149Ssjg# this will be done whenever make finishes successfully 195246149Ssjg.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530 196246149Ssjg.END: 197246149Ssjg.else 198246149Ssjg.END: ${DEPENDFILE} 199246149Ssjg# we do not want to trigger building .d's just use them if they exist 200246149Ssjg${DEPENDFILE}: ${__dependsrcs:@d@${exists($d):?$d:}@} 201246149Ssjg.endif 202246149Ssjg -@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \ 203246149Ssjg test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \ 204246149Ssjg ${RM} -f ${DEPENDFILE}.new 205246149Ssjg.endif 206246149Ssjg.endif 207246149Ssjg.else 208246149Ssjgdepend: beforedepend afterdepend _SUBDIRUSE 209246149Ssjg.endif 210246149Ssjg 211246149Ssjg.if !target(beforedepend) 212246149Ssjgbeforedepend: 213246149Ssjg.endif 214246149Ssjg.if !target(afterdepend) 215246149Ssjgafterdepend: 216246149Ssjg.endif 217246149Ssjg 218246149Ssjg.endif 219