xref: /dflybsd-src/contrib/bmake/mk/dirdeps-cache-update.mk (revision a34d5fb143d34c0e1d2580296c500e2c8a5bc5dc)
1*a34d5fb1SAntonio Huete Jimenez# $Id: dirdeps-cache-update.mk,v 1.22 2020/09/10 00:14:38 sjg Exp $
2*a34d5fb1SAntonio Huete Jimenez#
3*a34d5fb1SAntonio Huete Jimenez#	@(#) Copyright (c) 2020, Simon J. Gerraty
4*a34d5fb1SAntonio Huete Jimenez#
5*a34d5fb1SAntonio Huete Jimenez#	This file is provided in the hope that it will
6*a34d5fb1SAntonio Huete Jimenez#	be of use.  There is absolutely NO WARRANTY.
7*a34d5fb1SAntonio Huete Jimenez#	Permission to copy, redistribute or otherwise
8*a34d5fb1SAntonio Huete Jimenez#	use this file is hereby granted provided that
9*a34d5fb1SAntonio Huete Jimenez#	the above copyright notice and this notice are
10*a34d5fb1SAntonio Huete Jimenez#	left intact.
11*a34d5fb1SAntonio Huete Jimenez#
12*a34d5fb1SAntonio Huete Jimenez#	Please send copies of changes and bug-fixes to:
13*a34d5fb1SAntonio Huete Jimenez#	sjg@crufty.net
14*a34d5fb1SAntonio Huete Jimenez#
15*a34d5fb1SAntonio Huete Jimenez
16*a34d5fb1SAntonio Huete Jimenez##
17*a34d5fb1SAntonio Huete Jimenez#
18*a34d5fb1SAntonio Huete Jimenez# This makefile deals with the updating of STATIC_DIRDEPS_CACHE.
19*a34d5fb1SAntonio Huete Jimenez# Some targets are so huge that computing dirdeps takes a significant
20*a34d5fb1SAntonio Huete Jimenez# amount of time.  For such targets a STATIC_DIRDEPS_CACHE can make
21*a34d5fb1SAntonio Huete Jimenez# sense.
22*a34d5fb1SAntonio Huete Jimenez#
23*a34d5fb1SAntonio Huete Jimenez# If the target is represented by targets/pseudo/production
24*a34d5fb1SAntonio Huete Jimenez# it's normal DIRDEPS would be in
25*a34d5fb1SAntonio Huete Jimenez# targets/pseudo/production/Makefile.depend
26*a34d5fb1SAntonio Huete Jimenez# and STATIC_DIRDEPS_CACHE would be
27*a34d5fb1SAntonio Huete Jimenez# targets/pseudo/production/Makefile.dirdeps.cache
28*a34d5fb1SAntonio Huete Jimenez# which is simply initialized by copying dirdeps.cache.production
29*a34d5fb1SAntonio Huete Jimenez# from $OBJTOP
30*a34d5fb1SAntonio Huete Jimenez#
31*a34d5fb1SAntonio Huete Jimenez# When dirdeps-targets.mk is initializing DIRDEPS it will look for
32*a34d5fb1SAntonio Huete Jimenez# Makefile.dirdeps.cache and unless told not to
33*a34d5fb1SAntonio Huete Jimenez# (MK_STATIC_DIRDEPS_CACHE=no) will use it as DIRDEPS_CACHE.
34*a34d5fb1SAntonio Huete Jimenez#
35*a34d5fb1SAntonio Huete Jimenez# If MK_STATIC_DIRDEPS_CACHE_UPDATE is "yes", then this makefile
36*a34d5fb1SAntonio Huete Jimenez# comes into play.
37*a34d5fb1SAntonio Huete Jimenez#
38*a34d5fb1SAntonio Huete Jimenez# We usually get included from local.dirdeps.mk
39*a34d5fb1SAntonio Huete Jimenez# as well as Makefile.depend of RELDIR with a static Makefile.dirdeps.cache
40*a34d5fb1SAntonio Huete Jimenez#
41*a34d5fb1SAntonio Huete Jimenez# If we see that STATIC_DIRDEPS_CACHE is in use, we need to hook a
42*a34d5fb1SAntonio Huete Jimenez# cache-update target into the build to regenerate dirdeps.cache
43*a34d5fb1SAntonio Huete Jimenez# in parallel with the rest of the build.
44*a34d5fb1SAntonio Huete Jimenez# If MK_STATIC_DIRDEPS_CACHE_UPDATE_IMMEDIATE is "yes" we update
45*a34d5fb1SAntonio Huete Jimenez# STATIC_DIRDEPS_CACHE as soon as the update is ready,
46*a34d5fb1SAntonio Huete Jimenez# otherwise it will be done at the end of the build.
47*a34d5fb1SAntonio Huete Jimenez#
48*a34d5fb1SAntonio Huete Jimenez# If STATIC_DIRDEPS_CACHE is not in use, but a DIRDEPS_CACHE is,
49*a34d5fb1SAntonio Huete Jimenez# then we need do nothing except export STATIC_DIRDEPS_CACHE and
50*a34d5fb1SAntonio Huete Jimenez# DYNAMIC_DIRDEPS_CACHE for use when we are include during the visit
51*a34d5fb1SAntonio Huete Jimenez# to the ultimate target (targets/pseudo/production).
52*a34d5fb1SAntonio Huete Jimenez#
53*a34d5fb1SAntonio Huete Jimenez# Regardless of which happens, when included at .MAKE.LEVEL > 0
54*a34d5fb1SAntonio Huete Jimenez# for a target other than cache-update we simply copy
55*a34d5fb1SAntonio Huete Jimenez# DYNAMIC_DIRDEPS_CACHE to STATIC_DIRDEPS_CACHE with some optional
56*a34d5fb1SAntonio Huete Jimenez# filtering.
57*a34d5fb1SAntonio Huete Jimenez#
58*a34d5fb1SAntonio Huete Jimenez# If we are included for the target cache-update we take care of
59*a34d5fb1SAntonio Huete Jimenez# running dirdeps.mk again to generate the DYNAMIC_DIRDEPS_CACHE.
60*a34d5fb1SAntonio Huete Jimenez#
61*a34d5fb1SAntonio Huete Jimenez
62*a34d5fb1SAntonio Huete Jimenez.if !target(_${.PARSEFILE}_)
63*a34d5fb1SAntonio Huete Jimenez_${.PARSEFILE}_: .NOTMAIN
64*a34d5fb1SAntonio Huete Jimenez
65*a34d5fb1SAntonio Huete JimenezSTATIC_CACHE_SED += \
66*a34d5fb1SAntonio Huete Jimenez	-e '/Autogenerated/s,-.*,- edit with care!,' \
67*a34d5fb1SAntonio Huete Jimenez	-e '/cache-update/d'
68*a34d5fb1SAntonio Huete Jimenez
69*a34d5fb1SAntonio Huete JimenezSTATIC_DIRDEPS_CACHE_UPDATE_SCRIPT ?= \
70*a34d5fb1SAntonio Huete Jimenez	{ echo Saving ${DYNAMIC_DIRDEPS_CACHE} as ${STATIC_DIRDEPS_CACHE}; \
71*a34d5fb1SAntonio Huete Jimenez        sed ${STATIC_CACHE_SED} ${DYNAMIC_DIRDEPS_CACHE} > ${STATIC_DIRDEPS_CACHE}; }
72*a34d5fb1SAntonio Huete Jimenez.endif
73*a34d5fb1SAntonio Huete Jimenez
74*a34d5fb1SAntonio Huete Jimenez.if ${MK_DIRDEPS_CACHE:Uno} == "yes"
75*a34d5fb1SAntonio Huete Jimenez.if ${MK_STATIC_DIRDEPS_CACHE_UPDATE:Uno} == "yes"
76*a34d5fb1SAntonio Huete Jimenez.if ${_debug_reldir:U0} || ${DEBUG_DIRDEPS:U:Mcache*} != ""
77*a34d5fb1SAntonio Huete Jimenez_debug_cache = 1
78*a34d5fb1SAntonio Huete Jimenez.else
79*a34d5fb1SAntonio Huete Jimenez_debug_cache = 0
80*a34d5fb1SAntonio Huete Jimenez.endif
81*a34d5fb1SAntonio Huete Jimenez
82*a34d5fb1SAntonio Huete Jimenez.if ${.MAKE.LEVEL} == 0 && !make(cache-update)
83*a34d5fb1SAntonio Huete Jimenez
84*a34d5fb1SAntonio Huete Jimenez.if ${_debug_cache}
85*a34d5fb1SAntonio Huete Jimenez.info ${MK_STATIC_DIRDEPS_CACHE_UPDATE MK_STATIC_DIRDEPS_CACHE MK_DIRDEPS_CACHE DIRDEPS_CACHE STATIC_DIRDEPS_CACHE:L:@v@$v=${$v}@}
86*a34d5fb1SAntonio Huete Jimenez.endif
87*a34d5fb1SAntonio Huete Jimenez
88*a34d5fb1SAntonio Huete Jimenez.if ${MK_STATIC_DIRDEPS_CACHE} == "yes" && defined(STATIC_DIRDEPS_CACHE) && exists(${STATIC_DIRDEPS_CACHE})
89*a34d5fb1SAntonio Huete Jimenez.if !make(dirdeps) && !target(cache_update_dirdep)
90*a34d5fb1SAntonio Huete Jimenez# We are using static cache and this is the only look we will get.
91*a34d5fb1SAntonio Huete Jimenez# We want to generate an updated cache while we build
92*a34d5fb1SAntonio Huete Jimenez# so need to hook cache-update to dirdeps now.
93*a34d5fb1SAntonio Huete Jimenez# Note: we are running as a sibling to dirdeps-cached,
94*a34d5fb1SAntonio Huete Jimenez# attempting to do this in that context is problematic.
95*a34d5fb1SAntonio Huete Jimenez
96*a34d5fb1SAntonio Huete Jimenez# One of these should exist - to actually kick off the cache generation
97*a34d5fb1SAntonio Huete Jimenez.for d in ${STATIC_DIRDEPS_CACHE:H}/cache-update ${STATIC_DIRDEPS_CACHE:H:H}/cache-update ${STATIC_DIRDEPS_CACHE:H:H:H}/cache-update
98*a34d5fb1SAntonio Huete Jimenez.if exists($d)
99*a34d5fb1SAntonio Huete Jimenezcache_update_dirdep ?= $d.${TARGET_SPEC}
100*a34d5fb1SAntonio Huete Jimenez.endif
101*a34d5fb1SAntonio Huete Jimenez.endfor
102*a34d5fb1SAntonio Huete Jimenezdirdeps cache_update_dirdep: ${cache_update_dirdep}
103*a34d5fb1SAntonio Huete Jimenez${cache_update_dirdep}: _DIRDEP_USE
104*a34d5fb1SAntonio Huete JimenezDYNAMIC_DIRDEPS_CACHE := ${OBJTOP}/dirdeps.cache.${STATIC_DIRDEPS_CACHE:H:T}-update
105*a34d5fb1SAntonio Huete Jimenez.export DYNAMIC_DIRDEPS_CACHE STATIC_DIRDEPS_CACHE
106*a34d5fb1SAntonio Huete Jimenez.endif	# make(dirdeps)
107*a34d5fb1SAntonio Huete Jimenez.endif	# MK_*
108*a34d5fb1SAntonio Huete Jimenez
109*a34d5fb1SAntonio Huete Jimenez.endif	# .MAKE.LEVEL 0
110*a34d5fb1SAntonio Huete Jimenez
111*a34d5fb1SAntonio Huete Jimenez.if ${.MAKE.LEVEL} > 0 && ${.CURDIR:T} == "cache-update"
112*a34d5fb1SAntonio Huete Jimenez# we are the background update shim
113*a34d5fb1SAntonio Huete Jimenez
114*a34d5fb1SAntonio Huete Jimenez.if ${_debug_cache}
115*a34d5fb1SAntonio Huete Jimenez.info level ${.MAKE.LEVEL}: ${MK_DIRDEPS_CACHE DYNAMIC_DIRDEPS_CACHE STATIC_DIRDEPS_CACHE:L:@v@$v=${$v}@}
116*a34d5fb1SAntonio Huete Jimenez.endif
117*a34d5fb1SAntonio Huete Jimenez
118*a34d5fb1SAntonio Huete Jimenezall: cache-build
119*a34d5fb1SAntonio Huete Jimenezcache-build: .META
120*a34d5fb1SAntonio Huete Jimenez	@set -x; MAKELEVEL=0 \
121*a34d5fb1SAntonio Huete Jimenez	${.MAKE} -C ${SRCTOP} -f ${RELDIR}/Makefile cache-update \
122*a34d5fb1SAntonio Huete Jimenez	-DWITHOUT_STATIC_DIRDEPS_CACHE_UPDATE
123*a34d5fb1SAntonio Huete Jimenez
124*a34d5fb1SAntonio Huete Jimenez.endif	# cache-update
125*a34d5fb1SAntonio Huete Jimenez
126*a34d5fb1SAntonio Huete Jimenez.elif ${.MAKE.LEVEL} == 0 && make(cache-update) && !target(cache-update)
127*a34d5fb1SAntonio Huete Jimenez# we were invoked above
128*a34d5fb1SAntonio Huete Jimenez# we just leverage dirdeps.mk
129*a34d5fb1SAntonio Huete JimenezBUILD_DIRDEPS_TARGETS := ${STATIC_DIRDEPS_CACHE:H:T}
130*a34d5fb1SAntonio Huete JimenezDIRDEPS := ${STATIC_DIRDEPS_CACHE:H:S,^${SRCTOP}/,,}.${TARGET_SPEC}
131*a34d5fb1SAntonio Huete JimenezDIRDEPS_CACHE := ${DYNAMIC_DIRDEPS_CACHE}
132*a34d5fb1SAntonio Huete Jimenez
133*a34d5fb1SAntonio Huete Jimenez.if ${DEBUG_DIRDEPS:U:Mcache*} != ""
134*a34d5fb1SAntonio Huete Jimenez.info level 0: ${MK_DIRDEPS_CACHE DIRDEPS_CACHE DIRDEPS:L:@v@$v=${$v}@}
135*a34d5fb1SAntonio Huete Jimenez.endif
136*a34d5fb1SAntonio Huete Jimenez
137*a34d5fb1SAntonio Huete Jimenez# so cache-built below can check on us
138*a34d5fb1SAntonio Huete Jimenezx!= echo; echo ${.MAKE.PID} > ${DIRDEPS_CACHE}.new.pid
139*a34d5fb1SAntonio Huete Jimenez
140*a34d5fb1SAntonio Huete Jimenezcache-update: ${DIRDEPS_CACHE}
141*a34d5fb1SAntonio Huete Jimenez	@rm -f ${DIRDEPS_CACHE}.new.pid
142*a34d5fb1SAntonio Huete Jimenez.if ${MK_STATIC_DIRDEPS_CACHE_UPDATE_IMMEDIATE:Uno} == "yes"
143*a34d5fb1SAntonio Huete Jimenez	${STATIC_DIRDEPS_CACHE_UPDATE_SCRIPT}
144*a34d5fb1SAntonio Huete Jimenez.endif
145*a34d5fb1SAntonio Huete Jimenez
146*a34d5fb1SAntonio Huete Jimenezall:
147*a34d5fb1SAntonio Huete Jimenez
148*a34d5fb1SAntonio Huete Jimenez.include <dirdeps.mk>
149*a34d5fb1SAntonio Huete Jimenez
150*a34d5fb1SAntonio Huete Jimenez.endif	# MK_STATIC_DIRDEPS_CACHE_UPDATE
151*a34d5fb1SAntonio Huete Jimenez.endif	# MK_DIRDEPS_CACHE
152*a34d5fb1SAntonio Huete Jimenez
153*a34d5fb1SAntonio Huete Jimenez.if ${.MAKE.LEVEL} > 0 && ${MK_STATIC_DIRDEPS_CACHE_UPDATE:Uno} == "yes" && \
154*a34d5fb1SAntonio Huete Jimenez	${STATIC_DIRDEPS_CACHE:Uno:H} == "${SRCTOP}/${RELDIR}"
155*a34d5fb1SAntonio Huete Jimenez.if !defined(DYNAMIC_DIRDEPS_CACHE)
156*a34d5fb1SAntonio Huete Jimenezall:
157*a34d5fb1SAntonio Huete Jimenez.else
158*a34d5fb1SAntonio Huete Jimenez# This is the easy bit, time to save the cache
159*a34d5fb1SAntonio Huete Jimenez
160*a34d5fb1SAntonio Huete Jimenezall: cache-update
161*a34d5fb1SAntonio Huete Jimenez
162*a34d5fb1SAntonio Huete Jimenez# ensure the cache update is completed
163*a34d5fb1SAntonio Huete Jimenezcache-built:
164*a34d5fb1SAntonio Huete Jimenez	@test -s ${DYNAMIC_DIRDEPS_CACHE}.new || exit 0; \
165*a34d5fb1SAntonio Huete Jimenez	pid=`cat ${DYNAMIC_DIRDEPS_CACHE}.new.pid 2> /dev/null`; \
166*a34d5fb1SAntonio Huete Jimenez	test $${pid:-0} -gt 1 || exit 0; \
167*a34d5fb1SAntonio Huete Jimenez	echo "Waiting for $$pid to finish ${DYNAMIC_DIRDEPS_CACHE} ..."; \
168*a34d5fb1SAntonio Huete Jimenez	while 'kill' -0 $$pid; do sleep 30; done > /dev/null 2>&1
169*a34d5fb1SAntonio Huete Jimenez
170*a34d5fb1SAntonio Huete Jimenezcache-update: cache-built
171*a34d5fb1SAntonio Huete Jimenez.if ${MK_STATIC_DIRDEPS_CACHE_UPDATE_IMMEDIATE:Uno} == "no"
172*a34d5fb1SAntonio Huete Jimenez	@test ! -s ${DYNAMIC_DIRDEPS_CACHE} || \
173*a34d5fb1SAntonio Huete Jimenez	${STATIC_DIRDEPS_CACHE_UPDATE_SCRIPT}
174*a34d5fb1SAntonio Huete Jimenez.endif
175*a34d5fb1SAntonio Huete Jimenez
176*a34d5fb1SAntonio Huete Jimenez.endif
177*a34d5fb1SAntonio Huete Jimenez.endif
178