1246149Ssjg#
2246149Ssjg# RCSid:
3321964Ssjg#	$Id: autodep.mk,v 1.36 2016/04/05 15:58:37 sjg Exp $
4246149Ssjg#
5246149Ssjg#	@(#) Copyright (c) 1999-2010, Simon J. Gerraty
6246149Ssjg#
7246149Ssjg#	This file is provided in the hope that it will
8246149Ssjg#	be of use.  There is absolutely NO WARRANTY.
9246149Ssjg#	Permission to copy, redistribute or otherwise
10246149Ssjg#	use this file is hereby granted provided that 
11246149Ssjg#	the above copyright notice and this notice are
12246149Ssjg#	left intact. 
13246149Ssjg#      
14246149Ssjg#	Please send copies of changes and bug-fixes to:
15246149Ssjg#	sjg@crufty.net
16246149Ssjg
17246149Ssjg# This module provides automagic dependency generation along the
18246149Ssjg# lines suggested in the GNU make.info
19276305Sngie# The depend target is mainly for backwards compatibility,
20246149Ssjg# dependencies are normally updated as part of compilation.
21246149Ssjg
22246149Ssjg.if !target(__${.PARSEFILE}__)
23246149Ssjg__${.PARSEFILE}__:
24246149Ssjg
25246149SsjgDEPENDFILE?= .depend
26246149Ssjg.for d in ${DEPENDFILE:N.depend}
27246149Ssjg# bmake only groks .depend
28321964Ssjg.if ${MAKE_VERSION} < 20160218
29321964Ssjg.-include <$d>
30321964Ssjg.else
31321964Ssjg.dinclude <$d>
32321964Ssjg.endif
33246149Ssjg.endfor
34246149Ssjg
35246149Ssjg# it does nothing if SRCS is not defined or is empty
36246149Ssjg.if defined(SRCS) && !empty(SRCS)
37246149SsjgDEPSRCS?=${SRCS}
38246149Ssjg__depsrcs=${DEPSRCS:M*.c}
39246149Ssjg__depsrcs+=${DEPSRCS:M*.y}
40246149Ssjg__depsrcs+=${DEPSRCS:M*.l}
41246149Ssjg__depsrcs+=${DEPSRCS:M*.s}
42246149Ssjg__depsrcs+=${DEPSRCS:M*.S}
43246149Ssjg__depsrcs+=${DEPSRCS:M*.cc}
44246149Ssjg__depsrcs+=${DEPSRCS:M*.cpp}
45246149Ssjg__depsrcs+=${DEPSRCS:M*.C}
46246149Ssjg__depsrcs+=${DEPSRCS:M*.cxx}
47246149Ssjg__depsrcs+=${DEPSRCS:M*.pc}
48246149Ssjg
49246149Ssjg.for s in ${__depsrcs}
50246149Ssjg${s:T:R}.d:	$s
51246149Ssjg.endfor
52246149Ssjg
53246149Ssjg__depsrcs:=${__depsrcs:T:R:S/$/.d/g}
54246149Ssjg# we also need to handle makefiles where the .d's from __depsrcs 
55246149Ssjg# don't  match those from OBJS
56246149Ssjg# we avoid using := here, since the modifier applied to OBJS
57246149Ssjg# can cause trouble if there are any undefined vars in OBJS.
58246149Ssjg__dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/}
59246149Ssjg__dependsrcs= ${__dependsrcsx:O:u}
60246149Ssjg
61246149Ssjg# clean up any .c files we may have generated
62246149Ssjg#__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l}
63246149Ssjg#CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g}
64246149Ssjg
65246149Ssjg# set this to -MMD to ignore /usr/include
66246149Ssjg# actually it ignores <> so may not be a great idea
67246149SsjgCFLAGS_MD?=-MD 
68246149Ssjg# -MF etc not available on all gcc versions.
69246149Ssjg# we "fix" the .o later
70246149SsjgCFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o
71246149SsjgCFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF}
72246149SsjgRM?= rm
73246149Ssjg
74246149Ssjg# watch out for people who don't use CPPFLAGS
75246149SsjgCPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} 
76246149SsjgCXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} 
77246149Ssjg
78246149Ssjg# just in case these need to be different
79246149SsjgCC_MD?=${CC}
80246149SsjgCXX_MD?=${CXX}
81246149Ssjg
82321964Ssjg# should have been set by sys.mk
83321964SsjgCXX_SUFFIXES?= .cc .cpp .cxx .C
84321964Ssjg
85246149Ssjg# so we can do an explicit make depend, but not otherwise
86246149Ssjg.if make(depend)
87246149Ssjg.SUFFIXES:	.d
88246149Ssjg
89246149Ssjg.if empty(CFLAGS_MD)
90246149Ssjg.y.d:
91246149Ssjg	@echo updating dependencies for $<
92246149Ssjg	@${YACC} ${YFLAGS} $<
93246149Ssjg	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; }
94246149Ssjg	@${RM} -f y.tab.c
95246149Ssjg
96246149Ssjg.l.d:
97246149Ssjg	@echo updating dependencies for $<
98246149Ssjg	${LEX} ${LFLAGS} $<
99246149Ssjg	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; }
100246149Ssjg	@${RM} -f lex.yy.c
101246149Ssjg
102246149Ssjg.c.d:
103246149Ssjg	@echo updating dependencies for $<
104246149Ssjg	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
105246149Ssjg
106246149Ssjg.s.d .S.d:
107246149Ssjg	@echo updating dependencies for $<
108246149Ssjg	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
109246149Ssjg
110321964Ssjg${CXX_SUFFIXES:%=%.d}:
111246149Ssjg	@echo updating dependencies for $<
112246149Ssjg	@${SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
113246149Ssjg.else
114246149Ssjg.y.d:
115246149Ssjg	${YACC} ${YFLAGS} $<
116246149Ssjg	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; }
117246149Ssjg	${RM} -f y.tab.c
118246149Ssjg
119246149Ssjg.l.d:
120246149Ssjg	${LEX} ${LFLAGS} $<
121246149Ssjg	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; }
122246149Ssjg	${RM} -f lex.yy.c
123246149Ssjg
124246149Ssjg.c.d:
125246149Ssjg	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
126246149Ssjg
127246149Ssjg.s.d .S.d:
128246149Ssjg	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; }
129246149Ssjg
130321964Ssjg${CXX_SUFFIXES:%=%.d}:
131246149Ssjg	${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
132246149Ssjg.endif
133246149Ssjg
134246149Ssjg.if !target(depend)
135246149Ssjgdepend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE
136246149Ssjg
137246149Ssjg${DEPENDFILE}:	${DEPSRCS} ${__dependsrcs}
138246149Ssjg.NOPATH:	${__dependsrcs}
139246149Ssjg.OPTIONAL:	${__dependsrcs}
140246149Ssjg.endif
141246149Ssjg.endif				# make(depend)
142246149Ssjg
143246149Ssjg.if empty(CFLAGS_MD)
144246149Ssjg# make sure the .d's are generated/updated
145246149Ssjg${PROG} ${_LIBS}:	${DEPENDFILE}
146246149Ssjg.endif
147246149Ssjg
148246149Ssjg.ORDER:	beforedepend ${DEPENDFILE} afterdepend
149246149Ssjg
150246149Ssjg.if ${.OBJDIR} != ${.CURDIR}
151246149Ssjg__depfiles= *.d
152246149Ssjg.else
153246149Ssjg__depfiles= ${__dependsrcs}
154246149Ssjg.endif
155246149Ssjg
156246149SsjgDEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d
157246149Ssjg
158246149Ssjgcleandir: cleanautodepend
159246149Ssjgcleanautodepend:
160246149Ssjg	${RM} -f ${DEPCLEANFILES}
161246149Ssjg
162246149SsjgCLEANFILES+= ${DEPCLEANFILES}
163246149Ssjg
164246149Ssjg.if defined(__dependsrcs) && !empty(__dependsrcs)
165246149Ssjg.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*))
166246149Ssjg# this ensures we do the right thing if only building a shared or
167246149Ssjg# profiled lib
168246149SsjgOBJ_EXTENSIONS?=.o .po .so .So
169246149SsjgMDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},'
170246149Ssjg.ifdef NOMD_SED
171246149Ssjg.ifdef LIB
172246149SsjgMD_SED=sed ${MDLIB_SED}
173246149Ssjg.else
174246149SsjgMD_SED=cat
175246149Ssjg.endif
176246149Ssjg.else
177246149Ssjg# arrange to put some variable names into ${DEPENDFILE}
178246149Ssjg.ifdef LIB
179246149SsjgMD_SED=sed ${MDLIB_SED}
180246149Ssjg.else
181246149SsjgMD_SED=sed
182246149Ssjg.endif
183246149SsjgSUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR
184246149Ssjg.for v in ${SUBST_DEPVARS}
185246149Ssjg.if defined(${v}) && !empty(${v})
186246149SsjgMD_SED+= -e 's,${$v},$${$v},'
187246149Ssjg.endif
188246149Ssjg.endfor
189246149Ssjg.endif
190246149Ssjg.if (${MD_SED} == "sed")
191246149SsjgMD_SED=cat
192246149Ssjg.endif
193246149Ssjg
194246149Ssjg# this will be done whenever make finishes successfully
195246149Ssjg.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530
196246149Ssjg.END:
197246149Ssjg.else
198246149Ssjg.END:	${DEPENDFILE}
199246149Ssjg# we do not want to trigger building .d's just use them if they exist
200246149Ssjg${DEPENDFILE}:	${__dependsrcs:@d@${exists($d):?$d:}@}
201246149Ssjg.endif
202246149Ssjg	-@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \
203246149Ssjg	test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \
204246149Ssjg	${RM} -f ${DEPENDFILE}.new
205246149Ssjg.endif
206246149Ssjg.endif
207246149Ssjg.else
208246149Ssjgdepend: beforedepend afterdepend _SUBDIRUSE
209246149Ssjg.endif
210246149Ssjg
211246149Ssjg.if !target(beforedepend)
212246149Ssjgbeforedepend:
213246149Ssjg.endif
214246149Ssjg.if !target(afterdepend)
215246149Ssjgafterdepend:
216246149Ssjg.endif
217246149Ssjg
218246149Ssjg.endif
219