1# RCSid: 2# $Id: dirdeps-targets.mk,v 1.10 2020/06/06 22:41:02 sjg Exp $ 3# 4# @(#) Copyright (c) 2019-2020 Simon J. Gerraty 5# 6# This file is provided in the hope that it will 7# be of use. There is absolutely NO WARRANTY. 8# Permission to copy, redistribute or otherwise 9# use this file is hereby granted provided that 10# the above copyright notice and this notice are 11# left intact. 12# 13# Please send copies of changes and bug-fixes to: 14# sjg@crufty.net 15# 16 17## 18# This makefile is used to set initial DIRDEPS for top-level build 19# targets. 20# 21# The basic idea is that we have a list of directories in 22# DIRDEPS_TARGETS_DIRS which are relative to SRCTOP. 23# When asked to make 'foo' we look for any directory named 'foo' 24# under DIRDEPS_TARGETS_DIRS. 25# We then search those dirs for any Makefile.depend* 26# Finally we select any that match conditions like REQUESTED_MACHINE 27# or TARGET_SPEC and initialize DIRDEPS accordingly. 28# 29 30.if ${.MAKE.LEVEL} == 0 31# pickup customizations 32.-include <local.dirdeps-targets.mk> 33 34# for DIRDEPS_BUILD this is how we prime the pump 35DIRDEPS_TARGETS_DIRS ?= targets targets/pseudo 36# these prefixes can modify how we behave 37# they need to be stripped when looking for target dirs 38DIRDEPS_TARGETS_PREFIX_LIST ?= pkg- build- 39 40# some .TARGETS need filtering 41DIRDEPS_TARGETS_FILTER += Nall 42 43# matching target dirs if any 44tdirs := ${.TARGETS:${DIRDEPS_TARGETS_FILTER:ts:}:${DIRDEPS_TARGETS_PREFIX_LIST:@p@S,^$p,,@:ts:}:@t@${DIRDEPS_TARGETS_DIRS:@d@$d/$t@}@:@d@${exists(${SRCTOP}/$d):?$d:}@} 45 46.if !empty(DEBUG_DIRDEPS_TARGETS) 47.info tdirs=${tdirs} 48.endif 49 50.if !empty(tdirs) 51# some things we know we want to ignore 52DIRDEPS_TARGETS_SKIP_LIST += \ 53 *~ \ 54 *.bak \ 55 *.inc \ 56 *.old \ 57 *.options \ 58 *.orig \ 59 *.rej \ 60 61# the list of MACHINEs we consider 62DIRDEPS_TARGETS_MACHINE_LIST += \ 63 ${ALL_MACHINE_LIST:U} \ 64 ${PSEUDO_MACHINE_LIST:Ucommon host host32} \ 65 ${TARGET_MACHINE_LIST} 66 67DIRDEPS_TARGETS_MACHINE_LIST := ${DIRDEPS_TARGETS_MACHINE_LIST:O:u} 68 69# raw Makefile.depend* list 70tdeps != 'cd' ${SRCTOP} && 'ls' -1 ${tdirs:O:u:@d@$d/${.MAKE.DEPENDFILE_PREFIX}*@} 2> /dev/null; echo 71.if ${DEBUG_DIRDEPS_TARGETS:U:Mdep*} != "" 72.info tdeps=${tdeps} 73.endif 74# remove things we know we don't want 75tdeps := ${tdeps:${DIRDEPS_TARGETS_SKIP_LIST:${M_ListToSkip}}} 76.if ${DEBUG_DIRDEPS_TARGETS:U:Mdep*} != "" 77.info tdeps=${tdeps} 78.endif 79 80# plain entries (no qualifiers) these apply to any TARGET_SPEC 81ptdeps := ${tdeps:M*${.MAKE.DEPENDFILE_PREFIX}:S,/${.MAKE.DEPENDFILE_PREFIX},,} 82 83# MACHINE qualified entries 84mqtdeps := ${DIRDEPS_TARGETS_MACHINE_LIST:@m@${tdeps:M*.$m}@:S,/${.MAKE.DEPENDFILE_PREFIX},,} 85 86tqtdeps = 87.if ${TARGET_SPEC_VARS:[#]} > 1 88# TARGET_SPEC qualified entries 89.if !empty(TARGET_SPEC_LIST) 90# we have a list of valid TARGET_SPECS; use it 91tqtdeps := ${TARGET_SPEC_LIST:U:O:u:@t@${tdeps:M*.$t}@:S,/${.MAKE.DEPENDFILE_PREFIX},,} 92.else 93# do we have a list of valid tuple members for at least 94# the last tupple element? if so match on that 95TARGET_SPEC_LAST_LIST ?= ${${TARGET_SPEC_VARS:[-1]}_LIST} 96.if !empty(TARGET_SPEC_LAST_LIST) 97tqtdeps := ${TARGET_SPEC_LAST_LIST:U:O:u:@t@${tdeps:M*,$t}@:S,/${.MAKE.DEPENDFILE_PREFIX},,} 98.else 99# this is sub-optimal match MACHINE, 100tqtdeps := ${DIRDEPS_TARGETS_MACHINE_LIST:@m@${tdeps:M*.$m,*}@:S,/${.MAKE.DEPENDFILE_PREFIX},,} 101.endif 102.endif 103.endif 104 105# now work out what we want in DIRDEPS 106.if empty(REQUESTED_MACHINE) 107# we want them all just as found 108DIRDEPS = ${ptdeps} ${mqtdeps} ${tqtdeps} 109.else 110# we only want those that match REQUESTED_MACHINE/REQUESTED_TARGET_SPEC 111# or REQUESTED_TARGET_SPEC (TARGET_SPEC) 112DIRDEPS = \ 113 ${ptdeps:@d@$d.${REQUESTED_TARGET_SPEC:U${TARGET_SPEC:U${REQUESTED_MACHINE}}}@} \ 114 ${mqtdeps:M*.${REQUESTED_MACHINE}} \ 115 ${tqtdeps:M*.${REQUESTED_TARGET_SPEC:U${TARGET_SPEC}}} 116.endif 117# clean up 118DIRDEPS := ${DIRDEPS:O:u} 119 120.if !empty(DEBUG_DIRDEPS_TARGETS) 121.for x in tdeps ptdeps mqtdeps tqtdeps DIRDEPS 122.info $x=${$x} 123.endfor 124.endif 125.endif 126# if we got DIRDEPS get to work 127.if !empty(DIRDEPS) 128.include <dirdeps.mk> 129 130DIRDEPS_TARGETS_SKIP += all clean* destroy* 131 132.for t in ${.TARGETS:${DIRDEPS_TARGETS_SKIP:${M_ListToSkip}}} 133$t: dirdeps 134.endfor 135.endif 136.endif 137