xref: /freebsd/share/mk/bsd.dep.mk (revision 0c76c8aa8cd369ebf695c5bfa0bff21551661cfc)
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"
528447c44fSBaptiste DaroussinMKDEPCMD?=	CC='${CC} ${DEPFLAGS}' 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
12417b22722SRui Paulo.if ${SRCS:M*.d}
1255439a715SMark JohnstonCFLAGS+=	-I${.OBJDIR}
126ff0f36e7SRui Paulo.endif
1279f65e34fSRui Paulo.for _DSRC in ${SRCS:M*.d:N*/*}
128ff0f36e7SRui Paulo.for _D in ${_DSRC:R}
1299c851217SRui PauloDHDRS+=	${_D}.h
130ff0f36e7SRui Paulo${_D}.h: ${_DSRC}
131*0c76c8aaSMark Johnston	${DTRACE} ${DTRACEFLAGS} -h -s ${.ALLSRC}
132e9083b2dSMark JohnstonSRCS:=	${SRCS:S/^${_DSRC}$//}
133d8b63155SRui PauloOBJS+=	${_D}.o
1349b646f25SRui PauloCLEANFILES+= ${_D}.h ${_D}.o
135e9083b2dSMark Johnston${_D}.o: ${_DSRC} ${OBJS:S/^${_D}.o$//}
136*0c76c8aaSMark Johnston	${DTRACE} ${DTRACEFLAGS} -G -o ${.TARGET} -s ${.ALLSRC}
1379b646f25SRui Paulo.if defined(LIB)
1389b646f25SRui PauloCLEANFILES+= ${_D}.So ${_D}.po
139e9083b2dSMark Johnston${_D}.So: ${_DSRC} ${SOBJS:S/^${_D}.So$//}
140*0c76c8aaSMark Johnston	${DTRACE} ${DTRACEFLAGS} -G -o ${.TARGET} -s ${.ALLSRC}
141e9083b2dSMark Johnston${_D}.po: ${_DSRC} ${POBJS:S/^${_D}.po$//}
142*0c76c8aaSMark Johnston	${DTRACE} ${DTRACEFLAGS} -G -o ${.TARGET} -s ${.ALLSRC}
143ff0f36e7SRui Paulo.endif
1449f65e34fSRui Paulo.endfor
1459f65e34fSRui Paulo.endfor
1469c851217SRui Paulobeforedepend: ${DHDRS}
1479c851217SRui Paulobeforebuild: ${DHDRS}
1482ec8b6deSBruce Evans.endif
1492ec8b6deSBruce Evans
150d14f862cSGarrett Wollman.if !target(depend)
151d14f862cSGarrett Wollman.if defined(SRCS)
152b25a566dSRuslan Ermilovdepend: beforedepend ${DEPENDFILE} afterdepend
153b16495e7SWolfram Schneider
1540815243cSMarcel Moolenaar# Tell bmake not to look for generated files via .PATH
1550815243cSMarcel Moolenaar.NOPATH: ${DEPENDFILE}
1560815243cSMarcel Moolenaar
157a813856eSBruce Evans# Different types of sources are compiled with slightly different flags.
158a813856eSBruce Evans# Split up the sources, and filter out headers and non-applicable flags.
1592d122146SDimitry AndricMKDEP_CFLAGS=	${CFLAGS:M-nostdinc*} ${CFLAGS:M-[BIDU]*} ${CFLAGS:M-std=*} \
1602d122146SDimitry Andric		${CFLAGS:M-ansi}
1612d122146SDimitry AndricMKDEP_CXXFLAGS=	${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BIDU]*} \
1622d122146SDimitry Andric		${CXXFLAGS:M-std=*} ${CXXFLAGS:M-ansi} ${CXXFLAGS:M-stdlib=*}
16306d6e4fcSTom Rhodes
16411dc9298SRuslan ErmilovDPSRCS+= ${SRCS}
16511dc9298SRuslan Ermilov${DEPENDFILE}: ${DPSRCS}
166b16495e7SWolfram Schneider	rm -f ${DEPENDFILE}
16765d2bdc6SRuslan Ermilov.if !empty(DPSRCS:M*.[cS])
168a813856eSBruce Evans	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
16906d6e4fcSTom Rhodes	    ${MKDEP_CFLAGS} ${.ALLSRC:M*.[cS]}
170b16495e7SWolfram Schneider.endif
17165d2bdc6SRuslan Ermilov.if !empty(DPSRCS:M*.cc) || !empty(DPSRCS:M*.C) || !empty(DPSRCS:M*.cpp) || \
17265d2bdc6SRuslan Ermilov    !empty(DPSRCS:M*.cxx)
173b16495e7SWolfram Schneider	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
17406d6e4fcSTom Rhodes	    ${MKDEP_CXXFLAGS} \
175c7cbe79eSDmitrij Tejblum	    ${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cpp} ${.ALLSRC:M*.cxx}
176b16495e7SWolfram Schneider.endif
177663e9677SBruce Evans.if target(_EXTRADEPEND)
17870e82473SRuslan Ermilov_EXTRADEPEND: .USE
1790cfacc86SRuslan Ermilov${DEPENDFILE}: _EXTRADEPEND
180663e9677SBruce Evans.endif
181b16495e7SWolfram Schneider
18297fe7f47SJordan K. Hubbard.ORDER: ${DEPENDFILE} afterdepend
183d14f862cSGarrett Wollman.else
184b25a566dSRuslan Ermilovdepend: beforedepend afterdepend
185d14f862cSGarrett Wollman.endif
186d14f862cSGarrett Wollman.if !target(beforedepend)
187d14f862cSGarrett Wollmanbeforedepend:
18897fe7f47SJordan K. Hubbard.else
18997fe7f47SJordan K. Hubbard.ORDER: beforedepend ${DEPENDFILE}
19097fe7f47SJordan K. Hubbard.ORDER: beforedepend afterdepend
191d14f862cSGarrett Wollman.endif
192d14f862cSGarrett Wollman.if !target(afterdepend)
193d14f862cSGarrett Wollmanafterdepend:
194d14f862cSGarrett Wollman.endif
195d14f862cSGarrett Wollman.endif
196d14f862cSGarrett Wollman
197cd9a2f5cSJordan K. Hubbard.if !target(cleandepend)
198b25a566dSRuslan Ermilovcleandepend:
199662773e2SBruce Evans.if defined(SRCS)
200213a4447SRuslan Ermilov.if ${CTAGS:T} == "gtags"
201ccc4bab1SRuslan Ermilov	rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS
2026eb5e456SJordan K. Hubbard.if defined(HTML)
203ccc4bab1SRuslan Ermilov	rm -rf HTML
204ccc4bab1SRuslan Ermilov.endif
2052f82e3b1SRuslan Ermilov.else
206213a4447SRuslan Ermilov	rm -f ${DEPENDFILE} tags
2076eb5e456SJordan K. Hubbard.endif
208cd9a2f5cSJordan K. Hubbard.endif
209cd9a2f5cSJordan K. Hubbard.endif
2106e02167bSRuslan Ermilov
2116e02167bSRuslan Ermilov.if !target(checkdpadd) && (defined(DPADD) || defined(LDADD))
21241ae64f3SEnji Cooper_LDADD_FROM_DPADD=	${DPADD:R:T:C;^lib(.*)$;-l\1;g}
21341ae64f3SEnji Cooper# Ignore -Wl,--start-group/-Wl,--end-group as it might be required in the
21441ae64f3SEnji Cooper# LDADD list due to unresolved symbols
21541ae64f3SEnji Cooper_LDADD_CANONICALIZED=	${LDADD:N:R:T:C;^lib(.*)$;-l\1;g:N-Wl,--[es]*-group}
2166e02167bSRuslan Ermilovcheckdpadd:
2172e3c6179SBruce Evans.if ${_LDADD_FROM_DPADD} != ${_LDADD_CANONICALIZED}
2182e3c6179SBruce Evans	@echo ${.CURDIR}
2192e3c6179SBruce Evans	@echo "DPADD -> ${_LDADD_FROM_DPADD}"
2202e3c6179SBruce Evans	@echo "LDADD -> ${_LDADD_CANONICALIZED}"
2212e3c6179SBruce Evans.endif
2226e02167bSRuslan Ermilov.endif
223