xref: /freebsd/share/mk/bsd.dep.mk (revision 41ae64f37403cd72496a53c6ac2acd690fbc29fa)
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