Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | # -*- mode: makefile;-*- # # Copyright (C) 1999-2012 Apple Inc. All rights reserved. # # MakeInc.kernel augments the single-architecture # recursive build system with rules specific # to assembling and linking a kernel. # # # Validate configuration options # ifeq ($(filter $(CURRENT_ARCH_CONFIG),$(SUPPORTED_ARCH_CONFIGS)),) $(error Unsupported CURRENT_ARCH_CONFIG $(CURRENT_ARCH_CONFIG)) endif ifeq ($(filter $(CURRENT_KERNEL_CONFIG),$(SUPPORTED_KERNEL_CONFIGS)),) $(error Unsupported CURRENT_KERNEL_CONFIG $(CURRENT_KERNEL_CONFIG)) endif ifeq ($(filter $(CURRENT_MACHINE_CONFIG),$(SUPPORTED_$(CURRENT_ARCH_CONFIG)_MACHINE_CONFIGS)),) $(error Unsupported CURRENT_MACHINE_CONFIG $(CURRENT_MACHINE_CONFIG)) endif ifeq ($(filter $(PLATFORM),$(SUPPORTED_PLATFORMS)),) $(error Unsupported PLATFORM $(PLATFORM)) endif STATIC_KMODS = $(SRCROOT)/kmods.a ifeq ($(BUILD_JSON_COMPILATION_DATABASE),1) do_build_setup:: $(_v)$(CAT) > $(OBJPATH)/compile_commands.json < /dev/null endif # # Rules for the highly parallel "build" phase, where each build configuration # writes into their own $(TARGET) independent of other build configs # # There are 3 primary build outputs: # 1) $(KERNEL_FILE_NAME).unstripped (raw linked kernel, unstripped) # 2) $(KERNEL_FILE_NAME) (stripped kernel, with optional CTF data) # 3) $(KERNEL_FILE_NAME).dSYM (dSYM) # do_build_all:: do_build_kernel .PHONY: do_build_kernel do_build_kernel: $(TARGET)/$(KERNEL_FILE_NAME) $(TARGET)/$(KERNEL_FILE_NAME).unstripped @: ifeq ($(BUILD_DSYM),1) do_build_all:: do_build_kernel_dSYM endif .PHONY: do_build_kernel_dSYM do_build_kernel_dSYM: $(TARGET)/$(KERNEL_FILE_NAME).dSYM @: .LDFLAGS: ALWAYS $(_v)$(REPLACECONTENTS) $@ $(LD) $(LDFLAGS_KERNEL) $(LD_KERNEL_LIBS) .CFLAGS: ALWAYS $(_v)$(REPLACECONTENTS) $@ $(KCC) $(CFLAGS) $(INCFLAGS) $(TARGET)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME).unstripped @echo STRIP $(@F) $(_v)$(STRIP) $(STRIP_FLAGS) $< -o $@ $(_v)$(RM) $@.ctfdata ifeq ($(DO_CTFMERGE),1) @echo CTFMERGE $(@F) $(_v)$(FIND) $(TARGET)/ -name \*.ctf -size +0 | \ $(XARGS) $(CTFMERGE) -l xnu -o $@ -Z $@.ctfdata || true endif $(_v)if [ -s $@.ctfdata ]; then \ echo CTFINSERT $(@F); \ $(CTFINSERT) $@ $(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG)) \ $@.ctfdata -o $@; \ fi; $(_v)$(LN) $(call function_convert_build_config_to_objdir,$(CURRENT_BUILD_CONFIG))/$(KERNEL_FILE_NAME) $(OBJROOT)/$(KERNEL_FILE_NAME) $(TARGET)/$(KERNEL_FILE_NAME).dSYM: $(TARGET)/$(KERNEL_FILE_NAME).unstripped $(_v)echo DSYMUTIL $(@F) $(_v)$(DSYMUTIL) $(DSYMUTIL_FLAGS) $< -o $@ $(_v)$(MV) $@/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME).unstripped $@/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) $(_v)$(TOUCH) $@ $(TARGET)/$(KERNEL_FILE_NAME).unstripped: $(addprefix $(TARGET)/,$(foreach component,$(COMPONENT_LIST),$(component)/$(CURRENT_KERNEL_CONFIG)/$(component).filelist)) lastkerneldataconst.o lastkernelconstructor.o $(SRCROOT)/config/version.c $(SRCROOT)/config/MasterVersion .LDFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) $(_v)${MAKE} -f $(firstword $(MAKEFILE_LIST)) version.o @echo LD $(@F) $(_v)$(CAT) $(filter %.filelist,$+) < /dev/null > link.filelist $(_v)$(LD) $(LDFLAGS_KERNEL) -filelist link.filelist version.o $(filter %.o,$+) -o $@ $(LD_KERNEL_LIBS) -include version.d version.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) version.o: $(OBJPATH)/version.c ${C_RULE_0} ${C_RULE_1A}$< ${C_RULE_2} ${C_RULE_4} # Always recreate version.sh $(OBJPATH)/version.c: $(SRCROOT)/config/version.c $(NEWVERS) $(SRCROOT)/config/MasterVersion ALWAYS $(_v)$(CP) $< $@ $(_v)$(NEWVERS) $(OBJPATH)/version.c > /dev/null; -include lastkerneldataconst.d lastkerneldataconst.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) lastkerneldataconst.o: $(SRCROOT)/libsa/lastkerneldataconst.c ${C_RULE_0} ${C_RULE_1A}$< ${C_RULE_2} lastkernelconstructor.o_CFLAGS_RM = -fprofile-instr-generate # the LAST segment is mapped read-only on arm, so if we include llvm profiling # here it will segfault the kernel. (see arm_vm_init.c) We don't currently have # a way of retrieving these counters from LAST anyway, so there's no harm in just # disabling them. LAST_FILES=lastkernelconstructor.o -include lastkernelconstructor.d lastkernelconstructor.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) lastkernelconstructor.o: $(SRCROOT)/libsa/lastkernelconstructor.c ${C_RULE_0} ${C_RULE_1A}$< $(CFLAGS_NOLTO_FLAG) ${C_RULE_2} ${C_RULE_3} ${C_RULE_4} $(_v)for last_file in ${LAST_FILES}; \ do \ $(SEG_HACK) -s __DATA -n __LAST -o $${last_file}__ $${last_file} || exit 1; \ mv $${last_file}__ $${last_file} || exit 1; \ done # # Install rules. Each build config is classified as "primary" (the first # config for an architecture) or "non-primary". Primary build configs # have the semantic of competing to *combine* single-architecture # files into a multi-architecture output in the DSTROOT, like # $(DSTROOT)/$(KERNEL_FILE_NAME), and consequently each primary build config # has its install target run serially with respect to other primary # build configs. Non-primary build configs will never compete for # files in the DSTROOT or SYMROOT, and can be installed in parallel # with other non-primary configs (and even primary configs) # do_build_install_primary:: do_install_machine_specific_kernel ifeq ($(BUILD_DSYM),1) do_build_install_primary:: do_install_machine_specific_kernel_dSYM endif do_build_install_non_primary:: do_install_machine_specific_kernel ifeq ($(BUILD_DSYM),1) do_build_install_non_primary:: do_install_machine_specific_kernel_dSYM endif ifeq ($(BUILD_DSYM),1) ifeq ($(INSTALL_KERNEL_SYM_TO_KDK),1) do_build_install_primary:: do_install_machine_specific_KDK_dSYM do_build_install_non_primary:: do_install_machine_specific_KDK_dSYM endif endif ifeq ($(INSTALL_XNU_DEBUG_FILES),1) do_build_install_primary:: do_install_xnu_debug_files endif .PHONY: do_install_xnu_debug_files do_install_xnu_debug_files: $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)/README.DEBUG-kernel.txt @: # # If the timestamp indicates the DSTROOT kernel is out of # date, start over. Normal dependencies don't work because we can have # ( BUILDA, BUILDB, INSTALLB, INSTALLA ) in which case at INSTALLA time # the timestamps would $(DSTROOT)/$(KERNEL_FILE_NAME) is not out of date compared # to BUILDA. So we maintain a separate file at the time make(1) # was run and use it to determine what actions to take # $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME) ALWAYS $(_v)$(MKDIR) $(dir $@) $(_v)if [ $(OBJROOT)/.mach_kernel.timestamp -nt $@ ]; then \ echo INSTALL $(@F) "($(CURRENT_ARCH_CONFIG_LC) $(CURRENT_MACHINE_CONFIG_LC))"; \ $(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@; \ cmdstatus=$$?; \ else \ echo INSTALL $(@F) "($(CURRENT_ARCH_CONFIG_LC) $(CURRENT_MACHINE_CONFIG_LC))"; \ $(LIPO) -create $@ $< -output $@; \ cmdstatus=$$?; \ fi; \ exit $$cmdstatus $(SYMROOT)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME).unstripped ALWAYS $(_v)$(MKDIR) $(dir $@) $(_v)if [ $(OBJROOT)/.mach_kernel.timestamp -nt $@ ]; then \ echo INSTALLSYM $(@F) "($(CURRENT_ARCH_CONFIG_LC))"; \ $(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@; \ cmdstatus=$$?; \ else \ echo INSTALLSYM $(@F) "($(CURRENT_ARCH_CONFIG_LC))"; \ $(LIPO) -create $@ $< -output $@; \ cmdstatus=$$?; \ fi; \ exit $$cmdstatus $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros: $(TARGET)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros $(_v)$(MKDIR) $(dir $@) @echo INSTALLMACROS $(@F) "($(CURRENT_ARCH_CONFIG_LC))" $(_v)$(CP) -r $< $(dir $@) $(_v)$(TOUCH) $@ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME): $(TARGET)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) $(_v)$(MKDIR) $(dir $@) @echo INSTALLMACROS $(@F) "($(CURRENT_ARCH_CONFIG_LC))" $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)/README.DEBUG-kernel.txt: $(SRCROOT)/config/README.DEBUG-kernel.txt $(_v)$(MKDIR) $(dir $@) @echo INSTALL $(@F) $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist: $(TARGET)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist $(_v)$(MKDIR) $(dir $@) @echo INSTALLSYM dSYM $(@F) "($(CURRENT_ARCH_CONFIG_LC))" $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) ALWAYS $(_v)$(MKDIR) $(dir $@) $(_v)if [ $(OBJROOT)/.mach_kernel.timestamp -nt $@ ]; then \ echo INSTALLSYM dSYM $(@F).dSYM "($(CURRENT_ARCH_CONFIG_LC))"; \ $(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@; \ cmdstatus=$$?; \ else \ echo INSTALLSYM dSYM $(@F).dSYM "($(CURRENT_ARCH_CONFIG_LC))"; \ $(LIPO) -create $@ $< -output $@; \ cmdstatus=$$?; \ fi; \ exit $$cmdstatus .PHONY: do_install_machine_specific_kernel do_install_machine_specific_kernel_dSYM do_install_machine_specific_kernel: $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME) \ $(SYMROOT)/$(KERNEL_FILE_NAME) @: do_install_machine_specific_kernel_dSYM: \ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist \ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) \ $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) @: .PHONY: do_install_machine_specific_KDK_dSYM do_install_machine_specific_KDK_dSYM: \ $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist \ $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) \ $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) @: # The $(RM) is needed so that the $(LN) doesn't dereference an existing # symlink during incremental builds and create a new symlink inside # the target of the existing symlink do_installhdrs_mi:: $(DSTROOT)/$(KRESDIR)/Info.plist $(_v)$(MKDIR) $(DSTROOT)/$(KINCFRAME) $(_v)$(MKDIR) $(DSTROOT)/$(KPINCDIR) $(_v)$(MKDIR) $(DSTROOT)/$(KRESDIR) $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/Versions/Current $(_v)$(LN) $(KINCVERS) $(DSTROOT)/$(KINCFRAME)/Versions/Current $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/Headers $(_v)$(LN) Versions/Current/Headers \ $(DSTROOT)/$(KINCFRAME)/Headers $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/PrivateHeaders $(_v)$(LN) Versions/Current/PrivateHeaders \ $(DSTROOT)/$(KINCFRAME)/PrivateHeaders $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/Resources $(_v)$(LN) Versions/Current/Resources \ $(DSTROOT)/$(KINCFRAME)/Resources $(DSTROOT)/$(KRESDIR)/Info.plist: $(SOURCE)/EXTERNAL_HEADERS/Info.plist $(_v)$(MKDIR) $(DSTROOT)/$(KRESDIR) $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@ $(_v)$(NEWVERS) $@ $(_vstdout) ifeq ($(USE_BINARY_PLIST),1) $(_v)$(PLUTIL) -convert binary1 -o $@ $@ endif print_exports: $(_v)printenv | sort |