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