xref: /freebsd/share/mk/local.sys.mk (revision 15f0b8c3)
1# $FreeBSD$
2
3.if ${MK_DIRDEPS_BUILD} == "yes" || ${MK_META_MODE} == "yes"
4
5# Not in the below list as it may make sense for non-meta mode
6# eventually.  meta.sys.mk (DIRDEPS_BUILD) also already adds these in.
7.if ${MK_DIRDEPS_BUILD} == "no" && ${MK_META_MODE} == "yes"
8MAKE_PRINT_VAR_ON_ERROR += \
9	.ERROR_TARGET \
10	.ERROR_META_FILE \
11	.MAKE.LEVEL \
12	MAKEFILE \
13	.MAKE.MODE
14.endif
15
16_ERROR_CMD_EXEC=	${sed -n '/^CMD/s,^CMD \(.*\),\1;,p' ${.ERROR_META_FILE}:L:sh}
17_ERROR_CMD=		${!empty(.ERROR_META_FILE):?${_ERROR_CMD_EXEC}:.PHONY}
18MAKE_PRINT_VAR_ON_ERROR+= \
19	_ERROR_CMD \
20	.CURDIR \
21	.MAKE \
22	.OBJDIR \
23	.TARGETS \
24	DESTDIR \
25	LD_LIBRARY_PATH \
26	MACHINE \
27	MACHINE_ARCH \
28	MAKEOBJDIRPREFIX \
29	MAKESYSPATH \
30	MAKE_VERSION \
31	PATH \
32	SRCTOP \
33	OBJTOP \
34	${MAKE_PRINT_VAR_ON_ERROR_XTRAS}
35
36# Meta mode may rebuild targets that then fail. The next build won't detect
37# the meta mode change. Not all targets have a 'rm ${.TARGET}' in them
38# so force it.
39.DELETE_ON_ERROR:
40
41.if ${.MAKE.LEVEL} > 0
42MAKE_PRINT_VAR_ON_ERROR += .MAKE.MAKEFILES .PATH
43.endif
44.endif
45
46.if !empty(.OBJDIR)
47OBJTOP?= ${.OBJDIR:S,${.CURDIR},,}${SRCTOP}
48.endif
49
50.if !empty(LIBDIR)
51_PREMK_LIBDIR:=	${LIBDIR}
52.endif
53
54.include "src.sys.mk"
55.-include <site.sys.mk>
56
57.if ${.MAKE.MODE:Mmeta*} != ""
58# we can afford to use cookies to prevent some targets
59# re-running needlessly but only when using filemon.
60# Targets that should support the meta mode cookie handling should just be
61# added to META_TARGETS.  If bsd.sys.mk cannot be included then ${META_DEPS}
62# should be added as a target dependency as well.  Otherwise the target
63# is added to in bsd.sys.mk since it comes last.
64.if ${.MAKE.MODE:Mnofilemon} == ""
65# Prepend .OBJDIR if not already there.
66_META_COOKIE_COND=	"${.TARGET:M${.OBJDIR}/*}" == ""
67_META_COOKIE_DEFAULT=	${${_META_COOKIE_COND}:?${.OBJDIR}/${.TARGET}:${.TARGET}}
68# Use the default if COOKIE.${.TARGET} is not defined.
69META_COOKIE=		${COOKIE.${.TARGET}:U${_META_COOKIE_DEFAULT}}
70META_COOKIE_RM=		@rm -f ${META_COOKIE}
71META_COOKIE_TOUCH=	@touch ${META_COOKIE}
72CLEANFILES+=		${META_TARGETS}
73_meta_dep_before:	.USEBEFORE .NOTMAIN
74	${META_COOKIE_RM}
75_meta_dep_after:	.USE .NOTMAIN
76	${META_COOKIE_TOUCH}
77# Attach this to a target to allow it to benefit from meta mode's
78# not rerunning a command if it doesn't need to be considering its
79# metafile/filemon-tracked dependencies.
80META_DEPS=	_meta_dep_before _meta_dep_after .META
81.endif
82.else
83# some targets need to be .PHONY - but not in meta mode
84META_NOPHONY=	.PHONY
85.endif
86META_NOPHONY?=
87META_COOKIE_RM?=
88META_COOKIE_TOUCH?=
89META_DEPS+=	${META_NOPHONY}
90