3 # $Id: autodep.mk,v 1.36 2016/04/05 15:58:37 sjg Exp $
5 # @(#) Copyright (c) 1999-2010, Simon J. Gerraty
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
14 # Please send copies of changes and bug-fixes to:
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.
22 .if
!target
(__
${.PARSEFILE
}__
)
26 .for d in
${DEPENDFILE
:N.depend
}
27 # bmake only groks .depend
28 .if
${MAKE_VERSION} < 20160218
35 # it does nothing if SRCS is not defined or is empty
36 .if defined
(SRCS
) && !empty
(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}
49 .for s in
${__depsrcs}
53 __depsrcs
:=${__depsrcs
:T
:R
:S
/$/.dep
/g
}
54 # we also need to handle makefiles where the .dep'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
/.dep
/}
59 __dependsrcs
= ${__dependsrcsx
:O
:u
}
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}
65 # set this to -MMD to ignore /usr/include
66 # actually it ignores <> so may not be a great idea
68 # -MF etc not available on all gcc versions.
69 # we "fix" the .o later
70 CFLAGS_MF?
=-MF
${.TARGET
:T
:R
}.dep
-MT
${.TARGET
:T
:R
}.o
71 CFLAGS
+= ${CFLAGS_MD} ${CFLAGS_MF}
74 # watch out for people who don't use CPPFLAGS
75 CPPFLAGS_MD
=${CFLAGS
:M-
[IUD
]*} ${CPPFLAGS}
76 CXXFLAGS_MD
=${CXXFLAGS
:M-
[IUD
]*} ${CPPFLAGS}
78 # just in case these need to be different
82 # should have been set by sys.mk
83 CXX_SUFFIXES?
= .
cc .
cpp .
cxx .C
85 # so we can do an explicit make depend, but not otherwise
91 @echo updating dependencies for
$<
93 @
${SHELL} -ec
"${CC_MD} -M ${CPPFLAGS_MD} y.tab.c | sed '/:/s/^/$@ /' > $@" ||
{ ${RM} -f y.tab.c
$@
; false
; }
97 @echo updating dependencies for
$<
99 @
${SHELL} -ec
"${CC_MD} -M ${CPPFLAGS_MD} lex.yy.c | sed '/:/s/^/$@ /' > $@" ||
{ ${RM} -f
lex.yy.c
$@
; false
; }
103 @echo updating dependencies for
$<
104 @
${SHELL} -ec
"${CC_MD} -M ${CPPFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" ||
{ ${RM} -f
$@
; false
; }
107 @echo updating dependencies for
$<
108 @
${SHELL} -ec
"${CC_MD} -M ${CPPFLAGS_MD} ${AINC} $< | sed '/:/s/^/$@ /' > $@" ||
{ ${RM} -f
$@
; false
; }
110 ${CXX_SUFFIXES
:%=%.dep
}:
111 @echo updating dependencies for
$<
112 @
${SHELL} -ec
"${CXX_MD} -M ${CXXFLAGS_MD} $< | sed '/:/s/^/$@ /' > $@" ||
{ ${RM} -f
$@
; false
; }
116 ${CC_MD} ${CFLAGS_MD
:S
/D
//} ${CPPFLAGS_MD} y.tab.c
> $@ ||
{ ${RM} -f y.tab.c
$@
; false
; }
121 ${CC_MD} ${CFLAGS_MD
:S
/D
//} ${CPPFLAGS_MD} lex.yy.c
> $@ ||
{ ${RM} -f
lex.yy.c
$@
; false
; }
125 ${CC_MD} ${CFLAGS_MD
:S
/D
//} ${CPPFLAGS_MD} $< > $@ ||
{ ${RM} -f
$@
; false
; }
128 ${CC_MD} ${CFLAGS_MD
:S
/D
//} ${CPPFLAGS_MD} ${AINC} $< > $@ ||
{ ${RM} -f
$@
; false
; }
130 ${CXX_SUFFIXES
:%=%.dep
}:
131 ${CXX_MD} ${CFLAGS_MD
:S
/D
//} ${CXXFLAGS_MD} $< > $@ ||
{ ${RM} -f
$@
; false
; }
135 depend
: beforedepend
${DEPENDFILE} afterdepend _SUBDIRUSE
137 ${DEPENDFILE}: ${DEPSRCS} ${__dependsrcs}
138 .NOPATH
: ${__dependsrcs}
139 .OPTIONAL
: ${__dependsrcs}
141 .
endif # make(depend)
144 # make sure the .dep's are generated/updated
145 ${PROG} ${_LIBS}: ${DEPENDFILE}
148 .ORDER
: beforedepend
${DEPENDFILE} afterdepend
150 .if
${.OBJDIR
} != ${.CURDIR
}
153 __depfiles
= ${__dependsrcs}
156 DEPCLEANFILES
= ${DEPENDFILE} ${__depfiles} y.tab.dep
*.tmp.dep
158 cleandir
: cleanautodepend
160 ${RM} -f
${DEPCLEANFILES}
162 CLEANFILES
+= ${DEPCLEANFILES}
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
168 OBJ_EXTENSIONS?
=.o .po .so .So
169 MDLIB_SED
= -e
'/:/s,^\([^\.:]*\)\.[psS]*o,${OBJ_EXTENSIONS:S,^,\1,},'
172 MD_SED
=sed
${MDLIB_SED}
177 # arrange to put some variable names into ${DEPENDFILE}
179 MD_SED
=sed
${MDLIB_SED}
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},'
190 .if
(${MD_SED} == "sed")
194 # this will be done whenever make finishes successfully
195 .if
${MAKE_VERSION
:U0
:[1]:C
/.
*-//} < 20050530
199 # we do not want to trigger building .dep's just use them if they exist
200 ${DEPENDFILE}: ${__dependsrcs
:@d@
${exists
($d):?
$d:}@
}
202 -@
${MD_SED} ${__depfiles} > ${DEPENDFILE}.new
2> /dev
/null
&& \
203 test -s
${DEPENDFILE}.new
&& mv
${DEPENDFILE}.new
${DEPENDFILE}; \
204 ${RM} -f
${DEPENDFILE}.new
208 depend
: beforedepend afterdepend _SUBDIRUSE
211 .if
!target
(beforedepend
)
214 .if
!target
(afterdepend
)