17f3dea24SPeter Wemm# $FreeBSD$ 253996fadSWolfram Schneider# 353996fadSWolfram Schneider# The include file <bsd.dep.mk> handles Makefile dependencies. 453996fadSWolfram Schneider# 553996fadSWolfram Schneider# 653996fadSWolfram Schneider# +++ variables +++ 753996fadSWolfram Schneider# 8ccc4bab1SRuslan Ermilov# CTAGS A tags file generation program [gtags] 9ccc4bab1SRuslan Ermilov# 10ccc4bab1SRuslan Ermilov# CTAGSFLAGS Options for ctags(1) [not set] 11ccc4bab1SRuslan Ermilov# 1253996fadSWolfram Schneider# DEPENDFILE dependencies file [.depend] 1353996fadSWolfram Schneider# 14ccc4bab1SRuslan Ermilov# GTAGSFLAGS Options for gtags(1) [-o] 15ccc4bab1SRuslan Ermilov# 16ccc4bab1SRuslan Ermilov# HTAGSFLAGS Options for htags(1) [not set] 17ccc4bab1SRuslan Ermilov# 1853996fadSWolfram Schneider# MKDEP Options for ${MKDEPCMD} [not set] 1953996fadSWolfram Schneider# 2053996fadSWolfram Schneider# MKDEPCMD Makefile dependency list program [mkdep] 2153996fadSWolfram Schneider# 2253996fadSWolfram Schneider# SRCS List of source files (c, c++, assembler) 2353996fadSWolfram Schneider# 2411dc9298SRuslan Ermilov# DPSRCS List of source files which are needed for generating 2511dc9298SRuslan Ermilov# dependencies, ${SRCS} are always part of it. 2653996fadSWolfram Schneider# 2753996fadSWolfram Schneider# +++ targets +++ 2853996fadSWolfram Schneider# 2953996fadSWolfram Schneider# cleandepend: 3053996fadSWolfram Schneider# Remove depend and tags file 3153996fadSWolfram Schneider# 3253996fadSWolfram Schneider# depend: 3353996fadSWolfram Schneider# Make the dependencies for the source files, and store 3453996fadSWolfram Schneider# them in the file ${DEPENDFILE}. 3553996fadSWolfram Schneider# 3653996fadSWolfram Schneider# tags: 37ccc4bab1SRuslan Ermilov# In "ctags" mode, create a tags file for the source files. 38ccc4bab1SRuslan Ermilov# In "gtags" mode, create a (GLOBAL) gtags file for the 39ccc4bab1SRuslan Ermilov# source files. If HTML is defined, htags(1) is also run 40ccc4bab1SRuslan Ermilov# after gtags(1). 4153996fadSWolfram Schneider 425ffdf361SRuslan Ermilov.if !target(__<bsd.init.mk>__) 435ffdf361SRuslan Ermilov.error bsd.dep.mk cannot be included directly. 445ffdf361SRuslan Ermilov.endif 45b16495e7SWolfram Schneider 46ccc4bab1SRuslan ErmilovCTAGS?= gtags 47ccc4bab1SRuslan ErmilovCTAGSFLAGS?= 48ccc4bab1SRuslan ErmilovGTAGSFLAGS?= -o 49ccc4bab1SRuslan ErmilovHTAGSFLAGS?= 50ccc4bab1SRuslan Ermilov 51e16529d3SRuslan Ermilov.if ${CC} != "cc" 52732757a7SBruce EvansMKDEPCMD?= CC='${CC}' mkdep 53e16529d3SRuslan Ermilov.else 54e16529d3SRuslan ErmilovMKDEPCMD?= mkdep 55e16529d3SRuslan Ermilov.endif 56b16495e7SWolfram SchneiderDEPENDFILE?= .depend 57d14f862cSGarrett Wollman 58ccc4bab1SRuslan Ermilov# Keep `tags' here, before SRCS are mangled below for `depend'. 596260f1d8SRuslan Ermilov.if !target(tags) && defined(SRCS) && !defined(NO_TAGS) 60ccc4bab1SRuslan Ermilovtags: ${SRCS} 61213a4447SRuslan Ermilov.if ${CTAGS:T} == "gtags" 62ccc4bab1SRuslan Ermilov @cd ${.CURDIR} && ${CTAGS} ${GTAGSFLAGS} ${.OBJDIR} 63ccc4bab1SRuslan Ermilov.if defined(HTML) 64ccc4bab1SRuslan Ermilov @cd ${.CURDIR} && htags ${HTAGSFLAGS} -d ${.OBJDIR} ${.OBJDIR} 65ccc4bab1SRuslan Ermilov.endif 66213a4447SRuslan Ermilov.else 67213a4447SRuslan Ermilov @${CTAGS} ${CTAGSFLAGS} -f /dev/stdout \ 68213a4447SRuslan Ermilov ${.ALLSRC:N*.h} | sed "s;${.CURDIR}/;;" > ${.TARGET} 69ccc4bab1SRuslan Ermilov.endif 70ccc4bab1SRuslan Ermilov.endif 71ccc4bab1SRuslan Ermilov 722ec8b6deSBruce Evans.if defined(SRCS) 732ec8b6deSBruce EvansCLEANFILES?= 742ec8b6deSBruce Evans 756b14fdfaSRuslan Ermilov.if !exists(${.OBJDIR}/${DEPENDFILE}) 768a152f97SRui Paulo.for _S in ${SRCS:N*.[dhly]} 776b14fdfaSRuslan Ermilov${_S:R}.o: ${_S} 786b14fdfaSRuslan Ermilov.endfor 796b14fdfaSRuslan Ermilov.endif 806b14fdfaSRuslan Ermilov 819f65e34fSRui Paulo# Lexical analyzers 822ec8b6deSBruce Evans.for _LSRC in ${SRCS:M*.l:N*/*} 83484933a9SRuslan Ermilov.for _LC in ${_LSRC:R}.c 842ec8b6deSBruce Evans${_LC}: ${_LSRC} 858f812fecSDag-Erling Smørgrav ${LEX} ${LFLAGS} -o${.TARGET} ${.ALLSRC} 866b14fdfaSRuslan Ermilov.if !exists(${.OBJDIR}/${DEPENDFILE}) 876b14fdfaSRuslan Ermilov${_LC:R}.o: ${_LC} 886b14fdfaSRuslan Ermilov.endif 892ec8b6deSBruce EvansSRCS:= ${SRCS:S/${_LSRC}/${_LC}/} 90484933a9SRuslan ErmilovCLEANFILES+= ${_LC} 912ec8b6deSBruce Evans.endfor 922ec8b6deSBruce Evans.endfor 932ec8b6deSBruce Evans 949f65e34fSRui Paulo# Yacc grammars 952ec8b6deSBruce Evans.for _YSRC in ${SRCS:M*.y:N*/*} 96484933a9SRuslan Ermilov.for _YC in ${_YSRC:R}.c 972ec8b6deSBruce EvansSRCS:= ${SRCS:S/${_YSRC}/${_YC}/} 98484933a9SRuslan ErmilovCLEANFILES+= ${_YC} 9965d2bdc6SRuslan Ermilov.if !empty(YFLAGS:M-d) && !empty(SRCS:My.tab.h) 1009e0a3441SMarcel Moolenaar.ORDER: ${_YC} y.tab.h 1019e0a3441SMarcel Moolenaar${_YC} y.tab.h: ${_YSRC} 1022ec8b6deSBruce Evans ${YACC} ${YFLAGS} ${.ALLSRC} 1032ec8b6deSBruce Evans cp y.tab.c ${_YC} 104484933a9SRuslan ErmilovCLEANFILES+= y.tab.c y.tab.h 10565d2bdc6SRuslan Ermilov.elif !empty(YFLAGS:M-d) 106484933a9SRuslan Ermilov.for _YH in ${_YC:R}.h 1079e0a3441SMarcel Moolenaar${_YH}: ${_YC} 1089e0a3441SMarcel Moolenaar${_YC}: ${_YSRC} 1092ec8b6deSBruce Evans ${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC} 110484933a9SRuslan ErmilovSRCS+= ${_YH} 111484933a9SRuslan ErmilovCLEANFILES+= ${_YH} 1122ec8b6deSBruce Evans.endfor 1132ec8b6deSBruce Evans.else 1142ec8b6deSBruce Evans${_YC}: ${_YSRC} 1152ec8b6deSBruce Evans ${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC} 1162ec8b6deSBruce Evans.endif 1176b14fdfaSRuslan Ermilov.if !exists(${.OBJDIR}/${DEPENDFILE}) 1186b14fdfaSRuslan Ermilov${_YC:R}.o: ${_YC} 1196b14fdfaSRuslan Ermilov.endif 1202ec8b6deSBruce Evans.endfor 1212ec8b6deSBruce Evans.endfor 1229f65e34fSRui Paulo 1239f65e34fSRui Paulo# DTrace probe definitions 124ff0f36e7SRui Paulo# libelf is currently needed for drti.o 12517b22722SRui Paulo.if ${SRCS:M*.d} 126ff0f36e7SRui PauloLDFLAGS+= -lelf 127ff0f36e7SRui PauloLDADD+= ${LIBELF} 1285439a715SMark JohnstonCFLAGS+= -I${.OBJDIR} 129ff0f36e7SRui Paulo.endif 1309f65e34fSRui Paulo.for _DSRC in ${SRCS:M*.d:N*/*} 131ff0f36e7SRui Paulo.for _D in ${_DSRC:R} 1329c851217SRui PauloDHDRS+= ${_D}.h 133ff0f36e7SRui Paulo${_D}.h: ${_DSRC} 1349f65e34fSRui Paulo ${DTRACE} -xnolibs -h -s ${.ALLSRC} 135ff0f36e7SRui PauloSRCS:= ${SRCS:S/${_DSRC}/${_D}.h/} 136d8b63155SRui PauloOBJS+= ${_D}.o 1379b646f25SRui PauloCLEANFILES+= ${_D}.h ${_D}.o 13823e97845SRui Paulo${_D}.o: ${_D}.h ${OBJS:S/${_D}.o//} 1399b646f25SRui Paulo ${DTRACE} -xnolibs -G -o ${.TARGET} -s ${.CURDIR}/${_DSRC} \ 1409b646f25SRui Paulo ${OBJS:S/${_D}.o//} 1419b646f25SRui Paulo.if defined(LIB) 1429b646f25SRui PauloCLEANFILES+= ${_D}.So ${_D}.po 1436b2edf61SRui Paulo${_D}.So: ${_D}.h ${SOBJS:S/${_D}.So//} 1449b646f25SRui Paulo ${DTRACE} -xnolibs -G -o ${.TARGET} -s ${.CURDIR}/${_DSRC} \ 1459b646f25SRui Paulo ${SOBJS:S/${_D}.So//} 1469b646f25SRui Paulo${_D}.po: ${_D}.h ${POBJS:S/${_D}.po//} 1479b646f25SRui Paulo ${DTRACE} -xnolibs -G -o ${.TARGET} -s ${.CURDIR}/${_DSRC} \ 1489b646f25SRui Paulo ${POBJS:S/${_D}.po//} 149ff0f36e7SRui Paulo.endif 1509f65e34fSRui Paulo.endfor 1519f65e34fSRui Paulo.endfor 1529c851217SRui Paulobeforedepend: ${DHDRS} 1539c851217SRui Paulobeforebuild: ${DHDRS} 1542ec8b6deSBruce Evans.endif 1552ec8b6deSBruce Evans 156d14f862cSGarrett Wollman.if !target(depend) 157d14f862cSGarrett Wollman.if defined(SRCS) 158b25a566dSRuslan Ermilovdepend: beforedepend ${DEPENDFILE} afterdepend 159b16495e7SWolfram Schneider 1600815243cSMarcel Moolenaar# Tell bmake not to look for generated files via .PATH 1610815243cSMarcel Moolenaar.NOPATH: ${DEPENDFILE} 1620815243cSMarcel Moolenaar 163a813856eSBruce Evans# Different types of sources are compiled with slightly different flags. 164a813856eSBruce Evans# Split up the sources, and filter out headers and non-applicable flags. 1652d122146SDimitry AndricMKDEP_CFLAGS= ${CFLAGS:M-nostdinc*} ${CFLAGS:M-[BIDU]*} ${CFLAGS:M-std=*} \ 1662d122146SDimitry Andric ${CFLAGS:M-ansi} 1672d122146SDimitry AndricMKDEP_CXXFLAGS= ${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BIDU]*} \ 1682d122146SDimitry Andric ${CXXFLAGS:M-std=*} ${CXXFLAGS:M-ansi} ${CXXFLAGS:M-stdlib=*} 16906d6e4fcSTom Rhodes 17011dc9298SRuslan ErmilovDPSRCS+= ${SRCS} 17111dc9298SRuslan Ermilov${DEPENDFILE}: ${DPSRCS} 172b16495e7SWolfram Schneider rm -f ${DEPENDFILE} 17365d2bdc6SRuslan Ermilov.if !empty(DPSRCS:M*.[cS]) 174a813856eSBruce Evans ${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \ 17506d6e4fcSTom Rhodes ${MKDEP_CFLAGS} ${.ALLSRC:M*.[cS]} 176b16495e7SWolfram Schneider.endif 17765d2bdc6SRuslan Ermilov.if !empty(DPSRCS:M*.cc) || !empty(DPSRCS:M*.C) || !empty(DPSRCS:M*.cpp) || \ 17865d2bdc6SRuslan Ermilov !empty(DPSRCS:M*.cxx) 179b16495e7SWolfram Schneider ${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \ 18006d6e4fcSTom Rhodes ${MKDEP_CXXFLAGS} \ 181c7cbe79eSDmitrij Tejblum ${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cpp} ${.ALLSRC:M*.cxx} 182b16495e7SWolfram Schneider.endif 183663e9677SBruce Evans.if target(_EXTRADEPEND) 18470e82473SRuslan Ermilov_EXTRADEPEND: .USE 1850cfacc86SRuslan Ermilov${DEPENDFILE}: _EXTRADEPEND 186663e9677SBruce Evans.endif 187b16495e7SWolfram Schneider 18897fe7f47SJordan K. Hubbard.ORDER: ${DEPENDFILE} afterdepend 189d14f862cSGarrett Wollman.else 190b25a566dSRuslan Ermilovdepend: beforedepend afterdepend 191d14f862cSGarrett Wollman.endif 192d14f862cSGarrett Wollman.if !target(beforedepend) 193d14f862cSGarrett Wollmanbeforedepend: 19497fe7f47SJordan K. Hubbard.else 19597fe7f47SJordan K. Hubbard.ORDER: beforedepend ${DEPENDFILE} 19697fe7f47SJordan K. Hubbard.ORDER: beforedepend afterdepend 197d14f862cSGarrett Wollman.endif 198d14f862cSGarrett Wollman.if !target(afterdepend) 199d14f862cSGarrett Wollmanafterdepend: 200d14f862cSGarrett Wollman.endif 201d14f862cSGarrett Wollman.endif 202d14f862cSGarrett Wollman 203cd9a2f5cSJordan K. Hubbard.if !target(cleandepend) 204b25a566dSRuslan Ermilovcleandepend: 205662773e2SBruce Evans.if defined(SRCS) 206213a4447SRuslan Ermilov.if ${CTAGS:T} == "gtags" 207ccc4bab1SRuslan Ermilov rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS 2086eb5e456SJordan K. Hubbard.if defined(HTML) 209ccc4bab1SRuslan Ermilov rm -rf HTML 210ccc4bab1SRuslan Ermilov.endif 2112f82e3b1SRuslan Ermilov.else 212213a4447SRuslan Ermilov rm -f ${DEPENDFILE} tags 2136eb5e456SJordan K. Hubbard.endif 214cd9a2f5cSJordan K. Hubbard.endif 215cd9a2f5cSJordan K. Hubbard.endif 2166e02167bSRuslan Ermilov 2176e02167bSRuslan Ermilov.if !target(checkdpadd) && (defined(DPADD) || defined(LDADD)) 218*41ae64f3SEnji Cooper_LDADD_FROM_DPADD= ${DPADD:R:T:C;^lib(.*)$;-l\1;g} 219*41ae64f3SEnji Cooper# Ignore -Wl,--start-group/-Wl,--end-group as it might be required in the 220*41ae64f3SEnji Cooper# LDADD list due to unresolved symbols 221*41ae64f3SEnji Cooper_LDADD_CANONICALIZED= ${LDADD:N:R:T:C;^lib(.*)$;-l\1;g:N-Wl,--[es]*-group} 2226e02167bSRuslan Ermilovcheckdpadd: 2232e3c6179SBruce Evans.if ${_LDADD_FROM_DPADD} != ${_LDADD_CANONICALIZED} 2242e3c6179SBruce Evans @echo ${.CURDIR} 2252e3c6179SBruce Evans @echo "DPADD -> ${_LDADD_FROM_DPADD}" 2262e3c6179SBruce Evans @echo "LDADD -> ${_LDADD_CANONICALIZED}" 2272e3c6179SBruce Evans.endif 2286e02167bSRuslan Ermilov.endif 229