1# 2# RCSid: 3# $Id: autodep.mk,v 1.36 2016/04/05 15:58:37 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 73 74# watch out for people who don't use CPPFLAGS 75CPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} 76CXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} 77 78# just in case these need to be different 79CC_MD?=${CC} 80CXX_MD?=${CXX} 81 82# should have been set by sys.mk 83CXX_SUFFIXES?= .cc .cpp .cxx .C 84 85# so we can do an explicit make depend, but not otherwise 86.if make(depend) 87.SUFFIXES: .d 88 89.if empty(CFLAGS_MD) 90.y.d: 91 @echo updating dependencies for $< 92 @${YACC} ${YFLAGS} $< 93 @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; } 94 @${RM} -f y.tab.c 95 96.l.d: 97 @echo updating dependencies for $< 98 ${LEX} ${LFLAGS} $< 99 @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; } 100 @${RM} -f lex.yy.c 101 102.c.d: 103 @echo updating dependencies for $< 104 @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 105 106.s.d .S.d: 107 @echo updating dependencies for $< 108 @${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 109 110${CXX_SUFFIXES:%=%.d}: 111 @echo updating dependencies for $< 112 @${SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } 113.else 114.y.d: 115 ${YACC} ${YFLAGS} $< 116 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; } 117 ${RM} -f y.tab.c 118 119.l.d: 120 ${LEX} ${LFLAGS} $< 121 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; } 122 ${RM} -f lex.yy.c 123 124.c.d: 125 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 126 127.s.d .S.d: 128 ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; } 129 130${CXX_SUFFIXES:%=%.d}: 131 ${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } 132.endif 133 134.if !target(depend) 135depend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE 136 137${DEPENDFILE}: ${DEPSRCS} ${__dependsrcs} 138.NOPATH: ${__dependsrcs} 139.OPTIONAL: ${__dependsrcs} 140.endif 141.endif # make(depend) 142 143.if empty(CFLAGS_MD) 144# make sure the .d's are generated/updated 145${PROG} ${_LIBS}: ${DEPENDFILE} 146.endif 147 148.ORDER: beforedepend ${DEPENDFILE} afterdepend 149 150.if ${.OBJDIR} != ${.CURDIR} 151__depfiles= *.d 152.else 153__depfiles= ${__dependsrcs} 154.endif 155 156DEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d 157 158cleandir: cleanautodepend 159cleanautodepend: 160 ${RM} -f ${DEPCLEANFILES} 161 162CLEANFILES+= ${DEPCLEANFILES} 163 164.if defined(__dependsrcs) && !empty(__dependsrcs) 165.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*)) 166# this ensures we do the right thing if only building a shared or 167# profiled lib 168OBJ_EXTENSIONS?=.o .po .so .So 169MDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},' 170.ifdef NOMD_SED 171.ifdef LIB 172MD_SED=sed ${MDLIB_SED} 173.else 174MD_SED=cat 175.endif 176.else 177# arrange to put some variable names into ${DEPENDFILE} 178.ifdef LIB 179MD_SED=sed ${MDLIB_SED} 180.else 181MD_SED=sed 182.endif 183SUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR 184.for v in ${SUBST_DEPVARS} 185.if defined(${v}) && !empty(${v}) 186MD_SED+= -e 's,${$v},$${$v},' 187.endif 188.endfor 189.endif 190.if (${MD_SED} == "sed") 191MD_SED=cat 192.endif 193 194# this will be done whenever make finishes successfully 195.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530 196.END: 197.else 198.END: ${DEPENDFILE} 199# we do not want to trigger building .d's just use them if they exist 200${DEPENDFILE}: ${__dependsrcs:@d@${exists($d):?$d:}@} 201.endif 202 -@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \ 203 test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \ 204 ${RM} -f ${DEPENDFILE}.new 205.endif 206.endif 207.else 208depend: beforedepend afterdepend _SUBDIRUSE 209.endif 210 211.if !target(beforedepend) 212beforedepend: 213.endif 214.if !target(afterdepend) 215afterdepend: 216.endif 217 218.endif 219