1 # -*- mode: makefile;-*-
3 # Copyright (C) 1999-2012 Apple Inc. All rights reserved.
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.
13 # Generic Install rules
16 ifndef INSTALL_MI_LCL_LIST
17 INSTALL_MI_LCL_LIST = $(INSTALL_MI_LIST)
20 ifndef INSTALL_MI_LCL_GEN_LIST
21 INSTALL_MI_LCL_GEN_LIST = $(INSTALL_MI_GEN_LIST)
24 ifndef INSTALL_MD_LCL_LIST
25 INSTALL_MD_LCL_LIST = $(INSTALL_MD_LIST)
28 ifndef INSTALL_MD_LCL_GEN_LIST
29 INSTALL_MD_LCL_GEN_LIST = $(INSTALL_MD_GEN_LIST)
32 ifndef INSTALL_KF_MI_LCL_LIST
33 INSTALL_KF_MI_LCL_LIST = $(EXPORT_MI_LIST)
36 ifndef INSTALL_KF_MI_LCL_GEN_LIST
37 INSTALL_KF_MI_LCL_GEN_LIST = $(EXPORT_MI_GEN_LIST)
40 ifndef INSTALL_KF_MD_LCL_LIST
41 INSTALL_KF_MD_LCL_LIST = $(EXPORT_MD_LIST)
44 ifndef INSTALL_KF_MD_LCL_GEN_LIST
45 INSTALL_KF_MD_LCL_GEN_LIST = $(EXPORT_MD_GEN_LIST)
48 ifndef INSTALL_KF_MI_LIST
49 INSTALL_KF_MI_LIST = $(EXPORT_MI_LIST)
52 ifndef INSTALL_KF_MI_GEN_LIST
53 INSTALL_KF_MI_GEN_LIST = $(EXPORT_MI_GEN_LIST)
56 ifndef INSTALL_KF_MD_LIST
57 INSTALL_KF_MD_LIST = $(EXPORT_MD_LIST)
60 ifndef INSTALL_KF_MD_GEN_LIST
61 INSTALL_KF_MD_GEN_LIST = $(EXPORT_MD_GEN_LIST)
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
73 # $$$$$$$$ is a double-escaped "$$" to represent the current pid
74 # of the shell process for creating uniquely named temporary files
76 define INSTALLHDRS_RULE_template
81 $$(_v)$$(MKDIR) ./$(3)
82 $$(_v)$$(MKDIR) $(dir $(firstword $(1)))
84 # Rebuild if unifdef flags change
85 $(1): $(3)/.UNIFDEF_FLAGS
86 $(3)/.UNIFDEF_FLAGS: ALWAYS | $(3)_MKDIR
87 $$(_v)$$(REPLACECONTENTS) $$@ $$(UNIFDEF) $(4)
89 $(1): $(dir $(firstword $(1)))% : $(if $(2),%,$$(SOURCE)/%) | $(3)_MKDIR
91 $$(_v)$$(UNIFDEF) $(4) $$< > ./$(3)/$$*.unifdef.$$$$$$$$; \
92 if [ $$$$? -eq 2 ]; then \
93 echo Parse failure for $$<; \
96 $$(DECOMMENT) ./$(3)/$$*.unifdef.$$$$$$$$ r > \
97 ./$(3)/$$*.strip.$$$$$$$$ || exit 1; \
98 if [ -s ./$(3)/$$*.strip.$$$$$$$$ ]; then \
99 $$(INSTALL) $$(INSTALL_FLAGS) ./$(3)/$$*.unifdef.$$$$$$$$ $$@ || exit 1; \
101 $$(RM) ./$(3)/$$*.unifdef.$$$$$$$$ ./$(3)/$$*.strip.$$$$$$$$
105 # Machine-independent (public) files
108 INSTALL_MI_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LIST))
109 INSTALL_MI_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_GEN_LIST))
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)))
114 INSTALL_KF_MI_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LIST))
115 INSTALL_KF_MI_GEN_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_GEN_LIST))
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)))
121 # Machine-independent local (private) files
124 INSTALL_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LCL_LIST))
125 INSTALL_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MI_DIR)/, $(INSTALL_MI_LCL_GEN_LIST))
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)))
130 INSTALL_KF_MI_LCL_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LCL_LIST))
131 INSTALL_KF_MI_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MI_DIR)/, $(INSTALL_KF_MI_LCL_GEN_LIST))
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)))
137 # Machine-dependent (public) files
140 INSTALL_MD_INC_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LIST))
141 INSTALL_MD_INC_GEN_FILES = $(addprefix $(DSTROOT)/$(INCDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_GEN_LIST))
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)))
146 INSTALL_KF_MD_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LIST))
147 INSTALL_KF_MD_GEN_FILES = $(addprefix $(DSTROOT)/$(KINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_GEN_LIST))
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)))
153 # Machine-dependent local (private) files
156 INSTALL_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LCL_LIST))
157 INSTALL_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(LCLDIR)/$(INSTALL_MD_DIR)/, $(INSTALL_MD_LCL_GEN_LIST))
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)))
162 INSTALL_KF_MD_LCL_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LCL_LIST))
163 INSTALL_KF_MD_LCL_GEN_FILES = $(addprefix $(DSTROOT)/$(KPINCDIR)/$(EXPORT_MD_DIR)/, $(INSTALL_KF_MD_LCL_GEN_LIST))
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)))
168 .PHONY: do_installhdrs_mi
170 # Double-colon rule so that MakeInc.kernel can add custom behaviors
171 do_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)
175 .PHONY: do_installhdrs_md
177 do_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)
182 # Generic Export rules
184 EXPORT_MI_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/, $(EXPORT_MI_LIST))
185 EXPORT_MI_GEN_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/, $(EXPORT_MI_GEN_LIST))
187 .PHONY: EXP_MI_INC_DIR
190 $(_v)$(MKDIR) $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)
192 $(EXPORT_MI_GEN_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/% : % | EXP_MI_INC_DIR
193 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
195 $(EXPORT_MI_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MI_DIR)/% : $(SOURCE)/% | EXP_MI_INC_DIR
196 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
198 EXPORT_MD_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/, $(EXPORT_MD_LIST))
199 EXPORT_MD_GEN_INC_FILES = $(addprefix $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/, $(EXPORT_MD_GEN_LIST))
201 .PHONY: EXP_MD_INC_DIR
204 $(_v)$(MKDIR) $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)
206 $(EXPORT_MD_GEN_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/% : % | EXP_MD_INC_DIR
207 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
209 $(EXPORT_MD_INC_FILES): $(OBJROOT)/$(EXPDIR)/$(EXPORT_MD_DIR)/% : $(SOURCE)/% | EXP_MD_INC_DIR
210 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
212 .PHONY: do_exporthdrs_mi
214 do_exporthdrs_mi: $(EXPORT_MI_GEN_INC_FILES) $(EXPORT_MI_INC_FILES)
217 .PHONY: do_exporthdrs_md
219 do_exporthdrs_md: $(EXPORT_MD_GEN_INC_FILES) $(EXPORT_MD_INC_FILES)
223 # Generic Compilation rules
227 # Compilation rules to generate .o from .s
231 S_RULE_1A=$(_v)${S_KCC} -c ${SFLAGS} -MD -MF $(@:o=d) -MP ${$@_SFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS}
236 # Compilation rules to generate .o from .c for normal files
239 C_RULE_1A=$(_v)${KCC} -c ${filter-out ${$@_CFLAGS_RM}, ${CFLAGS} ${CWARNFLAGS}} -MD -MF $(@:o=d) -MP ${$@_CFLAGS_ADD} ${$@_CWARNFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS}
241 ifeq ($(BUILD_MACHO_OBJ),0)
243 else ifeq ($(DO_CTFCONVERT),1)
244 C_RULE_2=$(_v)if [ -z "${$@_SKIP_CTFCONVERT}" ]; then ${CTFCONVERT} -l xnu -v -o $@.ctf $@ > /dev/null || true; fi
248 ifeq ($(DO_CTFMACHO), 1)
249 C_CTFRULE_1A=$(_v)${KCC} -o $@.non_lto -c ${filter-out ${$@_CFLAGS_RM}, ${CFLAGS} ${CWARNFLAGS}} ${$@_CFLAGS_ADD} ${$@_CWARNFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS} $(CFLAGS_NOLTO_FLAG)
251 C_CTFRULE_2=$(_v)if [ -z "${$@_SKIP_CTFCONVERT}" ]; then ${CTFCONVERT} -l xnu -v -o $@.non_lto.ctf $@.non_lto > /dev/null || true; fi
259 # Compilation rules to generate .o from .c for driver files
261 C_RULE_0_D=${C_RULE_0}
262 C_RULE_1A_D=${C_RULE_1A}
263 C_RULE_1B_D=${C_RULE_1B}
264 C_RULE_2_D=${C_RULE_2}
265 C_CTFRULE_1A_D=${C_CTFRULE_1A}
266 C_CTFRULE_1B_D=${C_CTFRULE_1B}
267 C_CTFRULE_2_D=${C_CTFRULE_2}
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.
273 P_RULE_0=@echo C++ $@
274 P_RULE_1A=$(_v)${KC++} -o $@ -c ${CXXFLAGS} ${filter-out ${$@_CFLAGS_RM}, ${CFLAGS} ${CXXWARNFLAGS}} -MD -MF $(@:o=d) -MP ${$@_CFLAGS_ADD} ${$@_CXXWARNFLAGS_ADD} ${INCFLAGS} ${$@_INCFLAGS}
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.
289 .PHONY: do_build_install_primary
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.
293 do_build_install_primary::
296 .PHONY: do_build_install_non_primary
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.
300 do_build_install_non_primary::
303 INSTALL_MAN_FILES = $(addprefix $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/, $(INSTALL_MAN_LIST))
305 .PHONY: INSTALL_MAN_DIR
308 $(_v)$(MKDIR) $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)
310 $(INSTALL_MAN_FILES): $(DSTROOT)/$(MANDIR)/$(INSTALL_MAN_DIR)/% : % | INSTALL_MAN_DIR
312 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@
314 define MAN_LINKS_RULE_template
315 $$(DSTROOT)/$$(MANDIR)/$$(INSTALL_MAN_DIR)/$(2): $$(DSTROOT)/$$(MANDIR)/$$(INSTALL_MAN_DIR)/$(1)
320 function_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))))
322 INSTALL_MAN_FILES_LINKS = $(call function_generate_man_links_rules,$(INSTALL_MAN_LINKS))
324 .PHONY: do_installman
326 do_installman: $(INSTALL_MAN_FILES) $(INSTALL_MAN_FILES_LINKS)
329 .PHONY: do_textfiles_install
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.
333 do_textfiles_install:: do_installman
336 .PHONY: do_build_setup
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.
343 .PHONY: do_config_all
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.
350 .PHONY: do_config_install
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.