150476Speter# $FreeBSD$
215903Swosch#
315903Swosch# The include file <bsd.dep.mk> handles Makefile dependencies.
415903Swosch#
515903Swosch#
615903Swosch# +++ variables +++
715903Swosch#
8105327Sru# CTAGS		A tags file generation program [gtags]
9105327Sru#
10105327Sru# CTAGSFLAGS	Options for ctags(1) [not set]
11105327Sru#
1215903Swosch# DEPENDFILE	dependencies file [.depend]
1315903Swosch#
14105327Sru# GTAGSFLAGS	Options for gtags(1) [-o]
15105327Sru#
16105327Sru# HTAGSFLAGS	Options for htags(1) [not set]
17105327Sru#
1815903Swosch# MKDEP		Options for ${MKDEPCMD} [not set]
1915903Swosch#
2015903Swosch# MKDEPCMD	Makefile dependency list program [mkdep]
21139761Skrion#
2215903Swosch# SRCS          List of source files (c, c++, assembler)
2315903Swosch#
24124490Sru# DPSRCS	List of source files which are needed for generating
25124490Sru#		dependencies, ${SRCS} are always part of it.
2615903Swosch#
2715903Swosch# +++ targets +++
2815903Swosch#
2915903Swosch#	cleandepend:
3015903Swosch#		Remove depend and tags file
3115903Swosch#
3215903Swosch#	depend:
3315903Swosch#		Make the dependencies for the source files, and store
3415903Swosch#		them in the file ${DEPENDFILE}.
3515903Swosch#
3615903Swosch#	tags:
37105327Sru#		In "ctags" mode, create a tags file for the source files.
38105327Sru#		In "gtags" mode, create a (GLOBAL) gtags file for the
39105327Sru#		source files.  If HTML is defined, htags(1) is also run
40105327Sru#		after gtags(1).
411845Swollman
4295255Sru.if !target(__<bsd.init.mk>__)
4395255Sru.error bsd.dep.mk cannot be included directly.
4495255Sru.endif
4515903Swosch
46105327SruCTAGS?=		gtags
47105327SruCTAGSFLAGS?=
48105327SruGTAGSFLAGS?=	-o
49105327SruHTAGSFLAGS?=
50105327Sru
5194768Sru.if ${CC} != "cc"
5296132SbdeMKDEPCMD?=	CC='${CC}' mkdep
5394768Sru.else
5494768SruMKDEPCMD?=	mkdep
5594768Sru.endif
5614986SwoschDEPENDFILE?=	.depend
5714986Swosch
58105327Sru# Keep `tags' here, before SRCS are mangled below for `depend'.
59139108Sru.if !target(tags) && defined(SRCS) && !defined(NO_TAGS)
60105327Srutags: ${SRCS}
61202579Sru.if ${CTAGS:T} == "gtags"
62105327Sru	@cd ${.CURDIR} && ${CTAGS} ${GTAGSFLAGS} ${.OBJDIR}
63105327Sru.if defined(HTML)
64105327Sru	@cd ${.CURDIR} && htags ${HTAGSFLAGS} -d ${.OBJDIR} ${.OBJDIR}
65105327Sru.endif
66202579Sru.else
67202579Sru	@${CTAGS} ${CTAGSFLAGS} -f /dev/stdout \
68202579Sru	    ${.ALLSRC:N*.h} | sed "s;${.CURDIR}/;;" > ${.TARGET}
69105327Sru.endif
70105327Sru.endif
71105327Sru
7235951Sbde.if defined(SRCS)
7335951SbdeCLEANFILES?=
7435951Sbde
75124637Sru.if !exists(${.OBJDIR}/${DEPENDFILE})
76269946Srpaulo.for _S in ${SRCS:N*.[dhly]}
77124637Sru${_S:R}.o: ${_S}
78124637Sru.endfor
79124637Sru.endif
80124637Sru
81269324Srpaulo# Lexical analyzers
8235951Sbde.for _LSRC in ${SRCS:M*.l:N*/*}
83124435Sru.for _LC in ${_LSRC:R}.c
8435951Sbde${_LC}: ${_LSRC}
85270408Sdes	${LEX} ${LFLAGS} -o${.TARGET} ${.ALLSRC}
86124637Sru.if !exists(${.OBJDIR}/${DEPENDFILE})
87124637Sru${_LC:R}.o: ${_LC}
88124637Sru.endif
8935951SbdeSRCS:=	${SRCS:S/${_LSRC}/${_LC}/}
90124435SruCLEANFILES+= ${_LC}
9135951Sbde.endfor
9235951Sbde.endfor
9335951Sbde
94269324Srpaulo# Yacc grammars
9535951Sbde.for _YSRC in ${SRCS:M*.y:N*/*}
96124435Sru.for _YC in ${_YSRC:R}.c
9735951SbdeSRCS:=	${SRCS:S/${_YSRC}/${_YC}/}
98124435SruCLEANFILES+= ${_YC}
99125119Sru.if !empty(YFLAGS:M-d) && !empty(SRCS:My.tab.h)
100241790Smarcel.ORDER: ${_YC} y.tab.h
101241790Smarcel${_YC} y.tab.h: ${_YSRC}
10235951Sbde	${YACC} ${YFLAGS} ${.ALLSRC}
10335951Sbde	cp y.tab.c ${_YC}
104124435SruCLEANFILES+= y.tab.c y.tab.h
105125119Sru.elif !empty(YFLAGS:M-d)
106124435Sru.for _YH in ${_YC:R}.h
107296763Sbdrewery.ORDER: ${_YC} ${_YH}
108296763Sbdrewery${_YC} ${_YH}: ${_YSRC}
10935951Sbde	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
110124435SruSRCS+=	${_YH}
111124435SruCLEANFILES+= ${_YH}
11235951Sbde.endfor
11335951Sbde.else
11435951Sbde${_YC}: ${_YSRC}
11535951Sbde	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
11635951Sbde.endif
117124637Sru.if !exists(${.OBJDIR}/${DEPENDFILE})
118124637Sru${_YC:R}.o: ${_YC}
119124637Sru.endif
12035951Sbde.endfor
12135951Sbde.endfor
122269324Srpaulo
123269324Srpaulo# DTrace probe definitions
124269946Srpaulo# libelf is currently needed for drti.o
125269946Srpaulo.if ${SRCS:M*.d}
126269946SrpauloLDFLAGS+=	-lelf
127269946SrpauloLDADD+=		${LIBELF}
128269946SrpauloCFLAGS+=	-D_DTRACE_VERSION=1 -I${.OBJDIR}
129269946Srpaulo.endif
130269324Srpaulo.for _DSRC in ${SRCS:M*.d:N*/*}
131269946Srpaulo.for _D in ${_DSRC:R}
132269946SrpauloDHDRS+=	${_D}.h
133269946Srpaulo${_D}.h: ${_DSRC}
134269946Srpaulo	${DTRACE} -xnolibs -h -s ${.ALLSRC}
135269946SrpauloSRCS:=	${SRCS:S/${_DSRC}/${_D}.h/}
136269946SrpauloOBJS+=	${_D}.o
137269946SrpauloCLEANFILES+= ${_D}.h ${_D}.o
138269946Srpaulo${_D}.o: ${_D}.h ${OBJS:S/${_D}.o//}
139269946Srpaulo	${DTRACE} -xnolibs -G -o ${.TARGET} -s ${.CURDIR}/${_DSRC} \
140269946Srpaulo		${OBJS:S/${_D}.o//}
141269946Srpaulo.if defined(LIB)
142269946SrpauloCLEANFILES+= ${_D}.So ${_D}.po
143269946Srpaulo${_D}.So: ${_D}.h ${SOBJS:S/${_D}.So//}
144269946Srpaulo	${DTRACE} -xnolibs -G -o ${.TARGET} -s ${.CURDIR}/${_DSRC} \
145269946Srpaulo		${SOBJS:S/${_D}.So//}
146269946Srpaulo${_D}.po: ${_D}.h ${POBJS:S/${_D}.po//}
147269946Srpaulo	${DTRACE} -xnolibs -G -o ${.TARGET} -s ${.CURDIR}/${_DSRC} \
148269946Srpaulo		${POBJS:S/${_D}.po//}
149269946Srpaulo.endif
150269324Srpaulo.endfor
151269324Srpaulo.endfor
152269946Srpaulobeforedepend: ${DHDRS}
153269946Srpaulobeforebuild: ${DHDRS}
15435951Sbde.endif
15535951Sbde
1561845Swollman.if !target(depend)
15730113Sjkh.if defined(SRCS)
15895306Srudepend: beforedepend ${DEPENDFILE} afterdepend
15914986Swosch
160241298Smarcel# Tell bmake not to look for generated files via .PATH
161241298Smarcel.NOPATH: ${DEPENDFILE}
162241298Smarcel
163294737Sbdrewery# Capture -include from CFLAGS.
164294737Sbdrewery# This could be simpler with bmake :tW but needs to support fmake for MFC.
165294737Sbdrewery_CFLAGS_INCLUDES= ${CFLAGS:Q:S/\\ /,/g:C/-include,/-include%/g:C/,/ /g:M-include*:C/%/ /g}
166294737Sbdrewery_CXXFLAGS_INCLUDES= ${CXXFLAGS:Q:S/\\ /,/g:C/-include,/-include%/g:C/,/ /g:M-include*:C/%/ /g}
167294737Sbdrewery
16834181Sbde# Different types of sources are compiled with slightly different flags.
16934181Sbde# Split up the sources, and filter out headers and non-applicable flags.
170239613SdimMKDEP_CFLAGS=	${CFLAGS:M-nostdinc*} ${CFLAGS:M-[BIDU]*} ${CFLAGS:M-std=*} \
171294737Sbdrewery		${CFLAGS:M-ansi} ${_CFLAGS_INCLUDES}
172239613SdimMKDEP_CXXFLAGS=	${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BIDU]*} \
173294737Sbdrewery		${CXXFLAGS:M-std=*} ${CXXFLAGS:M-ansi} ${CXXFLAGS:M-stdlib=*} \
174294737Sbdrewery		${_CXXFLAGS_INCLUDES}
175126890Strhodes
176124490SruDPSRCS+= ${SRCS}
177124490Sru${DEPENDFILE}: ${DPSRCS}
17814986Swosch	rm -f ${DEPENDFILE}
179125119Sru.if !empty(DPSRCS:M*.[cS])
18034181Sbde	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
181126890Strhodes	    ${MKDEP_CFLAGS} ${.ALLSRC:M*.[cS]}
18214986Swosch.endif
183125119Sru.if !empty(DPSRCS:M*.cc) || !empty(DPSRCS:M*.C) || !empty(DPSRCS:M*.cpp) || \
184125119Sru    !empty(DPSRCS:M*.cxx)
18514986Swosch	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
186126890Strhodes	    ${MKDEP_CXXFLAGS} \
18736673Sdt	    ${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cpp} ${.ALLSRC:M*.cxx}
18814986Swosch.endif
18924750Sbde.if target(_EXTRADEPEND)
19094922Sru_EXTRADEPEND: .USE
19194841Sru${DEPENDFILE}: _EXTRADEPEND
19224750Sbde.endif
19314986Swosch
19430113Sjkh.ORDER: ${DEPENDFILE} afterdepend
1951845Swollman.else
19695306Srudepend: beforedepend afterdepend
1971845Swollman.endif
1981845Swollman.if !target(beforedepend)
1991845Swollmanbeforedepend:
20030113Sjkh.else
20130113Sjkh.ORDER: beforedepend ${DEPENDFILE}
20230113Sjkh.ORDER: beforedepend afterdepend
2031845Swollman.endif
2041845Swollman.if !target(afterdepend)
2051845Swollmanafterdepend:
2061845Swollman.endif
2071845Swollman.endif
2081845Swollman
20916663Sjkh.if !target(cleandepend)
21095306Srucleandepend:
21128806Sbde.if defined(SRCS)
212202579Sru.if ${CTAGS:T} == "gtags"
213105327Sru	rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS
21424861Sjkh.if defined(HTML)
215105327Sru	rm -rf HTML
21616663Sjkh.endif
217202578Sru.else
218202579Sru	rm -f ${DEPENDFILE} tags
21916663Sjkh.endif
22024861Sjkh.endif
221105327Sru.endif
22299344Sru
22399344Sru.if !target(checkdpadd) && (defined(DPADD) || defined(LDADD))
224273500Sngie_LDADD_FROM_DPADD=	${DPADD:R:T:C;^lib(.*)$;-l\1;g}
225273500Sngie# Ignore -Wl,--start-group/-Wl,--end-group as it might be required in the
226273500Sngie# LDADD list due to unresolved symbols
227273500Sngie_LDADD_CANONICALIZED=	${LDADD:N:R:T:C;^lib(.*)$;-l\1;g:N-Wl,--[es]*-group}
22899344Srucheckdpadd:
229117195Sbde.if ${_LDADD_FROM_DPADD} != ${_LDADD_CANONICALIZED}
230117195Sbde	@echo ${.CURDIR}
231117195Sbde	@echo "DPADD -> ${_LDADD_FROM_DPADD}"
232117195Sbde	@echo "LDADD -> ${_LDADD_CANONICALIZED}"
23399344Sru.endif
234117195Sbde.endif
235