bsd.dep.mk revision 117171
118334Speter# $FreeBSD: head/share/mk/bsd.dep.mk 117171 2003-07-02 16:43:07Z ru $
290075Sobrien#
390075Sobrien# The include file <bsd.dep.mk> handles Makefile dependencies.
418334Speter#
590075Sobrien#
618334Speter# +++ variables +++
790075Sobrien#
890075Sobrien# CTAGS		A tags file generation program [gtags]
990075Sobrien#
1090075Sobrien# CTAGSFLAGS	Options for ctags(1) [not set]
1118334Speter#
1290075Sobrien# DEPENDFILE	dependencies file [.depend]
1390075Sobrien#
1490075Sobrien# GTAGSFLAGS	Options for gtags(1) [-o]
1590075Sobrien#
1618334Speter# HTAGSFLAGS	Options for htags(1) [not set]
1718334Speter#
1890075Sobrien# MKDEP		Options for ${MKDEPCMD} [not set]
1990075Sobrien#
2090075Sobrien# MKDEPCMD	Makefile dependency list program [mkdep]
2118334Speter# 
2290075Sobrien# SRCS          List of source files (c, c++, assembler)
2390075Sobrien#
2490075Sobrien#
2518334Speter# +++ targets +++
2690075Sobrien#
2790075Sobrien#	cleandepend:
2890075Sobrien#		Remove depend and tags file
2990075Sobrien#
3018334Speter#	depend:
3190075Sobrien#		Make the dependencies for the source files, and store
3290075Sobrien#		them in the file ${DEPENDFILE}.
3318334Speter#
3490075Sobrien#	tags:
3590075Sobrien#		In "ctags" mode, create a tags file for the source files.
3618334Speter#		In "gtags" mode, create a (GLOBAL) gtags file for the
3790075Sobrien#		source files.  If HTML is defined, htags(1) is also run
3890075Sobrien#		after gtags(1).
3918334Speter
4090075Sobrien.if !target(__<bsd.init.mk>__)
4190075Sobrien.error bsd.dep.mk cannot be included directly.
4290075Sobrien.endif
4390075Sobrien
4490075SobrienCTAGS?=		gtags
4518334SpeterCTAGSFLAGS?=
4618334SpeterGTAGSFLAGS?=	-o
4790075SobrienHTAGSFLAGS?=
4890075Sobrien
4990075Sobrien.if ${CC} != "cc"
5090075SobrienMKDEPCMD?=	CC='${CC}' mkdep
5190075Sobrien.else
5218334SpeterMKDEPCMD?=	mkdep
5318334Speter.endif
5490075SobrienDEPENDFILE?=	.depend
5590075Sobrien
5690075Sobrien# Keep `tags' here, before SRCS are mangled below for `depend'.
5718334Speter.if !target(tags) && defined(SRCS) && !defined(NOTAGS)
5890075Sobrientags: ${SRCS}
5918334Speter.if ${CTAGS:T} == "ctags"
6018334Speter	@${CTAGS} ${CTAGSFLAGS} -f /dev/stdout \
6190075Sobrien	    ${.ALLSRC:N*.h} | sed "s;${.CURDIR}/;;" > ${.TARGET}
6290075Sobrien.elif ${CTAGS:T} == "gtags"
6390075Sobrien	@cd ${.CURDIR} && ${CTAGS} ${GTAGSFLAGS} ${.OBJDIR}
6490075Sobrien.if defined(HTML)
6590075Sobrien	@cd ${.CURDIR} && htags ${HTAGSFLAGS} -d ${.OBJDIR} ${.OBJDIR}
6650397Sobrien.endif
6750397Sobrien.endif
6890075Sobrien.endif
6990075Sobrien
7090075Sobrien.if defined(SRCS)
7150397SobrienCLEANFILES?=
7290075Sobrien
7350397Sobrien.for _LSRC in ${SRCS:M*.l:N*/*}
7418334Speter.for _LC in ${_LSRC:S/.l/.c/}
7590075Sobrien${_LC}: ${_LSRC}
7690075Sobrien	${LEX} -t ${LFLAGS} ${.ALLSRC} > ${.TARGET}
7790075SobrienSRCS:=	${SRCS:S/${_LSRC}/${_LC}/}
7890075SobrienCLEANFILES:= ${CLEANFILES} ${_LC}
7990075Sobrien.endfor
8090075Sobrien.endfor
8190075Sobrien
8290075Sobrien.for _YSRC in ${SRCS:M*.y:N*/*}
8390075Sobrien.for _YC in ${_YSRC:S/.y/.c/}
8490075SobrienSRCS:=	${SRCS:S/${_YSRC}/${_YC}/}
8590075SobrienCLEANFILES:= ${CLEANFILES} ${_YC}
8690075Sobrien.if ${YFLAGS:M-d} != "" && ${SRCS:My.tab.h}
8790075Sobrien.ORDER: ${_YC} y.tab.h
8890075Sobrien${_YC} y.tab.h: ${_YSRC}
8990075Sobrien	${YACC} ${YFLAGS} ${.ALLSRC}
9090075Sobrien	cp y.tab.c ${_YC}
9190075SobrienSRCS:=	${SRCS} y.tab.h
9290075SobrienCLEANFILES:= ${CLEANFILES} y.tab.c y.tab.h
9390075Sobrien.elif ${YFLAGS:M-d} != ""
9490075Sobrien.for _YH in ${_YC:S/.c/.h/}
9590075Sobrien.ORDER: ${_YC} ${_YH}
9690075Sobrien${_YC} ${_YH}: ${_YSRC}
9790075Sobrien	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
9890075SobrienSRCS:=	${SRCS} ${_YH}
9990075SobrienCLEANFILES:= ${CLEANFILES} ${_YH}
10090075Sobrien.endfor
10190075Sobrien.else
10290075Sobrien${_YC}: ${_YSRC}
10390075Sobrien	${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC}
10490075Sobrien.endif
10590075Sobrien.endfor
10690075Sobrien.endfor
10790075Sobrien.endif
10890075Sobrien
10990075Sobrien.if !target(depend)
11090075Sobrien.if defined(SRCS)
11190075Sobriendepend: beforedepend ${DEPENDFILE} afterdepend
11290075Sobrien
11390075Sobrien# Different types of sources are compiled with slightly different flags.
11418334Speter# Split up the sources, and filter out headers and non-applicable flags.
11590075Sobrien${DEPENDFILE}: ${SRCS}
11690075Sobrien	rm -f ${DEPENDFILE}
11750397Sobrien.if ${SRCS:M*.[cS]} != ""
11890075Sobrien	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
11918334Speter	    ${CFLAGS:M-nostdinc*} ${CFLAGS:M-[BID]*} \
12090075Sobrien	    ${.ALLSRC:M*.[cS]}
12118334Speter.endif
12290075Sobrien.if ${SRCS:M*.cc} != "" || ${SRCS:M*.C} != "" || ${SRCS:M*.cpp} != "" || \
12390075Sobrien    ${SRCS:M*.cxx} != ""
12490075Sobrien	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
12518334Speter	    ${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BID]*} \
12690075Sobrien	    ${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cpp} ${.ALLSRC:M*.cxx}
12790075Sobrien.endif
12890075Sobrien.if ${SRCS:M*.m} != ""
12918334Speter	${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \
13090075Sobrien	    ${OBJCFLAGS:M-nostdinc*} ${OBJCFLAGS:M-[BID]*} \
13190075Sobrien	    ${OBJCFLAGS:M-Wno-import*} \
13252284Sobrien	    ${.ALLSRC:M*.m}
13318334Speter.endif
13490075Sobrien.if target(_EXTRADEPEND)
13518334Speter_EXTRADEPEND: .USE
13690075Sobrien${DEPENDFILE}: _EXTRADEPEND
13718334Speter.endif
13890075Sobrien
13918334Speter.ORDER: ${DEPENDFILE} afterdepend
14090075Sobrien.else
14118334Speterdepend: beforedepend afterdepend
14290075Sobrien.endif
14318334Speter.if !target(beforedepend)
14490075Sobrienbeforedepend:
14518334Speter.else
14690075Sobrien.ORDER: beforedepend ${DEPENDFILE}
14718334Speter.ORDER: beforedepend afterdepend
14818334Speter.endif
14918334Speter.if !target(afterdepend)
15018334Speterafterdepend:
15118334Speter.endif
15218334Speter.endif
15318334Speter
15418334Speter.if !target(cleandepend)
15518334Spetercleandepend:
15618334Speter.if defined(SRCS)
15718334Speter.if ${CTAGS:T} == "ctags"
15890075Sobrien	rm -f ${DEPENDFILE} tags
15918334Speter.elif ${CTAGS:T} == "gtags"
16018334Speter	rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS
16118334Speter.if defined(HTML)
16218334Speter	rm -rf HTML
16318334Speter.endif
16418334Speter.endif
16518334Speter.endif
16618334Speter.endif
16750397Sobrien
16818334Speter.if !target(checkdpadd) && (defined(DPADD) || defined(LDADD))
16918334Spetercheckdpadd:
17090075Sobrien	@ldadd=`echo \`for lib in ${DPADD} ; do \
17190075Sobrien		echo $$lib | sed 's;^/usr/lib/lib\(.*\)\.a;-l\1;' ; \
17218334Speter	done \`` ; \
17318334Speter	ldadd1=`echo ${LDADD}` ; \
17418334Speter	if [ "$$ldadd" != "$$ldadd1" ] ; then \
17518334Speter		echo ${.CURDIR} ; \
17618334Speter		echo "DPADD -> $$ldadd" ; \
17718334Speter		echo "LDADD -> $$ldadd1" ; \
17818334Speter	fi
17918334Speter.endif
18018334Speter