autodep.mk revision 302408
1272209Sandrew#
2272209Sandrew# RCSid:
3272209Sandrew#	$Id: autodep.mk,v 1.36 2016/04/05 15:58:37 sjg Exp $
4272209Sandrew#
5272209Sandrew#	@(#) Copyright (c) 1999-2010, Simon J. Gerraty
6272209Sandrew#
7272209Sandrew#	This file is provided in the hope that it will
8272209Sandrew#	be of use.  There is absolutely NO WARRANTY.
9272209Sandrew#	Permission to copy, redistribute or otherwise
10272209Sandrew#	use this file is hereby granted provided that 
11272209Sandrew#	the above copyright notice and this notice are
12272209Sandrew#	left intact. 
13272209Sandrew#      
14272209Sandrew#	Please send copies of changes and bug-fixes to:
15272209Sandrew#	sjg@crufty.net
16272209Sandrew
17272209Sandrew# This module provides automagic dependency generation along the
18272209Sandrew# lines suggested in the GNU make.info
19272209Sandrew# The depend target is mainly for backwards compatibility,
20272209Sandrew# dependencies are normally updated as part of compilation.
21272209Sandrew
22272209Sandrew.if !target(__${.PARSEFILE}__)
23272209Sandrew__${.PARSEFILE}__:
24272209Sandrew
25272209SandrewDEPENDFILE?= .depend
26272209Sandrew.for d in ${DEPENDFILE:N.depend}
27272209Sandrew# bmake only groks .depend
28272209Sandrew.if ${MAKE_VERSION} < 20160218
29272209Sandrew.-include <$d>
30272209Sandrew.else
31272209Sandrew.dinclude <$d>
32272209Sandrew.endif
33272209Sandrew.endfor
34272209Sandrew
35272209Sandrew# it does nothing if SRCS is not defined or is empty
36272209Sandrew.if defined(SRCS) && !empty(SRCS)
37272209SandrewDEPSRCS?=${SRCS}
38272209Sandrew__depsrcs=${DEPSRCS:M*.c}
39272209Sandrew__depsrcs+=${DEPSRCS:M*.y}
40272209Sandrew__depsrcs+=${DEPSRCS:M*.l}
41272209Sandrew__depsrcs+=${DEPSRCS:M*.s}
42272209Sandrew__depsrcs+=${DEPSRCS:M*.S}
43272209Sandrew__depsrcs+=${DEPSRCS:M*.cc}
44272209Sandrew__depsrcs+=${DEPSRCS:M*.cpp}
45272209Sandrew__depsrcs+=${DEPSRCS:M*.C}
46272209Sandrew__depsrcs+=${DEPSRCS:M*.cxx}
47272209Sandrew__depsrcs+=${DEPSRCS:M*.pc}
48272209Sandrew
49272209Sandrew.for s in ${__depsrcs}
50272209Sandrew${s:T:R}.d:	$s
51272209Sandrew.endfor
52272209Sandrew
53272209Sandrew__depsrcs:=${__depsrcs:T:R:S/$/.d/g}
54272209Sandrew# we also need to handle makefiles where the .d's from __depsrcs 
55272209Sandrew# don't  match those from OBJS
56272209Sandrew# we avoid using := here, since the modifier applied to OBJS
57272209Sandrew# can cause trouble if there are any undefined vars in OBJS.
58272209Sandrew__dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/}
59272209Sandrew__dependsrcs= ${__dependsrcsx:O:u}
60272209Sandrew
61272209Sandrew# clean up any .c files we may have generated
62272209Sandrew#__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l}
63272209Sandrew#CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g}
64272209Sandrew
65272209Sandrew# set this to -MMD to ignore /usr/include
66272209Sandrew# actually it ignores <> so may not be a great idea
67272209SandrewCFLAGS_MD?=-MD 
68272209Sandrew# -MF etc not available on all gcc versions.
69272209Sandrew# we "fix" the .o later
70272209SandrewCFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o
71272209SandrewCFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF}
72272209SandrewRM?= rm
73272209Sandrew
74272209Sandrew# watch out for people who don't use CPPFLAGS
75272209SandrewCPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} 
76272209SandrewCXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} 
77272209Sandrew
78272209Sandrew# just in case these need to be different
79272209SandrewCC_MD?=${CC}
80272209SandrewCXX_MD?=${CXX}
81272209Sandrew
82272209Sandrew# should have been set by sys.mk
83272209SandrewCXX_SUFFIXES?= .cc .cpp .cxx .C
84272209Sandrew
85272209Sandrew# so we can do an explicit make depend, but not otherwise
86272209Sandrew.if make(depend)
87272209Sandrew.SUFFIXES:	.d
88272209Sandrew
89272209Sandrew.if empty(CFLAGS_MD)
90272209Sandrew.y.d:
91272209Sandrew	@echo updating dependencies for $<
92272209Sandrew	@${YACC} ${YFLAGS} $<
93272209Sandrew	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; }
94272209Sandrew	@${RM} -f y.tab.c
95272209Sandrew
96272209Sandrew.l.d:
97272209Sandrew	@echo updating dependencies for $<
98272209Sandrew	${LEX} ${LFLAGS} $<
99272209Sandrew	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; }
100272209Sandrew	@${RM} -f lex.yy.c
101272209Sandrew
102272209Sandrew.c.d:
103272209Sandrew	@echo updating dependencies for $<
104272209Sandrew	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
105272209Sandrew
106272209Sandrew.s.d .S.d:
107272209Sandrew	@echo updating dependencies for $<
108272209Sandrew	@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
109272209Sandrew
110272209Sandrew${CXX_SUFFIXES:%=%.d}:
111272209Sandrew	@echo updating dependencies for $<
112272209Sandrew	@${SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
113272209Sandrew.else
114272209Sandrew.y.d:
115272209Sandrew	${YACC} ${YFLAGS} $<
116272209Sandrew	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; }
117272209Sandrew	${RM} -f y.tab.c
118272209Sandrew
119272209Sandrew.l.d:
120272209Sandrew	${LEX} ${LFLAGS} $<
121272209Sandrew	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; }
122272209Sandrew	${RM} -f lex.yy.c
123272209Sandrew
124272209Sandrew.c.d:
125272209Sandrew	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
126272209Sandrew
127272209Sandrew.s.d .S.d:
128272209Sandrew	${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; }
129272209Sandrew
130272209Sandrew${CXX_SUFFIXES:%=%.d}:
131272209Sandrew	${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
132272209Sandrew.endif
133272209Sandrew
134272209Sandrew.if !target(depend)
135272209Sandrewdepend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE
136272209Sandrew
137272209Sandrew${DEPENDFILE}:	${DEPSRCS} ${__dependsrcs}
138272209Sandrew.NOPATH:	${__dependsrcs}
139272209Sandrew.OPTIONAL:	${__dependsrcs}
140272209Sandrew.endif
141272209Sandrew.endif				# make(depend)
142272209Sandrew
143272209Sandrew.if empty(CFLAGS_MD)
144272209Sandrew# make sure the .d's are generated/updated
145272209Sandrew${PROG} ${_LIBS}:	${DEPENDFILE}
146272209Sandrew.endif
147272209Sandrew
148272209Sandrew.ORDER:	beforedepend ${DEPENDFILE} afterdepend
149272209Sandrew
150272209Sandrew.if ${.OBJDIR} != ${.CURDIR}
151272209Sandrew__depfiles= *.d
152272209Sandrew.else
153272209Sandrew__depfiles= ${__dependsrcs}
154272209Sandrew.endif
155272209Sandrew
156272209SandrewDEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d
157272209Sandrew
158272209Sandrewcleandir: cleanautodepend
159272209Sandrewcleanautodepend:
160272209Sandrew	${RM} -f ${DEPCLEANFILES}
161272209Sandrew
162272209SandrewCLEANFILES+= ${DEPCLEANFILES}
163272209Sandrew
164272209Sandrew.if defined(__dependsrcs) && !empty(__dependsrcs)
165272209Sandrew.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*))
166272209Sandrew# this ensures we do the right thing if only building a shared or
167272209Sandrew# profiled lib
168272209SandrewOBJ_EXTENSIONS?=.o .po .so .So
169272209SandrewMDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},'
170272209Sandrew.ifdef NOMD_SED
171272209Sandrew.ifdef LIB
172272209SandrewMD_SED=sed ${MDLIB_SED}
173272209Sandrew.else
174272209SandrewMD_SED=cat
175272209Sandrew.endif
176272209Sandrew.else
177272209Sandrew# arrange to put some variable names into ${DEPENDFILE}
178272209Sandrew.ifdef LIB
179272209SandrewMD_SED=sed ${MDLIB_SED}
180272209Sandrew.else
181272209SandrewMD_SED=sed
182272209Sandrew.endif
183272209SandrewSUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR
184272209Sandrew.for v in ${SUBST_DEPVARS}
185272209Sandrew.if defined(${v}) && !empty(${v})
186272209SandrewMD_SED+= -e 's,${$v},$${$v},'
187272209Sandrew.endif
188272209Sandrew.endfor
189272209Sandrew.endif
190272209Sandrew.if (${MD_SED} == "sed")
191272209SandrewMD_SED=cat
192272209Sandrew.endif
193272209Sandrew
194272209Sandrew# this will be done whenever make finishes successfully
195272209Sandrew.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530
196272209Sandrew.END:
197272209Sandrew.else
198272209Sandrew.END:	${DEPENDFILE}
199272209Sandrew# we do not want to trigger building .d's just use them if they exist
200272209Sandrew${DEPENDFILE}:	${__dependsrcs:@d@${exists($d):?$d:}@}
201272209Sandrew.endif
202272209Sandrew	-@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \
203272209Sandrew	test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \
204272209Sandrew	${RM} -f ${DEPENDFILE}.new
205272209Sandrew.endif
206272209Sandrew.endif
207272209Sandrew.else
208272209Sandrewdepend: beforedepend afterdepend _SUBDIRUSE
209272209Sandrew.endif
210272209Sandrew
211272209Sandrew.if !target(beforedepend)
212272209Sandrewbeforedepend:
213272209Sandrew.endif
214272209Sandrew.if !target(afterdepend)
215272209Sandrewafterdepend:
216272209Sandrew.endif
217272209Sandrew
218272209Sandrew.endif
219272209Sandrew