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# config is not a COMPONENT but we still want to build most files in a TARGET subdir 10override TARGET := $(OBJPATH)/config 11 12MD_SUPPORTED_KPI_FILENAME := SupportedKPIs-${CURRENT_ARCH_CONFIG_LC}.txt 13MI_SUPPORTED_KPI_FILENAME := SupportedKPIs-all-archs.txt 14 15INSTALL_KEXT_DIR = $(DSTROOT)$(INSTALL_EXTENSIONS_DIR) 16 17KEXT_PLIST_LIST := \ 18 System.kext/Info.plist \ 19 System.kext/PlugIns/Kasan.kext/Info.plist \ 20 System.kext/PlugIns/Kcov.kext/Info.plist \ 21 System.kext/PlugIns/AppleNMI.kext/Info.plist \ 22 System.kext/PlugIns/ApplePlatformFamily.kext/Info.plist \ 23 System.kext/PlugIns/IONVRAMFamily.kext/Info.plist \ 24 System.kext/PlugIns/IOSystemManagement.kext/Info.plist 25 26SYMBOL_COMPONENT_LIST := \ 27 BSDKernel \ 28 IOKit \ 29 Libkern \ 30 Mach \ 31 MACFramework \ 32 Unsupported \ 33 Private 34 35SYMBOL_SET_PLIST_COMPONENT_LIST := $(SYMBOL_COMPONENT_LIST) Kasan Kcov 36 37KEXT_PLIST_LIST += $(foreach symbolset,$(SYMBOL_COMPONENT_LIST),System.kext/PlugIns/$(symbolset).kext/Info.plist) 38 39# In general you want it to be possible to have a CPU sub-type's symbol exports 40# alias to the parent type's exports. This is a special-case way to handle it 41# for now: 42ifeq ($(CURRENT_ARCH_CONFIG_LC),x86_64h) 43EXPORT_SOURCE_ARCH_CONFIG_LC := x86_64 44else 45EXPORT_SOURCE_ARCH_CONFIG_LC := $(CURRENT_ARCH_CONFIG_LC) 46endif 47 48EXPORTS_FILES := $(foreach symbolset,$(SYMBOL_COMPONENT_LIST),$(symbolset).exports \ 49 $(symbolset).$(EXPORT_SOURCE_ARCH_CONFIG_LC).exports \ 50 $(notdir $(wildcard $(SOURCE)/$(symbolset).$(EXPORT_SOURCE_ARCH_CONFIG_LC).$(PLATFORM).exports))) \ 51 Unused.exports 52EXPORTS_FILES += Private.Tightbeam.exports 53 54 55Kasan_EXPORTS := $(SRCROOT)/config/Kasan_disabled.exports 56Kcov_EXPORTS := $(SRCROOT)/config/Kcov_disabled.exports 57 58ifneq ($(filter $(CURRENT_KERNEL_CONFIG),$(KCOV_RUNTIME)),) 59Kcov_EXPORTS := $(SRCROOT)/config/Kcov_enabled.exports 60endif 61 62ifeq ($(KASAN),1) 63ifeq ($(CURRENT_ARCH_CONFIG_LC),x86_64h) 64KASAN_ARCH_SUFFIX := x86_64 65else 66KASAN_ARCH_SUFFIX := $(CURRENT_ARCH_CONFIG_LC) 67endif 68Kasan_EXPORTS := $(SRCROOT)/config/Kasan_enabled.$(KASAN_ARCH_SUFFIX).exports 69endif 70 71define symbol_set_template 72$(1)_EXPORTS := $$(addprefix $$(SOURCE)/,$$(filter $(1)%,$$(EXPORTS_FILES))) 73$$(TARGET)/$(1).symbolset: MY_EXPORTS_ARGS := $$(foreach file,$$($(1)_EXPORTS),-export $$(file)) 74$$(TARGET)/$(1).symbolset: $$($(1)_EXPORTS) $$(TARGET)/allsymbols $$(KEXT_CREATE_SYMBOL_SET) 75 @$$(LOG_SYMBOLSET) "$(1)$$(Color0) ($$(ColorLF)$$(CURRENT_ARCH_CONFIG_LC)$$(Color0))" 76 $$(_v)$$(KEXT_CREATE_SYMBOL_SET) \ 77 $$(ARCH_FLAGS_$$(CURRENT_ARCH_CONFIG)) \ 78 -import $$(TARGET)/allsymbols \ 79 $$(MY_EXPORTS_ARGS) \ 80 -output $$@ $$(_vstdout) 81 82SYMBOL_SET_BUILD += $$(TARGET)/$(1).symbolset 83endef 84 85# Each parallel invocation of this target must use a distinct location, as it is 86# not safe to call multiple NEWVERS on the same file concurrently (rdar://66173684) 87define kext_plist_template 88$$(TARGET)/$(1): $$(SOURCE)/$(1) $$(NEWVERS) $$(XNU_VERSION) 89 @$$(LOG_GENERATE) "$(1)" 90 $$(_v)$$(MKDIR) $$(@D) 91 $$(_v)$$(CP) $$< $$@ 92 $$(_v)$$(NEWVERS) $$@ > /dev/null 93 94KEXT_PLIST_BUILD += $$(TARGET)/$(1) 95SYMROOT_INSTALL_KEXT_PLISTS += $$(SYMROOT)/$(1) 96DSTROOT_INSTALL_KEXT_PLISTS += $$(INSTALL_KEXT_DIR)/$(1) 97endef 98 99define symbol_set_plist_template 100$(1)_KEXT_PLIST := $$(filter %/$(1).kext/Info.plist,$$(KEXT_PLIST_LIST)) 101$$(TARGET)/$(1).symbolset.plist: $$(TARGET)/$$($(1)_KEXT_PLIST) $$($(1)_EXPORTS) 102 @$$(LOG_SYMBOLSETPLIST) "$(1)$$(Color0) ($$(ColorLF)$$(CURRENT_ARCH_CONFIG_LC)$$(Color0))" 103 $$(_v)$$(SOURCE)/generate_symbolset_plist.sh $$@ $$+ $$(_vstdout) 104 $$(_v)$$(PLUTIL) -lint -s $$@ 105 106SYMBOL_SET_PLIST_BUILD += $$(TARGET)/$(1).symbolset.plist 107endef 108 109$(foreach symbolset,$(SYMBOL_COMPONENT_LIST),$(eval $(call symbol_set_template,$(symbolset)))) 110$(foreach plist,$(KEXT_PLIST_LIST),$(eval $(call kext_plist_template,$(plist)))) 111$(foreach symbolset,$(SYMBOL_SET_PLIST_COMPONENT_LIST),$(eval $(call symbol_set_plist_template,$(symbolset)))) 112 113$(OBJPATH)/symbolsets.plist: $(SYMBOL_SET_PLIST_BUILD) 114 $(_v)$(SOURCE)/generate_combined_symbolsets_plist.sh $@ $^ $(_vstdout) 115 $(_v)$(PLUTIL) -convert binary1 -s $@ 116 117build_symbol_set_plists: $(KEXT_PLIST_BUILD) $(OBJPATH)/symbolsets.plist 118 119$(TARGET)/allsymbols: $(OBJPATH)/$(KERNEL_FILE_NAME) 120 $(_v)$(NM) -gj $< | sort -u > $@ 121 122check_all_exports: $(TARGET)/allsymbols $(KEXT_CREATE_SYMBOL_SET) 123 $(_v)$(KEXT_CREATE_SYMBOL_SET) \ 124 $(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG)) \ 125 -import $(TARGET)/allsymbols \ 126 $(foreach symbolset,$(filter-out Private,$(SYMBOL_COMPONENT_LIST)), \ 127 -export $(SOURCE)/$(symbolset).exports \ 128 -export $(SOURCE)/$(symbolset).$(EXPORT_SOURCE_ARCH_CONFIG_LC).exports) \ 129 -output /dev/null $(_vstdout) 130 $(_v)$(KEXT_CREATE_SYMBOL_SET) \ 131 $(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG)) \ 132 -import $(TARGET)/allsymbols \ 133 $(foreach symbolset,$(filter-out Unsupported,$(SYMBOL_COMPONENT_LIST)), \ 134 -export $(SOURCE)/$(symbolset).exports \ 135 -export $(SOURCE)/$(symbolset).$(EXPORT_SOURCE_ARCH_CONFIG_LC).exports) \ 136 -output /dev/null $(_vstdout) 137 138$(OBJPATH)/$(MD_SUPPORTED_KPI_FILENAME): $(EXPORTS_FILES) 139 @$(LOG_SUPPORTED_KPI) "$(CURRENT_ARCH_CONFIG_LC)" 140 $(_v)$(SRCROOT)/config/list_supported.sh $(SOURCE) $(EXPORT_SOURCE_ARCH_CONFIG_LC) $@ 141 142$(OBJPATH)/$(MI_SUPPORTED_KPI_FILENAME): $(EXPORTS_FILES) 143 @$(LOG_SUPPORTED_KPI) "all" 144 $(_v)$(SRCROOT)/config/list_supported.sh $(SOURCE) all $@ 145 146build_symbol_sets: check_all_exports $(SYMBOL_SET_BUILD) $(TARGET)/allsymbols \ 147 $(OBJPATH)/$(MD_SUPPORTED_KPI_FILENAME) \ 148 $(OBJPATH)/$(MI_SUPPORTED_KPI_FILENAME) 149 150# Generate rules for symroot fat kexts with dependencies on every corresponding symbolset for each build config. 151# This target must only run from do_config_install for a single build config after the do_config_all phases for 152# all build configs have completed. This ensures every unique slice built by any config is pulled into the fat 153# symbolset kext (note that not all slices are reflected as distinct xnu build config ARCHS!) (rdar://70703349) 154define symroot_symbol_set_template 155$$(SYMROOT_SYSTEM_KEXT_PATH)/$(1).kext/$(1): $$(addsuffix /config/$(1).symbolset, \ 156 $$(addprefix $$(OBJROOT)/,$$(foreach bc,$(BUILD_CONFIGS),$$(call function_convert_build_config_to_objdir,$$(bc))))) 157 @$$(LOG_INSTALLSYM) "$$(Color0)symbolset $$(ColorF)$(1)" 158 $$(_v)$$(MKDIR) $$(@D) 159 $$(_v)$$(LIPO) -create `(echo $$^ | xargs -L 1 lipo -detailed_info) | \ 160 awk '/is architecture/ {s[$$$$6]=$$$$3} END {for (a in s) {print s[a]}}'` -output $$@ $$(_vstdout) 161 162SYMROOT_INSTALL_KEXT_MACHO_FILES += $$(SYMROOT_SYSTEM_KEXT_PATH)/$(1).kext/$(1) 163DSTROOT_INSTALL_KEXT_MACHO_FILES += $$(DSTROOT_SYSTEM_KEXT_PATH)/$(1).kext/$(1) 164endef 165$(foreach symbolset,$(SYMBOL_COMPONENT_LIST),$(eval $(call symroot_symbol_set_template,$(symbolset)))) 166 167$(SYMROOT_INSTALL_KEXT_PLISTS): $(SYMROOT)/% : $(TARGET)/% 168 $(_v)$(MKDIR) $(@D) 169 @$(LOG_INSTALLSYM) "$(Color0)kextplist $(ColorF)$*" 170 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@ 171 172$(DSTROOT_INSTALL_KEXT_PLISTS): $(INSTALL_KEXT_DIR)/% : $(SYMROOT)/% 173 $(_v)$(MKDIR) $(@D) 174 @$(LOG_INSTALL) "$(Color0)kextplist $(ColorF)$*" 175 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@ 176 177$(DSTROOT_INSTALL_KEXT_MACHO_FILES): $(DSTROOT_SYSTEM_KEXT_PATH)/% : $(SYMROOT_SYSTEM_KEXT_PATH)/% 178 $(_v)$(MKDIR) $(@D) 179 @$(LOG_INSTALL) "$(Color0)symbolset $(ColorF)$(@F)" 180 $(_v)$(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@ 181 182$(DSTROOT)/$(KRESDIR)/$(MD_SUPPORTED_KPI_FILENAME) $(DSTROOT)/$(KRESDIR)/$(MI_SUPPORTED_KPI_FILENAME): $(DSTROOT)/$(KRESDIR)/% : $(OBJPATH)/% 183 $(_v)$(MKDIR) $(@D) 184 @$(LOG_INSTALL) "$*" 185 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 186 187ifneq ($(RC_ProjectName),xnu_libraries) 188 189do_build_all:: build_symbol_set_plists 190do_config_all:: build_symbol_sets 191 192ifneq ($(INSTALL_KASAN_ONLY),1) 193 194do_config_install_primary:: \ 195 $(DSTROOT)/$(KRESDIR)/$(MD_SUPPORTED_KPI_FILENAME) 196 197do_config_install:: \ 198 $(SYMROOT_INSTALL_KEXT_MACHO_FILES) \ 199 $(SYMROOT_INSTALL_KEXT_PLISTS) \ 200 $(DSTROOT_INSTALL_KEXT_MACHO_FILES) \ 201 $(DSTROOT_INSTALL_KEXT_PLISTS) \ 202 $(DSTROOT)/$(KRESDIR)/$(MI_SUPPORTED_KPI_FILENAME) 203endif 204 205else 206# We are building XNU as a static library - avoid creating symbol sets 207endif 208 209$(OBJPATH)/all-kpi.exp: $(EXPORTS_FILES) 210 $(_v)$(SOURCE)/generate_linker_exports.sh $@ $+ $(Kasan_EXPORTS) $(Kcov_EXPORTS) 211 212$(OBJPATH)/all-alias.exp: $(EXPORTS_FILES) 213 $(_v)$(SOURCE)/generate_linker_aliases.sh $@ $+ $(Kasan_EXPORTS) $(Kcov_EXPORTS) 214 215do_build_all:: $(OBJPATH)/all-kpi.exp $(OBJPATH)/all-alias.exp 216 217include $(MakeInc_rule) 218include $(MakeInc_dir) 219 220.PHONY: build_symbol_set_plists build_symbol_sets check_all_exports 221