bsd.dep.mk revision 240006
1139743Simp# $FreeBSD: stable/9/share/mk/bsd.dep.mk 240006 2012-09-02 11:44:30Z dim $
239213Sgibbs#
339213Sgibbs# The include file <bsd.dep.mk> handles Makefile dependencies.
439213Sgibbs#
539213Sgibbs#
639213Sgibbs# +++ variables +++
739213Sgibbs#
839213Sgibbs# CTAGS		A tags file generation program [gtags]
939213Sgibbs#
1039213Sgibbs# CTAGSFLAGS	Options for ctags(1) [not set]
1139213Sgibbs#
1239213Sgibbs# DEPENDFILE	dependencies file [.depend]
1339213Sgibbs#
1439213Sgibbs# GTAGSFLAGS	Options for gtags(1) [-o]
1539213Sgibbs#
1639213Sgibbs# HTAGSFLAGS	Options for htags(1) [not set]
1739213Sgibbs#
1839213Sgibbs# MKDEP		Options for ${MKDEPCMD} [not set]
1939213Sgibbs#
2039213Sgibbs# MKDEPCMD	Makefile dependency list program [mkdep]
2139213Sgibbs#
2239213Sgibbs# SRCS          List of source files (c, c++, assembler)
2339213Sgibbs#
2439213Sgibbs# DPSRCS	List of source files which are needed for generating
2539213Sgibbs#		dependencies, ${SRCS} are always part of it.
2639213Sgibbs#
2739213Sgibbs# +++ targets +++
2839213Sgibbs#
29116162Sobrien#	cleandepend:
30116162Sobrien#		Remove depend and tags file
31116162Sobrien#
3239213Sgibbs#	depend:
3360767Sken#		Make the dependencies for the source files, and store
3460767Sken#		them in the file ${DEPENDFILE}.
3539213Sgibbs#
3639213Sgibbs#	tags:
3760041Sphk#		In "ctags" mode, create a tags file for the source files.
3879483Smjacob#		In "gtags" mode, create a (GLOBAL) gtags file for the
39119718Sken#		source files.  If HTML is defined, htags(1) is also run
40168752Sscottl#		after gtags(1).
41168752Sscottl
42168982Sscottl.if !target(__<bsd.init.mk>__)
4339213Sgibbs.error bsd.dep.mk cannot be included directly.
4450107Smsmith.endif
4539213Sgibbs
4649558SphkCTAGS?=		gtags
47249939SsmhCTAGSFLAGS?=
48251792SmavGTAGSFLAGS?=	-o
49300207SkenHTAGSFLAGS?=
50223089Sgibbs
51112946Sphk.if ${CC} != "cc"
52168982SscottlMKDEPCMD?=	CC='${CC}' mkdep
53112946Sphk.else
5460767SkenMKDEPCMD?=	mkdep
5560767Sken.endif
5660767SkenDEPENDFILE?=	.depend
5760767Sken
5860767Sken# Keep `tags' here, before SRCS are mangled below for `depend'.
5939213Sgibbs.if !target(tags) && defined(SRCS) && !defined(NO_TAGS)
6039213Sgibbstags: ${SRCS}
6139213Sgibbs.if ${CTAGS:T} == "gtags"
6239213Sgibbs	@cd ${.CURDIR} && ${CTAGS} ${GTAGSFLAGS} ${.OBJDIR}
63168752Sscottl.if defined(HTML)
64298002Simp	@cd ${.CURDIR} && htags ${HTAGSFLAGS} -d ${.OBJDIR} ${.OBJDIR}
6539213Sgibbs.endif
6639213Sgibbs.else
6760767Sken	@${CTAGS} ${CTAGSFLAGS} -f /dev/stdout \
6860767Sken	    ${.ALLSRC:N*.h} | sed "s;${.CURDIR}/;;" > ${.TARGET}
6960767Sken.endif
70300207Sken.endif
71300207Sken
72300207Sken.if defined(SRCS)
73300207SkenCLEANFILES?=
74300207Sken
75300207Sken.if !exists(${.OBJDIR}/${DEPENDFILE})
76300207Sken.for _S in ${SRCS:N*.[hly]}
77300207Sken${_S:R}.o: ${_S}
78300207Sken.endfor
79300207Sken.endif
80300207Sken
8139213Sgibbs.for _LSRC in ${SRCS:M*.l:N*/*}
82249939Ssmh.for _LC in ${_LSRC:R}.c
83249939Ssmh${_LC}: ${_LSRC}
84249939Ssmh	${LEX} -t ${LFLAGS} ${.ALLSRC} > ${.TARGET}
85249939Ssmh.if !exists(${.OBJDIR}/${DEPENDFILE})
86249941Ssmh${_LC:R}.o: ${_LC}
87249939Ssmh.endif
88300207SkenSRCS:=	${SRCS:S/${_LSRC}/${_LC}/}
89300207SkenCLEANFILES+= ${_LC}
90300207Sken.endfor
91300207Sken.endfor
92300207Sken
9339213Sgibbs.for _YSRC in ${SRCS:M*.y:N*/*}
9439213Sgibbs.for _YC in ${_YSRC:R}.c
9539213SgibbsSRCS:=	${SRCS:S/${_YSRC}/${_YC}/}
9639213SgibbsCLEANFILES+= ${_YC}
97300207Sken.if !empty(YFLAGS:M-d) && !empty(SRCS:My.tab.h)
98300207Sken.ORDER: ${_YC} y.tab.h
99300207Sken${_YC} y.tab.h: ${_YSRC}
100300207Sken	${YACC} ${YFLAGS} ${.ALLSRC}
101300207Sken	cp y.tab.c ${_YC}
102300207SkenCLEANFILES+= y.tab.c y.tab.h
103300207Sken.elif !empty(YFLAGS:M-d)
104300207Sken.for _YH in ${_YC:R}.h
105300207Sken.ORDER: ${_YC} ${_YH}
106300207Sken${_YC} ${_YH}: ${_YSRC}
107300207Sken	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
108300207SkenSRCS+=	${_YH}
109300207SkenCLEANFILES+= ${_YH}
110300207Sken.endfor
111300207Sken.else
112300207Sken${_YC}: ${_YSRC}
113300207Sken	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
114300207Sken.endif
11539213Sgibbs.if !exists(${.OBJDIR}/${DEPENDFILE})
11639213Sgibbs${_YC:R}.o: ${_YC}
11739213Sgibbs.endif
11840051Sken.endfor
11941458Sken.endfor
120119308Snjl.endif
121228820Smav
122253803Smav.if !target(depend)
123264834Smav.if defined(SRCS)
124278111Smavdepend: beforedepend ${DEPENDFILE} afterdepend
125300207Sken
126300207Sken# Different types of sources are compiled with slightly different flags.
12740051Sken# Split up the sources, and filter out headers and non-applicable flags.
12840051SkenMKDEP_CFLAGS=	${CFLAGS:M-nostdinc*} ${CFLAGS:M-[BIDU]*} ${CFLAGS:M-std=*} \
129250792Ssmh		${CFLAGS:M-ansi}
130250792SsmhMKDEP_CXXFLAGS=	${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BIDU]*} \
131250792Ssmh		${CXXFLAGS:M-std=*} ${CXXFLAGS:M-ansi} ${CXXFLAGS:M-stdlib=*}
132250792Ssmh
133250792SsmhDPSRCS+= ${SRCS}
134253803Smav${DEPENDFILE}: ${DPSRCS}
135278111Smav	rm -f ${DEPENDFILE}
136278111Smav.if !empty(DPSRCS:M*.[cS])
137300207Sken	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
138300207Sken	    ${MKDEP_CFLAGS} ${.ALLSRC:M*.[cS]}
139250792Ssmh.endif
14040051Sken.if !empty(DPSRCS:M*.cc) || !empty(DPSRCS:M*.C) || !empty(DPSRCS:M*.cpp) || \
141249939Ssmh    !empty(DPSRCS:M*.cxx)
142249939Ssmh	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
143249939Ssmh	    ${MKDEP_CXXFLAGS} \
144249939Ssmh	    ${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cpp} ${.ALLSRC:M*.cxx}
145249941Ssmh.endif
146249941Ssmh.if target(_EXTRADEPEND)
147249941Ssmh_EXTRADEPEND: .USE
148249941Ssmh${DEPENDFILE}: _EXTRADEPEND
149249941Ssmh.endif
150249941Ssmh
151300207Sken.ORDER: ${DEPENDFILE} afterdepend
152300207Sken.else
153300207Skendepend: beforedepend afterdepend
154300207Sken.endif
155300207Sken.if !target(beforedepend)
156300207Skenbeforedepend:
157300207Sken.else
15839213Sgibbs.ORDER: beforedepend ${DEPENDFILE}
15939213Sgibbs.ORDER: beforedepend afterdepend
160249939Ssmh.endif
161249939Ssmh.if !target(afterdepend)
162249939Ssmhafterdepend:
163249939Ssmh.endif
164249939Ssmh.endif
165249939Ssmh
166249939Ssmh.if !target(cleandepend)
167249939Ssmhcleandepend:
168249939Ssmh.if defined(SRCS)
169230053Smav.if ${CTAGS:T} == "gtags"
170230053Smav	rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS
171230053Smav.if defined(HTML)
172249939Ssmh	rm -rf HTML
173249939Ssmh.endif
174249939Ssmh.else
175249939Ssmh	rm -f ${DEPENDFILE} tags
176230053Smav.endif
177250183Ssmh.endif
178249939Ssmh.endif
179230053Smav
180230053Smav.if !target(checkdpadd) && (defined(DPADD) || defined(LDADD))
181300207Sken_LDADD_FROM_DPADD=	${DPADD:C;^/usr/lib/lib(.*)\.a$;-l\1;}
182300207Sken_LDADD_CANONICALIZED=	${LDADD:S/$//}
183300207Skencheckdpadd:
184300207Sken.if ${_LDADD_FROM_DPADD} != ${_LDADD_CANONICALIZED}
185300207Sken	@echo ${.CURDIR}
186300207Sken	@echo "DPADD -> ${_LDADD_FROM_DPADD}"
187300207Sken	@echo "LDADD -> ${_LDADD_CANONICALIZED}"
188300207Sken.endif
189300207Sken.endif
190300207Sken