1# -*- mode: makefile;-*-
2#
3# Copyright (C) 1999-2012 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#
11
12#
13# Generic Install rules
14#
15
16ifndef INSTALL_MI_LCL_LIST
17    INSTALL_MI_LCL_LIST = $(INSTALL_MI_LIST)
18endif
19
20ifndef INSTALL_MI_LCL_GEN_LIST
21    INSTALL_MI_LCL_GEN_LIST = $(INSTALL_MI_GEN_LIST)
22endif
23
24ifndef INSTALL_MD_LCL_LIST
25    INSTALL_MD_LCL_LIST = $(INSTALL_MD_LIST)
26endif
27
28ifndef INSTALL_MD_LCL_GEN_LIST
29    INSTALL_MD_LCL_GEN_LIST = $(INSTALL_MD_GEN_LIST)
30endif
31
32ifndef INSTALL_KF_MI_LCL_LIST
33    INSTALL_KF_MI_LCL_LIST = $(EXPORT_MI_LIST)
34endif
35
36ifndef INSTALL_KF_MI_LCL_GEN_LIST
37    INSTALL_KF_MI_LCL_GEN_LIST = $(EXPORT_MI_GEN_LIST)
38endif
39
40ifndef INSTALL_KF_MD_LCL_LIST
41    INSTALL_KF_MD_LCL_LIST = $(EXPORT_MD_LIST)
42endif
43
44ifndef INSTALL_KF_MD_LCL_GEN_LIST
45    INSTALL_KF_MD_LCL_GEN_LIST = $(EXPORT_MD_GEN_LIST)
46endif
47
48ifndef INSTALL_KF_MI_LIST
49    INSTALL_KF_MI_LIST = $(EXPORT_MI_LIST)
50endif
51
52ifndef INSTALL_KF_MI_GEN_LIST
53    INSTALL_KF_MI_GEN_LIST = $(EXPORT_MI_GEN_LIST)
54endif
55
56ifndef INSTALL_KF_MD_LIST
57    INSTALL_KF_MD_LIST = $(EXPORT_MD_LIST)
58endif
59
60ifndef INSTALL_KF_MD_GEN_LIST
61    INSTALL_KF_MD_GEN_LIST = $(EXPORT_MD_GEN_LIST)
62endif
63
64.PHONY: ALWAYS
65
66ALWAYS:
67
68# $(1) is the list of install paths
69# $(2) is "1" if it's a "GEN"-style rule that looks locally, or else $(SOURCE)
70# $(3) is the local temp directory for processing
71# $(4) is the unifdef flags
72#
73# $$$$$$$$ is a double-escaped "$$" to represent the current pid
74# of the shell process for creating uniquely named temporary files
75
76define INSTALLHDRS_RULE_template
77
78.PHONY: $(3)_MKDIR
79
80$(3)_MKDIR:
81	$$(_v)$$(MKDIR) ./$(3)
82	$$(_v)$$(MKDIR) $(dir $(firstword $(1)))
83
84# Rebuild if unifdef flags change
85$(1): $(3)/.UNIFDEF_FLAGS
86$(3)/.UNIFDEF_FLAGS: ALWAYS | $(3)_MKDIR
87	$$(_v)$$(REPLACECONTENTS) $$@ $$(UNIFDEF) $(4)
88
89$(1): $(dir $(firstword $(1)))% : $(if $(2),%,$$(SOURCE)/%) | $(3)_MKDIR
90	@echo INSTALLHDR $$*
91	$$(_v)$$(UNIFDEF) $(4) $$< > ./$(3)/$$*.unifdef.$$$$$$$$;	\
92	if [ $$$$? -eq 2 ]; then						\
93		echo Parse failure for $$<;				\
94		exit 1;							\
95	fi;								\
96	$$(DECOMMENT) ./$(3)/$$*.unifdef.$$$$$$$$ r >			\
97		./$(3)/$$*.strip.$$$$$$$$ || exit 1;			\
98	if [ -s ./$(3)/$$*.strip.$$$$$$$$ ]; then			\
99		$$(INSTALL) $$(INSTALL_FLAGS) ./$(3)/$$*.unifdef.$$$$$$$$ $$@ || exit 1;	\
100	fi;								\
101	$$(RM) ./$(3)/$$*.unifdef.$$$$$$$$ ./$(3)/$$*.strip.$$$$$$$$
102endef
103
104#
105# Machine-independent (public) files
106#
107
108INSTALL_MI_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LIST))
109INSTALL_MI_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_GEN_LIST))
110
111$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_INC_FILES),,incmidir,$(SINCFRAME_UNIFDEF)))
112$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_INC_GEN_FILES),1,incmigendir,$(SINCFRAME_UNIFDEF)))
113
114INSTALL_KF_MI_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LIST))
115INSTALL_KF_MI_GEN_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_GEN_LIST))
116
117$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_FILES),,kincmidir,$(KINCFRAME_UNIFDEF)))
118$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_GEN_FILES),1,kincmigendir,$(KINCFRAME_UNIFDEF)))
119
120#
121# Machine-independent local (private) files
122#
123
124INSTALL_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LCL_LIST))
125INSTALL_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LCL_GEN_LIST))
126
127$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_LCL_FILES),,pincmidir,$(SPINCFRAME_UNIFDEF)))
128$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MI_LCL_GEN_FILES),1,pincmigendir,$(SPINCFRAME_UNIFDEF)))
129
130INSTALL_KF_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LCL_LIST))
131INSTALL_KF_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LCL_GEN_LIST))
132
133$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_LCL_FILES),,kpincmidir,$(KPINCFRAME_UNIFDEF)))
134$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MI_LCL_GEN_FILES),1,kpincmigendir,$(KPINCFRAME_UNIFDEF)))
135
136#
137# Machine-dependent (public) files
138#
139
140INSTALL_MD_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LIST))
141INSTALL_MD_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_GEN_LIST))
142
143$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_INC_FILES),,incdir,$(SINCFRAME_UNIFDEF)))
144$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_INC_GEN_FILES),1,incgendir,$(SINCFRAME_UNIFDEF)))
145
146INSTALL_KF_MD_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LIST))
147INSTALL_KF_MD_GEN_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_GEN_LIST))
148
149$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_FILES),,kincdir,$(KINCFRAME_UNIFDEF)))
150$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_GEN_FILES),1,kincgendir,$(KINCFRAME_UNIFDEF)))
151
152#
153# Machine-dependent local (private) files
154#
155
156INSTALL_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LCL_LIST))
157INSTALL_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LCL_GEN_LIST))
158
159$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_LCL_FILES),,pincdir,$(SPINCFRAME_UNIFDEF)))
160$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_MD_LCL_GEN_FILES),1,pincgendir,$(SPINCFRAME_UNIFDEF)))
161
162INSTALL_KF_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LCL_LIST))
163INSTALL_KF_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LCL_GEN_LIST))
164
165$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_LCL_FILES),,kpincdir,$(KPINCFRAME_UNIFDEF)))
166$(eval $(call INSTALLHDRS_RULE_template,$(INSTALL_KF_MD_LCL_GEN_FILES),1,kpincgendir,$(KPINCFRAME_UNIFDEF)))
167
168.PHONY: do_installhdrs_mi
169
170# Double-colon rule so that MakeInc.kernel can add custom behaviors
171do_installhdrs_mi:: $(INSTALL_MI_INC_FILES) $(INSTALL_MI_INC_GEN_FILES) $(INSTALL_KF_MI_FILES) $(INSTALL_KF_MI_GEN_FILES) \
172		    $(INSTALL_MI_LCL_FILES) $(INSTALL_MI_LCL_GEN_FILES) $(INSTALL_KF_MI_LCL_FILES) $(INSTALL_KF_MI_LCL_GEN_FILES)
173	@:
174
175.PHONY: do_installhdrs_md
176
177do_installhdrs_md: $(INSTALL_MD_INC_FILES) $(INSTALL_MD_INC_GEN_FILES) $(INSTALL_KF_MD_FILES) $(INSTALL_KF_MD_GEN_FILES) \
178		   $(INSTALL_MD_LCL_FILES) $(INSTALL_MD_LCL_GEN_FILES) $(INSTALL_KF_MD_LCL_FILES) $(INSTALL_KF_MD_LCL_GEN_FILES)
179	@:
180
181#
182# Generic Export rules
183#
184EXPORT_MI_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/, $(EXPORT_MI_LIST))
185EXPORT_MI_GEN_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/, $(EXPORT_MI_GEN_LIST))
186
187.PHONY: EXP_MI_INC_DIR
188
189EXP_MI_INC_DIR:
190	$(_v)$(MKDIR) $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)
191
192$(EXPORT_MI_GEN_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/% : % | EXP_MI_INC_DIR
193	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
194
195$(EXPORT_MI_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/% : $(SOURCE)/% | EXP_MI_INC_DIR
196	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
197
198EXPORT_MD_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/, $(EXPORT_MD_LIST))
199EXPORT_MD_GEN_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/, $(EXPORT_MD_GEN_LIST))
200
201.PHONY: EXP_MD_INC_DIR
202
203EXP_MD_INC_DIR:
204	$(_v)$(MKDIR) $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)
205
206$(EXPORT_MD_GEN_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/% : % | EXP_MD_INC_DIR
207	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
208
209$(EXPORT_MD_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/% : $(SOURCE)/% | EXP_MD_INC_DIR
210	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
211
212.PHONY: do_exporthdrs_mi
213
214do_exporthdrs_mi: $(EXPORT_MI_GEN_INC_FILES) $(EXPORT_MI_INC_FILES)
215	@:
216
217.PHONY: do_exporthdrs_md
218
219do_exporthdrs_md: $(EXPORT_MD_GEN_INC_FILES)  $(EXPORT_MD_INC_FILES)
220	@:
221
222#
223# Generic Compilation rules
224#
225
226#
227# Compilation rules to generate .o from .s
228#
229
230S_RULE_0=@echo AS $@
231S_RULE_1A=$(_v)${S_KCC} -c ${SFLAGS} -MD -MF $(@:o=d) -MP ${$@_SFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS}
232S_RULE_1B=$(<F)
233S_RULE_2=
234
235#
236# Compilation rules to generate .o from .c for normal files
237#
238C_RULE_0=@echo CC $@
239C_RULE_1A=$(_v)${KCC} -c ${filter-out ${$@_CFLAGS_RM}, ${CFLAGS} ${CWARNFLAGS}} -MD -MF $(@:o=d) -MP ${$@_CFLAGS_ADD} ${$@_CWARNFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS} 
240C_RULE_1B=$(<F)
241ifeq ($(BUILD_MACHO_OBJ),0)
242C_RULE_2=
243else ifeq ($(DO_CTFCONVERT),1)
244C_RULE_2=$(_v)if [ -z "${$@_SKIP_CTFCONVERT}" ]; then ${CTFCONVERT} -l xnu -v -o $@.ctf $@ > /dev/null || true; fi
245else
246C_RULE_2=
247endif
248ifeq ($(DO_CTFMACHO), 1)
249C_CTFRULE_1A=$(_v)${KCC} -o $@.non_lto -c ${filter-out ${$@_CFLAGS_RM}, ${CFLAGS} ${CWARNFLAGS}} ${$@_CFLAGS_ADD} ${$@_CWARNFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS} $(CFLAGS_NOLTO_FLAG) 
250C_CTFRULE_1B=$(<F)
251C_CTFRULE_2=$(_v)if [ -z "${$@_SKIP_CTFCONVERT}" ]; then ${CTFCONVERT} -l xnu -v -o $@.non_lto.ctf $@.non_lto > /dev/null || true; fi
252else
253C_CTFRULE_1A=@true 
254C_CTFRULE_1B=
255C_CTFRULE_2=@true 
256endif
257
258#
259# Compilation rules to generate .o from .c for driver files
260#
261C_RULE_0_D=${C_RULE_0}
262C_RULE_1A_D=${C_RULE_1A}
263C_RULE_1B_D=${C_RULE_1B}
264C_RULE_2_D=${C_RULE_2}
265C_CTFRULE_1A_D=${C_CTFRULE_1A}
266C_CTFRULE_1B_D=${C_CTFRULE_1B}
267C_CTFRULE_2_D=${C_CTFRULE_2}
268
269#
270# Compilation rules to generate .co from .cp or .cpo from .cpp
271#   The config tool slickly changes the last source filename char to 'o'
272#   for the object filename.
273P_RULE_0=@echo C++ $@
274P_RULE_1A=$(_v)${KC++} -o $@ -c ${CXXFLAGS} ${filter-out ${$@_CFLAGS_RM}, ${CFLAGS} ${CXXWARNFLAGS}} -MD -MF $(@:o=d) -MP ${$@_CFLAGS_ADD} ${$@_CXXWARNFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS} 
275P_RULE_1B=$(<F)
276P_RULE_2=
277P_CTFRULE_1A=@true 
278P_CTFRULE_1B=
279P_CTFRULE_2=@true 
280
281
282.PHONY: do_build_all
283
284# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
285# in their local Makefiles. Those that do will use a "::" rule to augment this.
286do_build_all::
287	@:
288
289.PHONY: do_build_install_primary
290
291# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
292# in their local Makefiles. Those that do will use a "::" rule to augment this.
293do_build_install_primary::
294	@:
295
296.PHONY: do_build_install_non_primary
297
298# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
299# in their local Makefiles. Those that do will use a "::" rule to augment this.
300do_build_install_non_primary::
301	@:
302
303INSTALL_MAN_FILES = $(addprefix $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/, $(INSTALL_MAN_LIST))
304
305.PHONY: INSTALL_MAN_DIR
306
307INSTALL_MAN_DIR:
308	$(_v)$(MKDIR) $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)
309
310$(INSTALL_MAN_FILES): $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/% : % | INSTALL_MAN_DIR
311	@echo MAN $*
312	$(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@
313
314define MAN_LINKS_RULE_template
315$$(DSTROOT)/$$(MANDIR)/$$(INSTALL_MAN_DIR)/$(2): $$(DSTROOT)/$$(MANDIR)/$$(INSTALL_MAN_DIR)/$(1)
316	@echo MANLINK $(2)
317	$(_v)ln -f $$< $$@
318endef
319
320function_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))))
321
322INSTALL_MAN_FILES_LINKS = $(call function_generate_man_links_rules,$(INSTALL_MAN_LINKS))
323
324.PHONY: do_installman
325
326do_installman: $(INSTALL_MAN_FILES) $(INSTALL_MAN_FILES_LINKS)
327	@:
328
329.PHONY: do_textfiles_install
330
331# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
332# in their local Makefiles. Those that do will use a "::" rule to augment this.
333do_textfiles_install:: do_installman
334	@:
335
336.PHONY: do_build_setup
337
338# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
339# in their local Makefiles. Those that do will use a "::" rule to augment this.
340do_build_setup::
341	@:
342
343.PHONY: do_config_all
344
345# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
346# in their local Makefiles. Those that do will use a "::" rule to augment this.
347do_config_all::
348	@:
349
350.PHONY: do_config_install
351
352# Do-nothing rule, since not all levels of the recursive hierarchy might implement this
353# in their local Makefiles. Those that do will use a "::" rule to augment this.
354do_config_install::
355	@:
356
357# vim: set ft=make:
358