xref: /xnu-11215.61.5/makedefs/MakeInc.rule (revision 4f1223e81cd707a65cc109d0b8ad6653699da3c4)
1# -*- mode: makefile;-*-
2#
3# Copyright (C) 1999-2020 Apple Inc. All rights reserved.
4#
5# MakeInc.rule defines the targets and rules for
6# leaf directories once MakeInc.dir has recursed
7# into them. "do_XXX" may be double-colon rules
8# to allow the Makefile in the source directory
9# to augment the actions that will be performed.
10#
11include $(SRCROOT)/makedefs/MakeInc.color
12
13#
14# Empty the export lists of headers when building for exclaves
15#
16
17ifeq ($(EXPORTHDRS_SKIP_EXCLAVES),YES)
18EXPORT_MI_LIST =
19EXPORT_MI_GEN_LIST =
20EXPORT_MD_LIST =
21EXPORT_MD_GEN_LIST =
22endif
23
24#
25# Generic Install rules
26#
27
28ifndef INSTALL_KF_MI_LCL_LIST
29    INSTALL_KF_MI_LCL_LIST = $(EXPORT_MI_LIST)
30endif
31
32ifndef INSTALL_KF_MI_LCL_GEN_LIST
33    INSTALL_KF_MI_LCL_GEN_LIST = $(EXPORT_MI_GEN_LIST)
34endif
35
36ifndef INSTALL_KF_MD_LCL_LIST
37    INSTALL_KF_MD_LCL_LIST = $(EXPORT_MD_LIST)
38endif
39
40ifndef INSTALL_KF_MD_LCL_GEN_LIST
41    INSTALL_KF_MD_LCL_GEN_LIST = $(EXPORT_MD_GEN_LIST)
42endif
43
44ifndef INSTALL_KF_MI_LIST
45    INSTALL_KF_MI_LIST = $(EXPORT_MI_LIST)
46endif
47
48ifndef INSTALL_KF_MI_GEN_LIST
49    INSTALL_KF_MI_GEN_LIST = $(EXPORT_MI_GEN_LIST)
50endif
51
52ifndef INSTALL_KF_MD_LIST
53    INSTALL_KF_MD_LIST = $(EXPORT_MD_LIST)
54endif
55
56ifndef INSTALL_KF_MD_GEN_LIST
57    INSTALL_KF_MD_GEN_LIST = $(EXPORT_MD_GEN_LIST)
58endif
59
60$(eval $(call _setup_build_log_colors))
61
62.PHONY: ALWAYS
63
64ALWAYS:
65
66# $(1) is the list of install paths
67# $(2) is "1" if it's a "GEN"-style rule that looks locally, or else $(SOURCE)
68# $(3) is the local temp directory for processing
69# $(4) is the unifdef flags
70#
71# $$$$$$$$ is a double-escaped "$$" to represent the current pid
72# of the shell process for creating uniquely named temporary files
73
74define INSTALLHDRS_RULE_template
75
76.PHONY: $(3)_MKDIR
77
78$(3)_MKDIR:
79	$$(_v)$$(MKDIR) ./$(3)
80	$$(_v)$$(MKDIR) $(dir $(firstword $(1)))
81
82# Rebuild if unifdef flags change
83$(1): $(3)/.UNIFDEF_FLAGS
84$(3)/.UNIFDEF_FLAGS: ALWAYS | $(3)_MKDIR
85	$$(_v)$$(REPLACECONTENTS) $$@ $$(UNIFDEF) $(4)
86
87$(1): $(dir $(firstword $(1)))% : $(if $(2),%,$$(SOURCE)/%) | $(3)_MKDIR
88	@$$(LOG_INSTALLHDR) "$$*"
89	$$(_v)$$(UNIFDEF) $(4) $$< > ./$(3)/$$*.unifdef.$$$$$$$$;		\
90	if [ $$$$? -eq 2 ]; then						\
91		$(ERR) Parse failure for $$<;					\
92		exit 1;								\
93	fi;									\
94	$$(DECOMMENT) ./$(3)/$$*.unifdef.$$$$$$$$ r >				\
95		./$(3)/$$*.strip.$$$$$$$$ || exit 1;				\
96	if [ -s ./$(3)/$$*.strip.$$$$$$$$ ]; then				\
97		$$(INSTALL) $$(INSTALL_FLAGS) ./$(3)/$$*.unifdef.$$$$$$$$ $$@ || exit 1;	\
98	fi;									\
99	$$(RM) ./$(3)/$$*.unifdef.$$$$$$$$ ./$(3)/$$*.strip.$$$$$$$$
100endef
101
102# $(1) is the list of install paths
103# $(2) is the source path pattern (using % to match with $(5)) or source file
104# $(3) is the local temp directory for processing
105# $(4) is the unifdef flags
106# $(5) is the destination directory (when pattern matching) or empty
107#
108# $$$$$$$$ is a double-escaped "$$" to represent the current pid
109# of the shell process for creating uniquely named temporary files
110
111define INSTALLPYTHON_RULE_template
112
113.PHONY: $(3)_MKDIR
114
115$(3)_MKDIR:
116	$$(_v)$$(MKDIR) ./$(3)
117
118# Rebuild if unifdef flags change
119$(1): $(3)/.UNIFDEF_FLAGS
120$(3)/.UNIFDEF_FLAGS: ALWAYS | $(3)_MKDIR
121	$$(_v)$$(REPLACECONTENTS) $$@ $$(UNIFDEF) -t $(4)
122
123$(1): $(5)% : $(2) | $(3)_MKDIR
124	@$$(LOG_INSTALLPY) "$$*"
125	$$(_v)$$(MKDIR) $$(dir $$@) $$(dir ./$(3)/$$*)
126	$$(_v)$$(UNIFDEF) -t $(4) $$< > ./$(3)/$$*.unifdef.$$$$$$$$$$(suffix $$*); \
127	if [ $$$$? -eq 2 ]; then						\
128		$(ERR) Parse failure for $$<;				\
129		exit 1;							\
130	fi;								\
131	$$(INSTALL) $$(DATA_INSTALL_FLAGS) \
132		./$(3)/$$*.unifdef.$$$$$$$$$$(suffix $$*) $$@ || exit 1; \
133	$$(PYTHON) $$(LLDBMACROS_SOURCE)/lint/syntax_checker.py \
134		./$(3)/$$*.unifdef.$$$$$$$$$$(suffix $$*) $$(_vstdout) || exit 1; \
135	$$(RM) ./$(3)/$$*.unifdef.$$$$$$$$$$(suffix $$*)
136	$$(_v)if [ -n "$(5)" ]; then $$(TOUCH) "$(5)"; fi
137endef
138
139# Template for Libsyscall header unifdef postprocessing in DSTROOT
140# $(1) is the install path
141# $(2) is the unifdef flags
142
143define LIBSYSCALL_DO_UNIFDEF_HEADERS_RULE_template
144do_unifdef_headers::
145	$$(_v)[ \! -d "$(1)" ] || $$(FIND) -x "$(1)"  -type f \( -name \*.h -o \
146		-name \*.defs -o -name \*.iig -o -name \*.modulemap \) \
147		-execdir $$(UNIFDEF) $(2) -o {} {} \;
148.PHONY: do_unifdef_headers
149endef
150
151# Helper function to call a verifier
152# Generally, a verifier is a function that post-processes a .o file to validate
153# some characteristics.
154#
155# This ensures that the output .o file is renamed if the verifier rejects the
156# input or fails. This forces the .o file to be re-generated & re-verified if
157# another build is run.
158#
159# Note: currently, it is possible to end up in an inconsistent state by
160# Ctrl+C-ing in the middle of a verifier run, causing a .o file that would
161# have failed verification to still exist as a .o instead o a .o.unverified.
162# The next build should be a "clean" build to prevent the .o file avoiding
163# verification.
164#
165# Any stderr output from the verifier is printed with an "error:" prefix.
166#
167# $(1) is the name of the verifier to call
168# $(2) is the name of the .o file to pass to the verifier
169define VERIFY
170{ ERROR_OUTPUT="$$({ $(call $(1),$(2)) } 2>&1 1>&3)"; } 3>&1; \
171RETURN=$$?; \
172$(ERR) "$$($(SED) -e 's/^/error: /' <<< "$$ERROR_OUTPUT")"; \
173if [ $$RETURN -ne 0 ]; then \
174	UNVERIFIED_FILE=$(@:o=o.unverified) ; \
175	$(MV) '$(2)' "$$UNVERIFIED_FILE"; \
176	$(ERR) "error: Moved object file $(2) with verifier failures to $$PWD/$$UNVERIFIED_FILE"; \
177	exit $$RETURN; \
178fi;
179endef
180
181# Verifier to ensure no UBSan runtime calls generated in a file
182# Compile with -fsanitize=... and WITHOUT -fsanitize-trap
183#
184# On failure, the build will fail and any offending symbols will be printed
185# along with a partial disassembly. A full disassembly of the object file may
186# also be useful, e.g.:
187# $ objdump -dSrl BUILD/obj/DEVELOPMENT_.../osfmk/DEVELOPMENT/vm_sanitize.o
188#
189# Note that objdump will not work on builds with LTO enabled, since the
190# intermediate files are LLVM bitcode instead of traditional object files.
191#
192# $(1) is the name of the .o file to be verified
193define VERIFIER_NO_UBSAN_CHECKS
194MATCHES="$$($(NM) -j '$(1)' | $(GREP) '^___ubsan')"; \
195if [[ ! -z "$$MATCHES" ]]; then \
196	$(ECHO) 1>&2 'UBSan verifier failure for $<:'; \
197	DISASM="$$($(OBJDUMP) -dSrl '$(1)' | $(GREP) -E '___ubsan|^;' | $(GREP) -B2 '___ubsan')"; \
198	if [[ -z "$$DISASM" ]]; then \
199		$(ECHO) 1>&2 "Failed to disassemble intermediate object file. It may be a bitcode file if LTO is enabled."; \
200	else \
201		$(ECHO) 1>&2 "$$($(SED) -e '/^--$$/d' -e 's/^/    /' <<< "$$DISASM")"; \
202	fi; \
203	exit 1; \
204fi;
205endef
206
207#
208# Empty the install lists of non-host and non-exclave headers if building the
209# host headers alias and exclave headers aliases. Separately, export headers
210# are also emptied for exclaves (but not for host headers) with
211# EXPORTHDRS_SKIP_EXCLAVES.
212#
213
214ifeq ($(INSTALLHDRS_SKIP_HOST),YES)
215
216INSTALL_MI_LIST =
217INSTALL_MI_GEN_LIST =
218INSTALL_IF_MI_LIST =
219INSTALL_IF_MI_GEN_LIST =
220INSTALL_DRIVERKIT_MI_LIST =
221INSTALL_DRIVERKIT_MI_GEN_LIST =
222INSTALL_KF_MI_LIST =
223INSTALL_KF_MI_GEN_LIST =
224INSTALL_MI_LCL_LIST =
225INSTALL_MI_LCL_GEN_LIST =
226INSTALL_IF_MI_LCL_LIST =
227INSTALL_IF_MI_LCL_GEN_LIST =
228INSTALL_SF_MI_LCL_LIST =
229INSTALL_SF_MI_LCL_GEN_LIST =
230INSTALL_DRIVERKIT_MI_LCL_LIST =
231INSTALL_DRIVERKIT_MI_LCL_GEN_LIST =
232INSTALL_KF_MI_LCL_LIST =
233INSTALL_KF_MI_LCL_GEN_LIST =
234INSTALL_MD_LIST =
235INSTALL_MD_GEN_LIST =
236INSTALL_DRIVERKIT_MD_LIST =
237INSTALL_DRIVERKIT_MD_GEN_LIST =
238INSTALL_KF_MD_LIST =
239INSTALL_KF_MD_GEN_LIST =
240INSTALL_MD_LCL_LIST =
241INSTALL_MD_LCL_GEN_LIST =
242INSTALL_SF_MD_LCL_LIST =
243INSTALL_SF_MD_LCL_GEN_LIST =
244INSTALL_DRIVERKIT_MD_LCL_LIST =
245INSTALL_DRIVERKIT_MD_LCL_GEN_LIST =
246INSTALL_KF_MD_LCL_LIST =
247INSTALL_KF_MD_LCL_GEN_LIST =
248INSTALL_KF_LIBCXX_MI_LIST =
249
250# If there are no headers then there can be no module maps.
251INSTALLHDRS_MODULEMAPS_SKIP_HOST = YES
252
253endif
254
255ifeq ($(INSTALLHDRS_MODULEMAPS_SKIP_HOST),YES)
256INSTALL_MODULEMAP_MI_LIST =
257INSTALL_MODULEMAP_MI_LCL_LIST =
258INSTALL_MODULEMAP_MD_LIST =
259INSTALL_MODULEMAP_MD_LCL_LIST =
260endif
261
262#
263# Machine-independent (public) files
264#
265
266INSTALL_MI_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LIST))
267INSTALL_MI_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_GEN_LIST))
268INSTALL_MODULEMAP_MI_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MODULEMAP_MI_DIR)/,$(INSTALL_MODULEMAP_MI_LIST))
269
270$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_INC_FILES),,incmidir,$(SINCFRAME_UNIFDEF)))
271$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_INC_GEN_FILES),1,incmigendir,$(SINCFRAME_UNIFDEF)))
272$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MODULEMAP_MI_INC_FILES),,mmincmidir,-t $(DATA_UNIFDEF)))
273
274INSTALL_IF_MI_FILES = $(addprefix $(DSTROOT)/$(IINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_IF_MI_LIST))
275INSTALL_IF_MI_GEN_FILES = $(addprefix $(DSTROOT)/$(IINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_IF_MI_GEN_LIST))
276
277$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_IF_MI_FILES),,iincmidir,$(SINCFRAME_UNIFDEF)))
278$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_IF_MI_GEN_FILES),1,iincmigendir,$(SINCFRAME_UNIFDEF)))
279
280ifeq ($(DRIVERKIT),1)
281INSTALL_DRIVERKIT_MI_INC_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_DRIVERKIT_MI_LIST))
282INSTALL_DRIVERKIT_MI_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_DRIVERKIT_MI_GEN_LIST))
283
284$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MI_INC_FILES),,dkincmidir,$(DKINCFRAME_UNIFDEF)))
285$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MI_INC_GEN_FILES),1,dkincmigendir,$(DKINCFRAME_UNIFDEF)))
286endif
287
288ifeq ($(EXCLAVEKIT),1)
289INSTALL_EXCLAVEKIT_MI_INC_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVEKIT_MI_LIST))
290INSTALL_EXCLAVEKIT_MI_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVEKIT_MI_GEN_LIST))
291
292$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MI_INC_FILES),,ekincmidir,$(EKINCFRAME_UNIFDEF)))
293$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MI_INC_GEN_FILES),1,ekincmigendir,$(EKINCFRAME_UNIFDEF)))
294endif
295
296ifeq ($(EXCLAVECORE),1)
297INSTALL_EXCLAVECORE_MI_INC_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECOREINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVECORE_MI_LIST))
298INSTALL_EXCLAVECORE_MI_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECOREINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVECORE_MI_GEN_LIST))
299
300$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MI_INC_FILES),,ecincmidir,$(ECINCFRAME_UNIFDEF)))
301$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MI_INC_GEN_FILES),1,ecincmigendir,$(ECINCFRAME_UNIFDEF)))
302endif
303
304INSTALL_KF_MI_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LIST))
305INSTALL_KF_MI_GEN_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_GEN_LIST))
306
307$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_FILES),,kincmidir,$(KINCFRAME_UNIFDEF)))
308$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_GEN_FILES),1,kincmigendir,$(KINCFRAME_UNIFDEF)))
309
310INSTALL_LIBCXX_MI_FILES = $(addprefix $(DSTROOT)/$(KLIBCXXINCDIR)/, $(INSTALL_KF_LIBCXX_MI_LIST))
311
312$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_LIBCXX_MI_FILES),,cxxmidir,$(LIBCXXINCFRAME_UNIFDEF)))
313
314#
315# Machine-independent local (private) files
316#
317
318INSTALL_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LCL_LIST))
319INSTALL_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LCL_GEN_LIST))
320INSTALL_MODULEMAP_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MODULEMAP_MI_DIR)/,$(INSTALL_MODULEMAP_MI_LCL_LIST))
321
322$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_LCL_FILES),,pincmidir,$(SPINCFRAME_UNIFDEF)))
323$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_LCL_GEN_FILES),1,pincmigendir,$(SPINCFRAME_UNIFDEF)))
324$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MODULEMAP_MI_LCL_FILES),,mmpincmidir,-t $(PDATA_UNIFDEF)))
325
326INSTALL_IF_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(IPINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_IF_MI_LCL_LIST))
327INSTALL_IF_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(IPINCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_IF_MI_LCL_GEN_LIST))
328
329$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_IF_MI_LCL_FILES),,ipincmidir,$(SPINCFRAME_UNIFDEF)))
330$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_IF_MI_LCL_GEN_FILES),1,ipincmigendir,$(SPINCFRAME_UNIFDEF)))
331
332INSTALL_SF_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(SPINCDIR)/$(INSTALL_MI_DIR)/, $(sort $(INSTALL_SF_MI_LCL_LIST)))
333INSTALL_SF_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(SPINCDIR)/$(INSTALL_MI_DIR)/, $(sort $(INSTALL_SF_MI_LCL_GEN_LIST)))
334
335$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_SF_MI_LCL_FILES),,spincmidir,$(SPINCFRAME_UNIFDEF)))
336$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_SF_MI_LCL_GEN_FILES),1,spincmigendir,$(SPINCFRAME_UNIFDEF)))
337
338ifeq ($(DRIVERKIT),1)
339INSTALL_DRIVERKIT_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITLCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_DRIVERKIT_MI_LCL_LIST))
340INSTALL_DRIVERKIT_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITLCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_DRIVERKIT_MI_LCL_GEN_LIST))
341
342$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MI_LCL_FILES),,dkpincmidir,$(DKPINCFRAME_UNIFDEF)))
343$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MI_LCL_GEN_FILES),1,dkpincmigendir,$(DKPINCFRAME_UNIFDEF)))
344endif
345
346ifeq ($(EXCLAVEKIT),1)
347INSTALL_EXCLAVEKIT_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITLCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVEKIT_MI_LCL_LIST))
348INSTALL_EXCLAVEKIT_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITLCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVEKIT_MI_LCL_GEN_LIST))
349
350$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MI_LCL_FILES),,ekpincmidir,$(EKPINCFRAME_UNIFDEF)))
351$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MI_LCL_GEN_FILES),1,ekpincmigendir,$(EKPINCFRAME_UNIFDEF)))
352endif
353
354ifeq ($(EXCLAVECORE),1)
355INSTALL_EXCLAVECORE_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECORELCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVECORE_MI_LCL_LIST))
356INSTALL_EXCLAVECORE_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECORELCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_EXCLAVECORE_MI_LCL_GEN_LIST))
357
358$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MI_LCL_FILES),,ecpincmidir,$(ECPINCFRAME_UNIFDEF)))
359$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MI_LCL_GEN_FILES),1,ecpincmigendir,$(ECPINCFRAME_UNIFDEF)))
360endif
361
362INSTALL_KF_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LCL_LIST))
363INSTALL_KF_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LCL_GEN_LIST))
364
365$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_LCL_FILES),,kpincmidir,$(KPINCFRAME_UNIFDEF)))
366$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_LCL_GEN_FILES),1,kpincmigendir,$(KPINCFRAME_UNIFDEF)))
367
368#
369# Machine-dependent (public) files
370#
371
372INSTALL_MD_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LIST))
373INSTALL_MD_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_GEN_LIST))
374INSTALL_MODULEMAP_MD_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MODULEMAP_MD_DIR)/,$(INSTALL_MODULEMAP_MD_LIST))
375
376$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_INC_FILES),,incdir,$(SINCFRAME_UNIFDEF)))
377$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_INC_GEN_FILES),1,incgendir,$(SINCFRAME_UNIFDEF)))
378$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MODULEMAP_MD_INC_FILES),,mmincdir,-t $(DATA_UNIFDEF)))
379
380ifeq ($(DRIVERKIT),1)
381INSTALL_DRIVERKIT_MD_INC_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITINCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_DRIVERKIT_MD_LIST))
382INSTALL_DRIVERKIT_MD_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITINCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_DRIVERKIT_MD_GEN_LIST))
383
384$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MD_INC_FILES),,dkincdir,$(DKINCFRAME_UNIFDEF)))
385$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MD_INC_GEN_FILES),1,dkincgendir,$(DKINCFRAME_UNIFDEF)))
386endif
387
388ifeq ($(EXCLAVEKIT),1)
389INSTALL_EXCLAVEKIT_MD_INC_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITINCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVEKIT_MD_LIST))
390INSTALL_EXCLAVEKIT_MD_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITINCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVEKIT_MD_GEN_LIST))
391
392$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MD_INC_FILES),,ekincdir,$(EKINCFRAME_UNIFDEF)))
393$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MD_INC_GEN_FILES),1,ekincgendir,$(EKINCFRAME_UNIFDEF)))
394endif
395
396ifeq ($(EXCLAVECORE),1)
397INSTALL_EXCLAVECORE_MD_INC_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECOREINCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVECORE_MD_LIST))
398INSTALL_EXCLAVECORE_MD_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECOREINCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVECORE_MD_GEN_LIST))
399
400$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MD_INC_FILES),,ecincdir,$(ECINCFRAME_UNIFDEF)))
401$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MD_INC_GEN_FILES),1,ecincgendir,$(ECINCFRAME_UNIFDEF)))
402endif
403
404INSTALL_KF_MD_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LIST))
405INSTALL_KF_MD_GEN_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_GEN_LIST))
406
407$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_FILES),,kincdir,$(KINCFRAME_UNIFDEF)))
408$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_GEN_FILES),1,kincgendir,$(KINCFRAME_UNIFDEF)))
409
410#
411# Machine-dependent local (private) files
412#
413
414INSTALL_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MD_DIR)/, $(sort $(INSTALL_MD_LCL_LIST)))
415INSTALL_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MD_DIR)/, $(sort $(INSTALL_MD_LCL_GEN_LIST)))
416INSTALL_MODULEMAP_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MODULEMAP_MD_DIR)/,$(INSTALL_MODULEMAP_MD_LCL_LIST))
417
418$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_LCL_FILES),,pincdir,$(SPINCFRAME_UNIFDEF)))
419$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_LCL_GEN_FILES),1,pincgendir,$(SPINCFRAME_UNIFDEF)))
420$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MODULEMAP_MD_LCL_FILES),,mmpincdir,-t $(PDATA_UNIFDEF)))
421
422INSTALL_SF_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(SPINCDIR)/$(INSTALL_MD_DIR)/, $(sort $(INSTALL_SF_MD_LCL_LIST)))
423INSTALL_SF_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(SPINCDIR)/$(INSTALL_MD_DIR)/, $(sort $(INSTALL_SF_MD_LCL_GEN_LIST)))
424
425$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_SF_MD_LCL_FILES),,spincdir,$(SPINCFRAME_UNIFDEF)))
426$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_SF_MD_LCL_GEN_FILES),1,spincgendir,$(SPINCFRAME_UNIFDEF)))
427
428ifeq ($(DRIVERKIT),1)
429INSTALL_DRIVERKIT_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITLCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_DRIVERKIT_MD_LCL_LIST))
430INSTALL_DRIVERKIT_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(DRIVERKITLCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_DRIVERKIT_MD_LCL_GEN_LIST))
431
432$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MD_LCL_FILES),,dkpincdir,$(DKPINCFRAME_UNIFDEF)))
433$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_DRIVERKIT_MD_LCL_GEN_FILES),1,dkpincgendir,$(DKPINCFRAME_UNIFDEF)))
434endif
435
436ifeq ($(EXCLAVEKIT),1)
437INSTALL_EXCLAVEKIT_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITLCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVEKIT_MD_LCL_LIST))
438INSTALL_EXCLAVEKIT_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVEKITLCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVEKIT_MD_LCL_GEN_LIST))
439
440$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MD_LCL_FILES),,ekpincdir,$(EKPINCFRAME_UNIFDEF)))
441$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVEKIT_MD_LCL_GEN_FILES),1,ekpincgendir,$(EKPINCFRAME_UNIFDEF)))
442endif
443
444ifeq ($(EXCLAVECORE),1)
445INSTALL_EXCLAVECORE_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECORELCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVECORE_MD_LCL_LIST))
446INSTALL_EXCLAVECORE_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(EXCLAVECORELCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_EXCLAVECORE_MD_LCL_GEN_LIST))
447
448$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MD_LCL_FILES),,ecpincdir,$(ECPINCFRAME_UNIFDEF)))
449$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_EXCLAVECORE_MD_LCL_GEN_FILES),1,ecpincgendir,$(ECPINCFRAME_UNIFDEF)))
450endif
451
452INSTALL_KF_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LCL_LIST))
453INSTALL_KF_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LCL_GEN_LIST))
454
455$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_LCL_FILES),,kpincdir,$(KPINCFRAME_UNIFDEF)))
456$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_LCL_GEN_FILES),1,kpincgendir,$(KPINCFRAME_UNIFDEF)))
457
458.PHONY: do_installhdrs_mi
459
460# Double-colon rule so that MakeInc.kernel can add custom behaviors
461do_installhdrs_mi:: $(INSTALL_MI_INC_FILES) $(INSTALL_MI_INC_GEN_FILES) $(INSTALL_MODULEMAP_MI_INC_FILES) \
462            $(INSTALL_IF_MI_FILES) $(INSTALL_IF_MI_GEN_FILES) \
463		    $(INSTALL_DRIVERKIT_MI_INC_FILES) $(INSTALL_DRIVERKIT_MI_INC_GEN_FILES) \
464		    $(INSTALL_EXCLAVEKIT_MI_INC_FILES) $(INSTALL_EXCLAVEKIT_MI_INC_GEN_FILES) \
465			$(INSTALL_EXCLAVECORE_MI_INC_FILES) $(INSTALL_EXCLAVECORE_MI_INC_GEN_FILES) \
466		    $(INSTALL_KF_MI_FILES) $(INSTALL_KF_MI_GEN_FILES) \
467		    $(INSTALL_MI_LCL_FILES) $(INSTALL_MI_LCL_GEN_FILES) $(INSTALL_MODULEMAP_MI_LCL_FILES) \
468            $(INSTALL_IF_MI_LCL_FILES) $(INSTALL_IF_MI_LCL_GEN_FILES) \
469		    $(INSTALL_SF_MI_LCL_FILES) $(INSTALL_SF_MI_LCL_GEN_FILES) \
470		    $(INSTALL_DRIVERKIT_MI_LCL_FILES) $(INSTALL_DRIVERKIT_MI_LCL_GEN_FILES) \
471		    $(INSTALL_KF_MI_LCL_FILES) $(INSTALL_KF_MI_LCL_GEN_FILES) \
472			$(INSTALL_LIBCXX_MI_FILES) \
473			$(INSTALL_EXCLAVEKIT_MI_LCL_FILES) $(INSTALL_EXCLAVEKIT_MI_LCL_GEN_FILES) \
474			$(INSTALL_EXCLAVECORE_MI_LCL_FILES) $(INSTALL_EXCLAVECORE_MI_LCL_GEN_FILES)
475	@:
476
477.PHONY: do_installhdrs_md
478
479do_installhdrs_md: $(INSTALL_MD_INC_FILES) $(INSTALL_MD_INC_GEN_FILES) $(INSTALL_MODULEMAP_MD_INC_FILES) \
480		   $(INSTALL_DRIVERKIT_MD_INC_FILES) $(INSTALL_DRIVERKIT_MD_INC_GEN_FILES) \
481		   $(INSTALL_EXCLAVEKIT_MD_INC_FILES) $(INSTALL_EXCLAVEKIT_MD_INC_GEN_FILES) \
482		   $(INSTALL_EXCLAVECORE_MD_INC_FILES) $(INSTALL_EXCLAVECORE_MD_INC_GEN_FILES) \
483		   $(INSTALL_KF_MD_FILES) $(INSTALL_KF_MD_GEN_FILES) \
484		   $(INSTALL_MD_LCL_FILES) $(INSTALL_MD_LCL_GEN_FILES) $(INSTALL_MODULEMAP_MD_LCL_FILES) \
485		   $(INSTALL_SF_MD_LCL_FILES) $(INSTALL_SF_MD_LCL_GEN_FILES) \
486		   $(INSTALL_DRIVERKIT_MD_LCL_FILES) $(INSTALL_DRIVERKIT_MD_LCL_GEN_FILES) \
487		   $(INSTALL_EXCLAVEKIT_MD_LCL_FILES) $(INSTALL_EXCLAVEKIT_MD_LCL_GEN_FILES) \
488		   $(INSTALL_EXCLAVECORE_MD_LCL_FILES) $(INSTALL_EXCLAVECORE_MD_LCL_GEN_FILES) \
489		   $(INSTALL_KF_MD_LCL_FILES) $(INSTALL_KF_MD_LCL_GEN_FILES)
490	@:
491
492#
493# Generic Export rules
494#
495EXPORT_MI_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/, $(EXPORT_MI_LIST))
496EXPORT_MI_GEN_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/, $(EXPORT_MI_GEN_LIST))
497
498.PHONY: EXP_MI_INC_DIR
499
500EXP_MI_INC_DIR:
501	$(_v)$(MKDIR) $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)
502
503$(EXPORT_MI_GEN_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/% : % | EXP_MI_INC_DIR
504	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS_RO) $< $@
505
506$(EXPORT_MI_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/% : $(SOURCE)/% | EXP_MI_INC_DIR
507	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS_RO) $< $@
508
509EXPORT_MD_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/, $(EXPORT_MD_LIST))
510EXPORT_MD_GEN_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/, $(EXPORT_MD_GEN_LIST))
511
512.PHONY: EXP_MD_INC_DIR
513
514EXP_MD_INC_DIR:
515	$(_v)$(MKDIR) $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)
516
517$(EXPORT_MD_GEN_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/% : % | EXP_MD_INC_DIR
518	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS_RO) $< $@
519
520$(EXPORT_MD_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/% : $(SOURCE)/% | EXP_MD_INC_DIR
521	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS_RO) $< $@
522
523.PHONY: do_exporthdrs_mi
524
525do_exporthdrs_mi: $(EXPORT_MI_GEN_INC_FILES) $(EXPORT_MI_INC_FILES)
526	@:
527
528.PHONY: do_exporthdrs_md
529
530do_exporthdrs_md: $(EXPORT_MD_GEN_INC_FILES)  $(EXPORT_MD_INC_FILES)
531	@:
532
533#
534# Generic Compilation rules
535#
536
537#
538# Compilation rules to generate .o from .s
539#
540
541S_RULE_0=@$(LOG_AS) "$@"
542S_RULE_1A=$(_v)$(S_KCC) -c $(SFLAGS) -MD -MF $(@:o=d) -MJ $(@:o=o.json) -MP $($@_SFLAGS_ADD) $(INCFLAGS) $($@_INCFLAGS)
543S_RULE_1B=$(<F)
544S_RULE_2=
545
546#
547# Compilation rules to generate .o from .c for normal files
548#
549C_RULE_0=@$(LOG_CC) "$@"
550C_RULE_1A=$(_v)$(KCC) -c $(filter-out $($@_CFLAGS_RM), $(CFLAGS) $(CWARNFLAGS)) -MD -MF $(@:o=d) -MJ $(@:o=o.json) -MP $($@_CFLAGS_ADD) $($@_CWARNFLAGS_ADD) $(INCFLAGS) $($@_INCFLAGS)
551C_RULE_1B=$(<F)
552C_RULE_2=
553
554C_RULE_3=@$(if $($@_VERIFIER), $(LOG_VERIFIER) "$@")
555C_RULE_4=@$(if $($@_VERIFIER), $(call VERIFY,$($@_VERIFIER),$@))
556
557#
558# Compilation rules to generate .o from .c for driver files
559#
560C_RULE_0_D=$(C_RULE_0)
561C_RULE_1A_D=$(C_RULE_1A)
562C_RULE_1B_D=$(C_RULE_1B)
563C_RULE_2_D=$(C_RULE_2)
564C_RULE_3_D=$(C_RULE_3)
565C_RULE_4_D=$(C_RULE_4)
566
567#
568# Compilation rules to generate .co from .cp or .cpo from .cpp
569#   The config tool slickly changes the last source filename char to 'o'
570#   for the object filename.
571P_RULE_0=@$(LOG_CXX) "$@"
572P_RULE_1A=$(_v)$(KC++) -o $@ -c $(CXXFLAGS) $(filter-out $($@_CFLAGS_RM), $(CFLAGS) $(CXXWARNFLAGS)) -MD -MF $(@:o=d) -MJ $(@:o=o.json) -MP $($@_CFLAGS_ADD) $($@_CXXWARNFLAGS_ADD) $(INCFLAGS) $($@_INCFLAGS)
573P_RULE_1B=$(<F)
574P_RULE_2=
575
576P_RULE_3=@$(if $($@_VERIFIER), $(LOG_VERIFIER) "$@")
577P_RULE_4=@$(if $($@_VERIFIER), $(call VERIFY,$($@_VERIFIER),$@))
578
579#
580# Explain how to make the bsd syscall list
581#
582$(TARGET)/bsd.syscalls.master: $(SRCROOT)/bsd/kern/syscalls.master $(MAKESYSCALLS)
583	@$(LOG_GENERATE) "$(@F)$(Color0) from $(ColorF)$<$(Color0)"
584	$(_v)$(UNIFDEF) $(SEED_DEFINES) $< > $@;	\
585	if [ $$? -eq 2 ]; then				\
586		$(ERR) Parse failure for $<;		\
587		exit 1;					\
588	fi
589
590.PHONY: do_build_all
591
592# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
593# in their local Makefiles. Those that do will use a "::" rule to augment this.
594do_build_all::
595	@:
596
597.PHONY: do_build_install_primary
598
599# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
600# in their local Makefiles. Those that do will use a "::" rule to augment this.
601do_build_install_primary::
602	@:
603
604.PHONY: do_build_install_non_primary
605
606# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
607# in their local Makefiles. Those that do will use a "::" rule to augment this.
608do_build_install_non_primary::
609	@:
610
611INSTALL_MAN_FILES = $(addprefix $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/, $(INSTALL_MAN_LIST))
612
613.PHONY: INSTALL_MAN_DIR
614
615INSTALL_MAN_DIR:
616	$(_v)$(MKDIR) $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)
617
618$(INSTALL_MAN_FILES): $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/% : % | INSTALL_MAN_DIR
619	@$(LOG_MAN) "$*"
620	$(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@
621
622define MAN_LINKS_RULE_template
623$$(DSTROOT)/$$(MANDIR)/$$(INSTALL_MAN_DIR)/$(2): $$(DSTROOT)/$$(MANDIR)/$$(INSTALL_MAN_DIR)/$(1)
624	@$$(LOG_MANLINK) "$(2)"
625	$(_v)ln -f $$< $$@
626endef
627
628function_generate_man_links_rules = $(if $(word 1,$(1)),$(eval $(call MAN_LINKS_RULE_template,$(word 1,$(1)),$(word 2,$(1)))) $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/$(word 2,$(1)) $(call function_generate_man_links_rules,$(wordlist 3,$(words $(1)),$(1))))
629
630INSTALL_MAN_FILES_LINKS = $(call function_generate_man_links_rules,$(INSTALL_MAN_LINKS))
631
632.PHONY: do_installman
633
634do_installman: $(INSTALL_MAN_FILES) $(INSTALL_MAN_FILES_LINKS)
635	@:
636
637.PHONY: do_textfiles_install do_textfiles_install_mi do_textfiles_install_md
638
639# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
640# in their local Makefiles. Those that do will use a "::" rule to augment this.
641do_textfiles_install_mi:: do_installman
642	@:
643
644# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
645# in their local Makefiles. Those that do will use a "::" rule to augment this.
646do_textfiles_install_md::
647	@:
648
649.PHONY: do_build_setup
650
651# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
652# in their local Makefiles. Those that do will use a "::" rule to augment this.
653do_build_setup::
654	@:
655
656.PHONY: do_config_all
657
658# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
659# in their local Makefiles. Those that do will use a "::" rule to augment this.
660do_config_all::
661	@:
662
663.PHONY: do_config_install_primary
664
665# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
666# in their local Makefiles. Those that do will use a "::" rule to augment this.
667do_config_install_primary::
668	@:
669
670.PHONY: do_config_install_variant
671
672# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
673# in their local Makefiles. Those that do will use a "::" rule to augment this.
674do_config_install_variant::
675	@:
676
677.PHONY: do_config_install
678
679# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
680# in their local Makefiles. Those that do will use a "::" rule to augment this.
681do_config_install::
682	@:
683
684# vim: set ft=make:
685