1export MakeInc_cmd=${SRCROOT}/makedefs/MakeInc.cmd
2export MakeInc_def=${SRCROOT}/makedefs/MakeInc.def
3export MakeInc_rule=${SRCROOT}/makedefs/MakeInc.rule
4export MakeInc_dir=${SRCROOT}/makedefs/MakeInc.dir
5
6include $(MakeInc_cmd)
7include $(MakeInc_def)
8
9
10MD_SUPPORTED_KPI_FILENAME = SupportedKPIs-${CURRENT_ARCH_CONFIG_LC}.txt
11MI_SUPPORTED_KPI_FILENAME = SupportedKPIs-all-archs.txt
12
13INSTALL_KEXT_DIR = $(DSTROOT)$(INSTALL_EXTENSIONS_DIR)
14
15KEXT_PLIST_LIST = \
16	System.kext/Info.plist \
17	System.kext/PlugIns/AppleNMI.kext/Info.plist \
18	System.kext/PlugIns/ApplePlatformFamily.kext/Info.plist \
19	System.kext/PlugIns/IONVRAMFamily.kext/Info.plist \
20	System.kext/PlugIns/IOSystemManagement.kext/Info.plist
21
22SYMBOL_COMPONENT_LIST =	\
23        BSDKernel	\
24        IOKit		\
25        Libkern		\
26        Mach		\
27        MACFramework	\
28        Unsupported	\
29        Private
30
31KEXT_MACHO_LIST = $(foreach symbolset,$(filter-out Dummy,$(SYMBOL_COMPONENT_LIST)),System.kext/PlugIns/$(symbolset).kext/$(symbolset))
32KEXT_PLIST_LIST += $(foreach symbolset,$(filter-out Dummy,$(SYMBOL_COMPONENT_LIST)),System.kext/PlugIns/$(symbolset).kext/Info.plist)
33
34SYMROOT_INSTALL_KEXT_MACHO_FILES = $(addprefix $(SYMROOT)/,$(KEXT_MACHO_LIST))
35DSTROOT_INSTALL_KEXT_MACHO_FILES = $(addprefix $(INSTALL_KEXT_DIR)/,$(KEXT_MACHO_LIST))
36
37SYMROOT_INSTALL_KEXT_PLISTS = $(addprefix $(SYMROOT)/,$(KEXT_PLIST_LIST))
38DSTROOT_INSTALL_KEXT_PLISTS = $(addprefix $(INSTALL_KEXT_DIR)/,$(KEXT_PLIST_LIST))
39
40EXPORTS_FILES = $(foreach symbolset,$(SYMBOL_COMPONENT_LIST),$(symbolset).exports $(symbolset).$(CURRENT_ARCH_CONFIG_LC).exports) Unused.exports
41
42SYMBOL_SET_BUILD = $(foreach symbolset, $(SYMBOL_COMPONENT_LIST), $(OBJPATH)/$(symbolset).symbolset)
43
44$(OBJPATH)/allsymbols: $(OBJPATH)/mach_kernel
45	$(_v)$(NM) -gj $< > $@
46
47$(SYMBOL_SET_BUILD): $(OBJPATH)/%.symbolset :  %.exports %.$(CURRENT_ARCH_CONFIG_LC).exports $(OBJPATH)/allsymbols
48	@echo SYMBOLSET $* "($(CURRENT_ARCH_CONFIG_LC))"
49	$(_v)$(KEXT_CREATE_SYMBOL_SET)					\
50		$(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG))			\
51		-import $(OBJPATH)/allsymbols				\
52		-export $(SOURCE)/$*.exports				\
53		-export $(SOURCE)/$*.$(CURRENT_ARCH_CONFIG_LC).exports	\
54		-output $@ $(_vstdout)
55
56.PHONY: check_all_exports
57
58check_all_exports: $(OBJPATH)/allsymbols
59	$(_v)$(KEXT_CREATE_SYMBOL_SET)					\
60		$(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG))			\
61		-import $(OBJPATH)/allsymbols				\
62		$(foreach symbolset,$(filter-out Private,$(SYMBOL_COMPONENT_LIST)),	\
63			-export $(SOURCE)/$(symbolset).exports		\
64			-export $(SOURCE)/$(symbolset).$(CURRENT_ARCH_CONFIG_LC).exports)	\
65		-output /dev/null $(_vstdout)
66	$(_v)$(KEXT_CREATE_SYMBOL_SET)					\
67		$(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG))			\
68		-import $(OBJPATH)/allsymbols				\
69		$(foreach symbolset,$(filter-out Unsupported,$(SYMBOL_COMPONENT_LIST)),	\
70			-export $(SOURCE)/$(symbolset).exports		\
71			-export $(SOURCE)/$(symbolset).$(CURRENT_ARCH_CONFIG_LC).exports)	\
72		-output /dev/null $(_vstdout)
73
74$(OBJPATH)/$(MD_SUPPORTED_KPI_FILENAME): $(EXPORTS_FILES)
75	@echo SUPPORTED_KPI "($(CURRENT_ARCH_CONFIG_LC))"
76	$(_v)$(SRCROOT)/config/list_supported.sh $(SOURCE) $(CURRENT_ARCH_CONFIG_LC) $@
77
78$(OBJPATH)/$(MI_SUPPORTED_KPI_FILENAME): $(EXPORTS_FILES)
79	@echo SUPPORTED_KPI "(all)"
80	$(_v)$(SRCROOT)/config/list_supported.sh $(SOURCE) all $@
81
82build_symbol_sets: check_all_exports $(SYMBOL_SET_BUILD) $(OBJPATH)/allsymbols \
83			$(OBJPATH)/$(MD_SUPPORTED_KPI_FILENAME) \
84			$(OBJPATH)/$(MI_SUPPORTED_KPI_FILENAME)
85
86do_config_all::	build_symbol_sets
87
88# There's no simple static pattern rule for these paths, so hardcode dependencies in the command list
89$(SYMROOT_INSTALL_KEXT_MACHO_FILES): ALWAYS
90	$(_v)$(MKDIR) $(dir $@)
91	$(_v)if [ $(OBJROOT)/.symbolset.timestamp -nt $@ ]; then		\
92		echo INSTALLSYM symbolset $(notdir $@) "($(CURRENT_ARCH_CONFIG_LC))";	\
93		$(INSTALL) $(EXEC_INSTALL_FLAGS) $(OBJPATH)/$(@F).symbolset $@;	\
94		cmdstatus=$$?;							\
95	else									\
96		echo INSTALLSYM symbolset $(notdir $@) "($(CURRENT_ARCH_CONFIG_LC))";	\
97		$(LIPO) -create $@ $(OBJPATH)/$(@F).symbolset -output $@ 2>/dev/null || true;	\
98		cmdstatus=$$?;							\
99	fi;									\
100	exit $$cmdstatus
101
102.PHONY: symroot_kext_plists
103
104symroot_kext_plists: $(SYMROOT_INSTALL_KEXT_PLISTS)
105
106$(SYMROOT_INSTALL_KEXT_PLISTS): $(SYMROOT)/% : $(SOURCE)/%
107	$(_v)$(MKDIR) $(dir $@)
108	@echo INSTALLSYM kextplist $*
109	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
110	$(_v)$(NEWVERS) $@ $(_vstdout)
111
112.PHONY: dstroot_kext_plists
113
114dstroot_kext_plists: $(DSTROOT_INSTALL_KEXT_PLISTS)
115
116$(DSTROOT_INSTALL_KEXT_PLISTS): $(INSTALL_KEXT_DIR)/% : $(SYMROOT)/%
117	$(_v)$(MKDIR) $(dir $@)
118	@echo INSTALL kextplist $*
119	$(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@
120
121$(DSTROOT_INSTALL_KEXT_MACHO_FILES): $(INSTALL_KEXT_DIR)/% : $(SYMROOT)/%
122	$(_v)$(MKDIR) $(dir $@)
123	@echo INSTALL $(notdir $@) "($(CURRENT_ARCH_CONFIG_LC))"
124	$(_v)$(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@
125
126$(DSTROOT)/$(KRESDIR)/$(MD_SUPPORTED_KPI_FILENAME) $(DSTROOT)/$(KRESDIR)/$(MI_SUPPORTED_KPI_FILENAME): $(DSTROOT)/$(KRESDIR)/% : $(OBJPATH)/%
127	$(_v)$(MKDIR) $(dir $@)
128	@echo INSTALL $*
129	$(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@
130
131install_symbol_sets:	$(SYMROOT_INSTALL_KEXT_MACHO_FILES) \
132			symroot_kext_plists \
133			$(DSTROOT_INSTALL_KEXT_MACHO_FILES) \
134			dstroot_kext_plists \
135			$(DSTROOT)/$(KRESDIR)/$(MD_SUPPORTED_KPI_FILENAME) \
136			$(DSTROOT)/$(KRESDIR)/$(MI_SUPPORTED_KPI_FILENAME)
137
138do_build_install_primary::	install_symbol_sets
139
140$(OBJPATH)/kernel-kpi.exp: $(EXPORTS_FILES)
141	$(_v)$(SOURCE)/generate_linker_exports.sh $@ $+
142
143.PHONY: build_mach_kernel_exports
144
145build_mach_kernel_exports: $(OBJPATH)/kernel-kpi.exp
146
147do_build_all:: build_mach_kernel_exports
148
149include $(MakeInc_rule)
150include $(MakeInc_dir)
151