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