1 |
# |
2 |
# RCSid: |
3 |
# $Id: autodep.mk,v 1.36 2016/04/05 15:58:37 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 |
|
74 |
# watch out for people who don't use CPPFLAGS |
75 |
CPPFLAGS_MD=${CFLAGS:M-[IUD]*} ${CPPFLAGS} |
76 |
CXXFLAGS_MD=${CXXFLAGS:M-[IUD]*} ${CPPFLAGS} |
77 |
|
78 |
# just in case these need to be different |
79 |
CC_MD?=${CC} |
80 |
CXX_MD?=${CXX} |
81 |
|
82 |
# should have been set by sys.mk |
83 |
CXX_SUFFIXES?= .cc .cpp .cxx .C |
84 |
|
85 |
# so we can do an explicit make depend, but not otherwise |
86 |
.if make(depend) |
87 |
.SUFFIXES: .d |
88 |
|
89 |
.if empty(CFLAGS_MD) |
90 |
.y.d: |
91 |
@echo updating dependencies for $< |
92 |
@${YACC} ${YFLAGS} $< |
93 |
@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f y.tab.c $@; false; } |
94 |
@${RM} -f y.tab.c |
95 |
|
96 |
.l.d: |
97 |
@echo updating dependencies for $< |
98 |
${LEX} ${LFLAGS} $< |
99 |
@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" || { ${RM} -f lex.yy.c $@; false; } |
100 |
@${RM} -f lex.yy.c |
101 |
|
102 |
.c.d: |
103 |
@echo updating dependencies for $< |
104 |
@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } |
105 |
|
106 |
.s.d .S.d: |
107 |
@echo updating dependencies for $< |
108 |
@${SHELL} -ec "${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } |
109 |
|
110 |
${CXX_SUFFIXES:%=%.d}: |
111 |
@echo updating dependencies for $< |
112 |
@${SHELL} -ec "${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" || { ${RM} -f $@; false; } |
113 |
.else |
114 |
.y.d: |
115 |
${YACC} ${YFLAGS} $< |
116 |
${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} y.tab.c > $@ || { ${RM} -f y.tab.c $@; false; } |
117 |
${RM} -f y.tab.c |
118 |
|
119 |
.l.d: |
120 |
${LEX} ${LFLAGS} $< |
121 |
${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} lex.yy.c > $@ || { ${RM} -f lex.yy.c $@; false; } |
122 |
${RM} -f lex.yy.c |
123 |
|
124 |
.c.d: |
125 |
${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } |
126 |
|
127 |
.s.d .S.d: |
128 |
${CC_MD} ${CFLAGS_MD:S/D//} ${CPPFLAGS_MD} ${AINC} $< > $@ || { ${RM} -f $@; false; } |
129 |
|
130 |
${CXX_SUFFIXES:%=%.d}: |
131 |
${CXX_MD} ${CFLAGS_MD:S/D//} ${CXXFLAGS_MD} $< > $@ || { ${RM} -f $@; false; } |
132 |
.endif |
133 |
|
134 |
.if !target(depend) |
135 |
depend: beforedepend ${DEPENDFILE} afterdepend _SUBDIRUSE |
136 |
|
137 |
${DEPENDFILE}: ${DEPSRCS} ${__dependsrcs} |
138 |
.NOPATH: ${__dependsrcs} |
139 |
.OPTIONAL: ${__dependsrcs} |
140 |
.endif |
141 |
.endif # make(depend) |
142 |
|
143 |
.if empty(CFLAGS_MD) |
144 |
# make sure the .d's are generated/updated |
145 |
${PROG} ${_LIBS}: ${DEPENDFILE} |
146 |
.endif |
147 |
|
148 |
.ORDER: beforedepend ${DEPENDFILE} afterdepend |
149 |
|
150 |
.if ${.OBJDIR} != ${.CURDIR} |
151 |
__depfiles= *.d |
152 |
.else |
153 |
__depfiles= ${__dependsrcs} |
154 |
.endif |
155 |
|
156 |
DEPCLEANFILES= ${DEPENDFILE} ${__depfiles} y.tab.d *.tmp.d |
157 |
|
158 |
cleandir: cleanautodepend |
159 |
cleanautodepend: |
160 |
${RM} -f ${DEPCLEANFILES} |
161 |
|
162 |
CLEANFILES+= ${DEPCLEANFILES} |
163 |
|
164 |
.if defined(__dependsrcs) && !empty(__dependsrcs) |
165 |
.if make(depend) || !(make(clean*) || make(destroy*) || make(obj) || make(*install) || make(install-*)) |
166 |
# this ensures we do the right thing if only building a shared or |
167 |
# profiled lib |
168 |
OBJ_EXTENSIONS?=.o .po .so .So |
169 |
MDLIB_SED= -e '/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},' |
170 |
.ifdef NOMD_SED |
171 |
.ifdef LIB |
172 |
MD_SED=sed ${MDLIB_SED} |
173 |
.else |
174 |
MD_SED=cat |
175 |
.endif |
176 |
.else |
177 |
# arrange to put some variable names into ${DEPENDFILE} |
178 |
.ifdef LIB |
179 |
MD_SED=sed ${MDLIB_SED} |
180 |
.else |
181 |
MD_SED=sed |
182 |
.endif |
183 |
SUBST_DEPVARS+= SB TOP BACKING SRC SRCDIR BASE BASEDIR |
184 |
.for v in ${SUBST_DEPVARS} |
185 |
.if defined(${v}) && !empty(${v}) |
186 |
MD_SED+= -e 's,${$v},$${$v},' |
187 |
.endif |
188 |
.endfor |
189 |
.endif |
190 |
.if (${MD_SED} == "sed") |
191 |
MD_SED=cat |
192 |
.endif |
193 |
|
194 |
# this will be done whenever make finishes successfully |
195 |
.if ${MAKE_VERSION:U0:[1]:C/.*-//} < 20050530 |
196 |
.END: |
197 |
.else |
198 |
.END: ${DEPENDFILE} |
199 |
# we do not want to trigger building .d's just use them if they exist |
200 |
${DEPENDFILE}: ${__dependsrcs:@d@${exists($d):?$d:}@} |
201 |
.endif |
202 |
-@${MD_SED} ${__depfiles} > ${DEPENDFILE}.new 2> /dev/null && \ |
203 |
test -s ${DEPENDFILE}.new && mv ${DEPENDFILE}.new ${DEPENDFILE}; \ |
204 |
${RM} -f ${DEPENDFILE}.new |
205 |
.endif |
206 |
.endif |
207 |
.else |
208 |
depend: beforedepend afterdepend _SUBDIRUSE |
209 |
.endif |
210 |
|
211 |
.if !target(beforedepend) |
212 |
beforedepend: |
213 |
.endif |
214 |
.if !target(afterdepend) |
215 |
afterdepend: |
216 |
.endif |
217 |
|
218 |
.endif |