xref: /freebsd/contrib/bmake/mk/auto.dep.mk (revision 1fb62fb074788ca4713551be09d6569966a3abee)
1#
2# RCSid:
3#	$Id: auto.dep.mk,v 1.5 2016/04/05 15:58:37 sjg Exp $
4#
5#	@(#) Copyright (c) 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
18# This module provides automagic dependency generation along the
19# lines suggested in the GNU make.info
20
21# set MKDEP_MK=auto.dep.mk and dep.mk will include us
22
23# This version differs from autodep.mk, in that
24# we use ${.TARGET:T}.d rather than ${.TARGET:T:R}.d
25# this makes it simpler to get the args to -MF and -MT right
26# and ensure we can simply include all the .d files.
27#
28# However suffix rules do not work with something like .o.d so we
29# don't even try to handle 'make depend' gracefully.
30# dep.mk will handle that itself.
31#
32.if !target(__${.PARSEFILE}__)
33__${.PARSEFILE}__:
34
35# this what bmake > 20100401 will look for
36.MAKE.DEPENDFILE ?= .depend
37
38# set this to -MMD to ignore /usr/include
39# actually it ignores <> so may not be a great idea
40CFLAGS_MD ?= -MD
41# -MF etc not available on all gcc versions.
42CFLAGS_MF ?= -MF ${.TARGET:T}.d -MT ${.TARGET:T}
43CFLAGS += ${CFLAGS_MD} ${CFLAGS_MF}
44CXXFLAGS += ${CFLAGS_MD} ${CFLAGS_MF}
45
46CLEANFILES += .depend ${.MAKE.DEPENDFILE} *.d
47
48.if ${MAKE_VERSION} < 20160218
49# skip generating dependfile for misc targets
50.if ${.TARGETS:Uall:M*all} != ""
51.END:	${.MAKE.DEPENDFILE}
52.endif
53
54# doing 'make depend' isn't a big win with this model
55.if !target(depend)
56depend: ${.MAKE.DEPENDFILE}
57.endif
58
59# this is trivial
60${.MAKE.DEPENDFILE}: ${OBJS} ${POBJS} ${SOBJS}
61	-@for f in ${.ALLSRC:M*o:T:O:u:%=%.d}; do \
62		echo ".-include \"$$f\""; \
63	done > $@
64.else
65# we have .dinclude
66.if empty(_SKIP_BUILD)
67_all_objs = ${OBJS} ${POBJS} ${SOBJS}
68.for d in ${_all_objs:M*o:T:O:u:%=%.d}
69.dinclude <$d>
70.endfor
71.endif
72
73.endif
74.endif
75