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