]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bmake/mk/autodep.mk
Update to bmake-20200902
[FreeBSD/FreeBSD.git] / contrib / bmake / mk / autodep.mk
1 #
2 # RCSid:
3 #       $Id: autodep.mk,v 1.38 2020/08/19 17:51:53 sjg Exp $
4 #
5 #       @(#) Copyright (c) 1999-2010, Simon J. Gerraty
6 #
7 #       This file is provided in the hope that it will
8 #       be of use.  There is absolutely NO WARRANTY.
9 #       Permission to copy, redistribute or otherwise
10 #       use this file is hereby granted provided that
11 #       the above copyright notice and this notice are
12 #       left intact.
13 #
14 #       Please send copies of changes and bug-fixes to:
15 #       sjg@crufty.net
16
17 # This module provides automagic dependency generation along the
18 # lines suggested in the GNU make.info
19 # The depend target is mainly for backwards compatibility,
20 # dependencies are normally updated as part of compilation.
21
22 .if !target(__${.PARSEFILE}__)
23 __${.PARSEFILE}__:
24
25 DEPENDFILE?= .depend
26 .for d in ${DEPENDFILE:N.depend}
27 # bmake only groks .depend
28 .if ${MAKE_VERSION} < 20160218
29 .-include <$d>
30 .else
31 .dinclude <$d>
32 .endif
33 .endfor
34
35 # it does nothing if SRCS is not defined or is empty
36 .if defined(SRCS) && !empty(SRCS)
37 DEPSRCS?=${SRCS}
38 __depsrcs=${DEPSRCS:M*.c}
39 __depsrcs+=${DEPSRCS:M*.y}
40 __depsrcs+=${DEPSRCS:M*.l}
41 __depsrcs+=${DEPSRCS:M*.s}
42 __depsrcs+=${DEPSRCS:M*.S}
43 __depsrcs+=${DEPSRCS:M*.cc}
44 __depsrcs+=${DEPSRCS:M*.cpp}
45 __depsrcs+=${DEPSRCS:M*.C}
46 __depsrcs+=${DEPSRCS:M*.cxx}
47 __depsrcs+=${DEPSRCS:M*.pc}
48
49 .for s in ${__depsrcs}
50 ${s:T:R}.d:     $s
51 .endfor
52
53 __depsrcs:=${__depsrcs:T:R:S/$/.d/g}
54 # we also need to handle makefiles where the .d's from __depsrcs
55 # don't  match those from OBJS
56 # we avoid using := here, since the modifier applied to OBJS
57 # can cause trouble if there are any undefined vars in OBJS.
58 __dependsrcsx?= ${__depsrcs} ${OBJS:S/.o/.d/}
59 __dependsrcs= ${__dependsrcsx:O:u}
60
61 # clean up any .c files we may have generated
62 #__gensrcs:= ${DEPSRCS:M*.y} ${DEPSRCS:M*.l}
63 #CLEANFILES+= ${__gensrcs:T:R:S/$/.c/g}
64
65 # set this to -MMD to ignore /usr/include
66 # actually it ignores <> so may not be a great idea
67 CFLAGS_MD?=-MD
68 # -MF etc not available on all gcc versions.
69 # we "fix" the .o later
70 CFLAGS_MF?=-MF ${.TARGET:T:R}.d -MT ${.TARGET:T:R}.o
71 CFLAGS+= ${CFLAGS_MD} ${CFLAGS_MF}
72 RM?= rm
73 MAKE_SHELL?= sh
74
75 # watch out for people who don't use CPPFLAGS
76 CPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS}
77 CXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS}
78
79 # just in case these need to be different
80 CC_MD?=${CC}
81 CXX_MD?=${CXX}
82
83 # should have been set by sys.mk
84 CXX_SUFFIXES?= .cc .cpp .cxx .C
85
86 # so we can do an explicit make depend, but not otherwise
87 .if make(depend)
88 .SUFFIXES:      .d
89
90 .if empty(CFLAGS_MD)
91 .y.d:
92         @echo updating dependencies for $<
93         @${YACC} ${YFLAGS} $<
94         @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; }
95         @${RM} -f y.tab.c
96
97 .l.d:
98         @echo updating dependencies for $<
99         ${LEX} ${LFLAGS} $<
100         @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; }
101         @${RM} -f lex.yy.c
102
103 .c.d:
104         @echo updating dependencies for $<
105         @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
106
107 .s.d .S.d:
108         @echo updating dependencies for $<
109         @${MAKE_SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
110
111 ${CXX_SUFFIXES:%=%.d}:
112         @echo updating dependencies for $<
113         @${MAKE_SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; }
114 .else
115 .y.d:
116         ${YACC} ${YFLAGS} $<
117         ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; }
118         ${RM} -f y.tab.c
119
120 .l.d:
121         ${LEX} ${LFLAGS} $<
122         ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; }
123         ${RM} -f lex.yy.c
124
125 .c.d:
126         ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
127
128 .s.d .S.d:
129         ${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; }
130
131 ${CXX_SUFFIXES:%=%.d}:
132         ${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; }
133 .endif
134
135 .if !target(depend)
136 depend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE
137
138 ${DEPENDFILE}:  ${DEPSRCS} ${__dependsrcs}
139 .NOPATH:        ${__dependsrcs}
140 .OPTIONAL:      ${__dependsrcs}
141 .endif
142 .endif                          # make(depend)
143
144 .if empty(CFLAGS_MD)
145 # make sure the .d's are generated/updated
146 ${PROG} ${_LIBS}:       ${DEPENDFILE}
147 .endif
148
149 .ORDER: beforedepend ${DEPENDFILE} afterdepend
150
151 .if ${.OBJDIR} != ${.CURDIR}
152 __depfiles= *.d
153 .else
154 __depfiles= ${__dependsrcs}
155 .endif
156
157 DEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d
158
159 cleandir: cleanautodepend
160 cleanautodepend:
161         ${RM} -f ${DEPCLEANFILES}
162
163 CLEANFILES+= ${DEPCLEANFILES}
164
165 .if defined(__dependsrcs) && !empty(__dependsrcs)
166 .if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*))
167 # this ensures we do the right thing if only building a shared or
168 # profiled lib
169 OBJ_EXTENSIONS?=.o .po .so .So
170 MDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},'
171 .ifdef NOMD_SED
172 .ifdef LIB
173 MD_SED=sed ${MDLIB_SED}
174 .else
175 MD_SED=cat
176 .endif
177 .else
178 # arrange to put some variable names into ${DEPENDFILE}
179 .ifdef LIB
180 MD_SED=sed ${MDLIB_SED}
181 .else
182 MD_SED=sed
183 .endif
184 SUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR
185 .for v in ${SUBST_DEPVARS}
186 .if defined(${v}) && !empty(${v})
187 MD_SED+= -e 's,${$v},$${$v},'
188 .endif
189 .endfor
190 .endif
191 .if (${MD_SED} == "sed")
192 MD_SED=cat
193 .endif
194
195 # this will be done whenever make finishes successfully
196 .if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530
197 .END:
198 .else
199 .END:   ${DEPENDFILE}
200 # we do not want to trigger building .d's just use them if they exist
201 ${DEPENDFILE}:  ${__dependsrcs:@d@${exists($d):?$d:}@}
202 .endif
203         -@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \
204         test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \
205         ${RM} -f ${DEPENDFILE}.new
206 .endif
207 .endif
208 .else
209 depend: beforedepend afterdepend _SUBDIRUSE
210 .endif
211
212 .if !target(beforedepend)
213 beforedepend:
214 .endif
215 .if !target(afterdepend)
216 afterdepend:
217 .endif
218
219 .endif