1# -*- mode: makefile;-*- 2# 3# Copyright (C) 1999-2020 Apple Inc. All rights reserved. 4# 5# MakeInc.kernel augments the single-architecture 6# recursive build system with rules specific 7# to assembling and linking a kernel. 8# 9 10# 11# Validate configuration options 12# 13ifeq ($(filter $(CURRENT_ARCH_CONFIG),$(SUPPORTED_ARCH_CONFIGS)),) 14$(error Unsupported CURRENT_ARCH_CONFIG $(CURRENT_ARCH_CONFIG)) 15endif 16 17ifeq ($(filter $(CURRENT_KERNEL_CONFIG),$(SUPPORTED_KERNEL_CONFIGS)),) 18$(error Unsupported CURRENT_KERNEL_CONFIG $(CURRENT_KERNEL_CONFIG)) 19endif 20 21ifeq ($(filter $(CURRENT_MACHINE_CONFIG),$(SUPPORTED_$(CURRENT_ARCH_CONFIG)_MACHINE_CONFIGS)),) 22$(error Unsupported CURRENT_MACHINE_CONFIG $(CURRENT_MACHINE_CONFIG)) 23endif 24 25ifeq ($(filter $(PLATFORM),$(SUPPORTED_PLATFORMS)),) 26$(error Unsupported PLATFORM $(PLATFORM)) 27endif 28 29ifeq ($(BUILD_JSON_COMPILATION_DATABASE),1) 30do_build_setup:: 31 $(_v)$(CAT) > $(OBJPATH)/compile_commands.json < /dev/null 32endif 33 34ifeq ($(BUILD_STATIC_LINK),1) 35ifeq ($(USE_LTO),1) 36# <rdar://problem/46252406> 37# To run LTO in the xnu project while linking the final result in KCB, without losing debugging info, 38# run ld -r on only the LTO bitcode object files to produce one mach-o for KCB to use, which is added 39# to the static link archive, along with the non-LTO objects (not linked, since ld -r on mach-o objects 40# does not preserve DWARF.) 41PRE_LTO=1 42endif 43endif 44 45# 46# Rules for the highly parallel "build" phase, where each build configuration 47# writes into their own $(TARGET) independent of other build configs 48# 49# There are 5 primary build outputs: 50# 1) $(KERNEL_FILE_NAME).unstripped (raw linked kernel, unstripped) 51# 2) $(KERNEL_FILE_NAME) (stripped kernel, with optional CTF data) 52# 3) $(KERNEL_FILE_NAME).dSYM (dSYM) 53# 4) $(KERNEL_FILE_NAME).link (bits for static linking) 54# 5) lib$(KERNEL_FILE_NAME).a (static archive for testing) 55 56ifeq ($(BUILD_STATIC_LINK),1) 57ifeq ($(BUILD_XNU_LIBRARY),1) 58 59KERNEL_STATIC_LINK_TARGETS = \ 60 $(TARGET)/lib$(KERNEL_FILE_NAME).a 61KERNEL_STATIC_LINK_DST = \ 62 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/lib$(KERNEL_FILE_NAME).a 63 64else 65 66KERNEL_STATIC_LINK_TARGETS = \ 67 $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).a 68 69KERNEL_STATIC_LINK_DST = \ 70 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).a \ 71 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarguments \ 72 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarchives \ 73 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).exp \ 74 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).alias.exp \ 75 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ 76 $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) 77 78endif 79endif 80 81do_build_all:: do_build_kernel 82 83.PHONY: do_build_kernel 84 85ifeq ($(BUILD_XNU_LIBRARY),1) 86do_build_kernel: $(KERNEL_STATIC_LINK_TARGETS) 87 88else 89 90do_build_kernel: $(TARGET)/$(KERNEL_FILE_NAME) $(TARGET)/$(KERNEL_FILE_NAME).unstripped $(KERNEL_STATIC_LINK_TARGETS) 91 @: 92 93ifeq ($(BUILD_DSYM),1) 94do_build_all:: do_build_kernel_dSYM 95endif 96 97.PHONY: do_build_kernel_dSYM 98 99do_build_kernel_dSYM: $(TARGET)/$(KERNEL_FILE_NAME).dSYM 100 @: 101 102endif 103 104.LDFLAGS: ALWAYS 105 $(_v)$(REPLACECONTENTS) $@ $(LD) $(LDFLAGS_KERNEL) $(LDFLAGS_KERNEL_ONLY) $(LD_KERNEL_LIBS) 106.CFLAGS: ALWAYS 107 $(_v)$(REPLACECONTENTS) $@ $(KCC) $(CFLAGS) $(INCFLAGS) 108 109$(TARGET)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME).unstripped $(TARGET)/$(KERNEL_FILE_NAME).dSYM 110 @$(LOG_STRIP) "$(@F)" 111 $(_v)$(STRIP) $(STRIP_FLAGS) $< -o $@ 112 @echo "built kernel at $@" 113 $(_v)$(RM) [email protected] 114ifeq ($(DO_CTFMERGE),1) 115 @$(LOG_CTFCONVERT) "$(@F)" 116 $(_v)$(CTFCONVERT) -c -l xnu -u xnu -o [email protected] $(TARGET)/$(KERNEL_FILE_NAME).dSYM/Contents/Resources/DWARF/$(KERNEL_FILE_NAME) 117 @$(LOG_CTFMERGE) "$(@F)" 118 $(_v)$(CTFMERGE) -l xnu -o $@ -Z [email protected] [email protected] 119 $(_v)if [ -s [email protected] ]; then \ 120 $(LOG_CTFINSERT) "$(@F)"; \ 121 $(CTFINSERT) $@ $(ARCH_FLAGS_$(CURRENT_ARCH_CONFIG)) \ 122 [email protected] -o $@; \ 123 fi; 124endif 125 $(_v)$(LN) $(call function_convert_build_config_to_objdir,$(CURRENT_BUILD_CONFIG))/$(KERNEL_FILE_NAME) $(OBJROOT)/$(KERNEL_FILE_NAME) 126 127$(TARGET)/$(KERNEL_FILE_NAME).dSYM: $(TARGET)/$(KERNEL_FILE_NAME).unstripped 128 @$(LOG_DSYMUTIL) "$(@F)" 129 $(_v)$(BASH) -c "$(DSYMUTIL) $(DSYMUTIL_FLAGS) $< -o $@ $(_vstdout) 2> >(grep -v '^warning:.*could not find object file symbol for symbol' 1>&2)" 130 $(_v)$(MV) $@/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME).unstripped $@/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) 131 $(_v)$(TOUCH) $@ 132 133ifeq ($(BUILD_XNU_LIBRARY),1) 134$(TARGET)/lib$(KERNEL_FILE_NAME).a: $(addprefix $(TARGET)/,$(foreach component,$(COMPONENT_LIST),$(component)/$(CURRENT_KERNEL_CONFIG)/$(component).libfilelist)) nonlto.o $(SRCROOT)/config/version.c $(SRCROOT)/config/MasterVersion .LDFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 135 $(_v)${MAKE} -f $(firstword $(MAKEFILE_LIST)) version.o 136 @$(LOG_LIBTOOL) "$(@F)" 137 $(_v)$(CAT) $(filter %.libfilelist,$+) < /dev/null > link.filelist 138 $(_v)$(LIBTOOL) -static -csD -filelist link.filelist -o $@ 139 $(_v)$(LN) $(call function_convert_build_config_to_objdir,$(CURRENT_BUILD_CONFIG))/lib$(KERNEL_FILE_NAME).a $(OBJROOT)/lib$(KERNEL_FILE_NAME).a 140endif 141 142$(TARGET)/$(KERNEL_FILE_NAME).unstripped: $(addprefix $(TARGET)/,$(foreach component,$(COMPONENT_LIST),$(component)/$(CURRENT_KERNEL_CONFIG)/$(component).filelist)) lastkerneldataconst.o lastkernelconstructor.o nonlto.o $(SRCROOT)/config/version.c $(SRCROOT)/config/MasterVersion $(LDFILES_KERNEL_ONLY) .LDFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 143 $(_v)${MAKE} -f $(firstword $(MAKEFILE_LIST)) version.o 144ifeq ($(PRE_LTO),1) 145 @$(LOG_LTO) "$(@F)" 146 $(_v)$(RM) ltolink.filelist 147 $(_v)$(RM) nonltolink.filelist 148 $(_v)$(RM) -r $(TARGET)/justlto.o 149 $(_v)files="$$($(CAT) $(filter %.filelist,$+)) version.o $(filter %.o,$+)"; \ 150 for ofile in $$files; \ 151 do \ 152 hdr=$$(od -An -N 4 -t x4 $$ofile); \ 153 if [ $$hdr = "0b17c0de" ]; \ 154 then \ 155 if [ -z "$$lto" ]; \ 156 then \ 157 lto="$$ofile"; \ 158 else \ 159 lto="$$(printf '%s\n%s' "$$lto" "$$ofile")"; \ 160 fi; \ 161 else \ 162 if [ -z "$$nonlto" ]; \ 163 then \ 164 nonlto="$$ofile"; \ 165 else \ 166 nonlto="$$(printf '%s\n%s' "$$nonlto" "$$ofile")"; \ 167 fi; \ 168 fi; \ 169 done; \ 170 printf '%s\n' "$$lto" >ltolink.filelist; \ 171 printf '%s\n' "$$nonlto" >nonltolink.filelist 172 @$(LOG_LD) "$(@F)" 173 $(_v)if [ -s ltolink.filelist ]; \ 174 then \ 175 $(LD) $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) -r nonlto.o -filelist ltolink.filelist $(LDFLAGS_KERNEL_LTO) -Wl,-object_path_lto,$(TARGET)/justlto.o -o $(TARGET)/justlto.tmp.o && \ 176 if test -d $(TARGET)/justlto.o; \ 177 then \ 178 $(LD) $(LDFLAGS_KERNEL) $(LDFLAGS_KERNEL_ONLY) -filelist nonltolink.filelist $(TARGET)/justlto.o/*.o $(LDFLAGS_KERNEL_STRIP_LTO) -o $@ $(LD_KERNEL_LIBS) $(LD_KERNEL_ARCHIVES); \ 179 else \ 180 $(LD) $(LDFLAGS_KERNEL) $(LDFLAGS_KERNEL_ONLY) -filelist nonltolink.filelist $(TARGET)/justlto.o $(LDFLAGS_KERNEL_STRIP_LTO) -o $@ $(LD_KERNEL_LIBS) $(LD_KERNEL_ARCHIVES); \ 181 fi; \ 182 else \ 183 $(LD) $(LDFLAGS_KERNEL) $(LDFLAGS_KERNEL_ONLY) -filelist nonltolink.filelist -o $@ $(LD_KERNEL_LIBS) $(LD_KERNEL_ARCHIVES); \ 184 fi 185else 186 @$(LOG_LD) "$(@F)" 187 $(_v)$(CAT) $(filter %.filelist,$+) < /dev/null > link.filelist 188 $(_v)$(LD) $(LDFLAGS_KERNEL) $(LDFLAGS_KERNEL_ONLY) -filelist link.filelist version.o $(filter %.o,$+) -o $@ $(LD_KERNEL_LIBS) $(LD_KERNEL_ARCHIVES) 189endif 190 191# for now, rename LASTDATA_CONST to LAST on static kernel cache builds 192EXTRA_KC_LINKARGS = -Wl,-rename_segment,__LASTDATA_CONST,__LAST 193 194$(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).a: $(TARGET)/$(KERNEL_FILE_NAME).unstripped .LDFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 195 @$(LOG_LIBTOOL) "$(@F)" 196 $(_v)$(MKDIR) $(dir $@) 197ifeq ($(PRE_LTO),1) 198 $(_v)if [ -d $(TARGET)/justlto.o ]; \ 199 then \ 200 $(LIBTOOL) -ca $(TARGET)/justlto.o/*.o -filelist nonltolink.filelist -o $@; \ 201 else \ 202 $(LIBTOOL) -ca $(TARGET)/justlto.o -filelist nonltolink.filelist -o $@; \ 203 fi 204else 205 $(_v)$(LIBTOOL) -ca -filelist link.filelist version.o lastkerneldataconst.o lastkernelconstructor.o -o $@ 206endif 207 $(_v)cp $(TARGET)/all-kpi.exp $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).exp 208 $(_v)cp $(TARGET)/all-alias.exp $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).alias.exp 209 $(_v)echo "$(LD_KERNEL_ARCHIVES)" >$(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarchives 210 $(_v)echo "$(LDFLAGS_KERNEL) $(LD_KERNEL_LIBS) $(EXTRA_KC_LINKARGS)" >$(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarguments 211 $(_v)$(LN) $(call function_convert_build_config_to_objdir,$(CURRENT_BUILD_CONFIG))/$(KERNEL_FILE_NAME).link $(OBJROOT)/$(KERNEL_FILE_NAME).link 212 213nonlto.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 214nonlto.o: $(SRCROOT)/libsa/nonlto.c 215 ${C_RULE_0} 216 ${C_RULE_1A}$< $(CFLAGS_NOLTO_FLAG) 217 ${C_RULE_2} 218 219-include version.d 220version.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 221version.o: $(OBJPATH)/version.c 222 ${C_RULE_0} 223 ${C_RULE_1A}$< 224 ${C_RULE_2} 225 ${C_RULE_4} 226 227# Always recreate version.sh 228$(OBJPATH)/version.c: $(SRCROOT)/config/version.c $(NEWVERS) $(SRCROOT)/config/MasterVersion ALWAYS 229 $(_v)$(CP) $< $@ 230 $(_v)$(NEWVERS) $(OBJPATH)/version.c > /dev/null; 231 232 233-include lastkerneldataconst.d 234lastkerneldataconst.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 235lastkerneldataconst.o: $(SRCROOT)/libsa/lastkerneldataconst.c 236 ${C_RULE_0} 237 ${C_RULE_1A}$< 238 ${C_RULE_2} 239 240 241lastkernelconstructor.o_CFLAGS_RM = -fprofile-instr-generate 242# the LAST segment is mapped read-only on arm, so if we include llvm profiling 243# here it will segfault the kernel. (see arm_vm_init.c) We don't currently have 244# a way of retrieving these counters from LAST anyway, so there's no harm in just 245# disabling them. 246 247LAST_FILES=lastkernelconstructor.o 248-include lastkernelconstructor.d 249lastkernelconstructor.o: .CFLAGS $(filter %/MakeInc.kernel,$(MAKEFILE_LIST)) 250lastkernelconstructor.o: $(SRCROOT)/libsa/lastkernelconstructor.c 251 ${C_RULE_0} 252 ${C_RULE_1A}$< $(CFLAGS_NOLTO_FLAG) 253 ${C_RULE_2} 254 ${C_RULE_3} 255 ${C_RULE_4} 256 $(_v)for last_file in ${LAST_FILES}; \ 257 do \ 258 $(SEG_HACK) -s __DATA -n __LASTDATA_CONST -o $${last_file}__ $${last_file} || exit 1; \ 259 mv $${last_file}__ $${last_file} || exit 1; \ 260 done 261EXTRA_KC_LINKARGS = -Wl,-rename_segment,__LASTDATA_CONST,__LAST 262 263# 264# Install rules. Each build config is classified as "primary" (the first 265# config for an architecture) or "non-primary". Primary build configs 266# have the semantic of competing to *combine* single-architecture 267# files into a multi-architecture output in the DSTROOT, like 268# $(DSTROOT)/$(KERNEL_FILE_NAME), and consequently each primary build config 269# has its install target run serially with respect to other primary 270# build configs. Non-primary build configs will never compete for 271# files in the DSTROOT or SYMROOT, and can be installed in parallel 272# with other non-primary configs (and even primary configs) 273# 274 275do_build_install_primary:: do_install_machine_specific_kernel 276ifeq ($(BUILD_DSYM),1) 277do_build_install_primary:: do_install_machine_specific_kernel_dSYM 278endif 279 280do_build_install_non_primary:: do_install_machine_specific_kernel 281ifeq ($(BUILD_DSYM),1) 282do_build_install_non_primary:: do_install_machine_specific_kernel_dSYM 283endif 284 285ifeq ($(BUILD_DSYM),1) 286ifeq ($(INSTALL_KERNEL_SYM_TO_KDK),1) 287do_build_install_primary:: do_install_machine_specific_KDK_dSYM 288do_build_install_non_primary:: do_install_machine_specific_KDK_dSYM 289endif 290endif 291 292ifneq ($(BUILD_XNU_LIBRARY),1) 293ifeq ($(INSTALL_XNU_DEBUG_FILES),1) 294do_build_install_primary:: do_install_xnu_debug_files 295endif 296 297.PHONY: do_install_xnu_debug_files 298 299do_install_xnu_debug_files: $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)/README.DEBUG-kernel.txt 300 @: 301endif 302 303# 304# If the timestamp indicates the DSTROOT kernel is out of 305# date, start over. Normal dependencies don't work because we can have 306# ( BUILDA, BUILDB, INSTALLB, INSTALLA ) in which case at INSTALLA time 307# the timestamps would $(DSTROOT)/$(KERNEL_FILE_NAME) is not out of date compared 308# to BUILDA. So we maintain a separate file at the time make(1) 309# was run and use it to determine what actions to take 310# 311 312$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME) ALWAYS 313 $(_v)$(MKDIR) $(dir $@) 314 @$(LOG_INSTALL) "$(@F)$(Color0) ($(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0))" 315 # -nt and -ot are evaluated differently by bash, dash, and zsh (and are not part of the POSIX specification). 316 # Explicitly specify what should happen when the right hand file doesn't exist. 317 $(_v)if [ $(OBJROOT)/.mach_kernel.timestamp -nt $@ -o \( -e $(OBJROOT)/.mach_kernel.timestamp -a \! -e $@ \) ]; then \ 318 $(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@; \ 319 cmdstatus=$$?; \ 320 else \ 321 $(LIPO) -create $@ $< -output $@; \ 322 cmdstatus=$$?; \ 323 fi; \ 324 exit $$cmdstatus 325 326ifeq ($(BUILD_STATIC_LINK),1) 327ifeq ($(BUILD_XNU_LIBRARY),1) 328 329$(DSTROOT)/$(INSTALL_KERNEL_DIR)/lib$(KERNEL_FILE_NAME).a: $(TARGET)/lib$(KERNEL_FILE_NAME).a ALWAYS 330 $(_v)$(MKDIR) $(dir $@) 331 @$(LOG_INSTALL) "$(@F)" 332 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 333 334else 335$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).a: $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).a ALWAYS 336 $(_v)$(MKDIR) $(dir $@) 337 @$(LOG_INSTALL) "$(@F)" 338 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 339 340$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarguments: $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarguments ALWAYS 341 $(_v)$(MKDIR) $(dir $@) 342 @$(LOG_INSTALL) "$(@F)" 343 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 344 345$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarchives: $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).linkarchives ALWAYS 346 $(_v)$(MKDIR) $(dir $@) 347 @$(LOG_INSTALL) "$(@F)" 348 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 349 350$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).exp: $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).exp ALWAYS 351 $(_v)$(MKDIR) $(dir $@) 352 @$(LOG_INSTALL) "$(@F)" 353 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 354 355$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).alias.exp: $(TARGET)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).alias.exp ALWAYS 356 $(_v)$(MKDIR) $(dir $@) 357 @$(LOG_INSTALL) "$(@F)" 358 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 359endif 360 361# BUILD_STATIC_LINK 362endif 363 364$(SYMROOT)/$(KERNEL_FILE_NAME): $(TARGET)/$(KERNEL_FILE_NAME).unstripped ALWAYS 365 $(_v)$(MKDIR) $(dir $@) 366 @$(LOG_INSTALLSYM) "$(@F)$(Color0) ($(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0))" 367 # -nt and -ot are evaluated differently by bash, dash, and zsh (and are not part of the POSIX specification). 368 # Explicitly specify what should happen when the right hand file doesn't exist. 369 $(_v)if [ $(OBJROOT)/.mach_kernel.timestamp -nt $@ -o \( -e $(OBJROOT)/.mach_kernel.timestamp -a \! -e $@ \) ]; then \ 370 $(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@; \ 371 cmdstatus=$$?; \ 372 else \ 373 $(LIPO) -create $@ $< -output $@; \ 374 cmdstatus=$$?; \ 375 fi; \ 376 exit $$cmdstatus 377 378 379$(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ 380$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ 381$(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros: \ 382$(TARGET)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros 383 $(_v)$(MKDIR) $(dir $@) 384 @$(LOG_INSTALLMACROS) "$(@F)$(Color0) $(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0))" 385 $(_v)$(CP) -r $< $(dir $@) 386 $(_v)$(TOUCH) $@ 387 388$(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) \ 389$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME).link/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) \ 390$(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME): \ 391$(TARGET)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) 392 $(_v)$(MKDIR) $(dir $@) 393 @$(LOG_INSTALLMACROS) "$(@F)$(Color0) ($(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0))" 394 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 395 396$(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)/README.DEBUG-kernel.txt: $(SRCROOT)/config/README.DEBUG-kernel.txt 397 $(_v)$(MKDIR) $(dir $@) 398 @$(LOG_INSTALL) "$(@F)" 399 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 400 401$(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 402 $(_v)$(MKDIR) $(dir $@) 403 @$(LOG_INSTALLSYM) "$(ColorL)dSYM$(Color0) $(ColorF)$(@F)$(Color0) ($(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0))" 404 $(_v)$(INSTALL) $(INSTALL_FLAGS) $< $@ 405 406$(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 407 $(_v)$(MKDIR) $(dir $@) 408 @$(LOG_INSTALLSYM) "$(ColorL)dSYM$(Color0) $(ColorF)$(@F).dSYM$(ColorF) ($(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0))" 409 # -nt and -ot are evaluated differently by bash, dash, and zsh (and are not part of the POSIX specification). 410 # Explicitly specify what should happen when the right hand file doesn't exist. 411 $(_v)if [ $(OBJROOT)/.mach_kernel.timestamp -nt $@ -o \( -e $(OBJROOT)/.mach_kernel.timestamp -a \! -e $@ \) ]; then \ 412 $(INSTALL) $(EXEC_INSTALL_FLAGS) $< $@; \ 413 cmdstatus=$$?; \ 414 else \ 415 $(LIPO) -create $@ $< -output $@; \ 416 cmdstatus=$$?; \ 417 fi; \ 418 exit $$cmdstatus 419 420.PHONY: do_install_machine_specific_kernel do_install_machine_specific_kernel_dSYM 421.PHONY: do_install_machine_specific_KDK_dSYM 422 423ifeq ($(BUILD_XNU_LIBRARY),1) 424 425do_install_machine_specific_kernel: $(KERNEL_STATIC_LINK_DST) 426 @: 427do_install_machine_specific_kernel_dSYM: 428 @: 429 430else 431 432do_install_machine_specific_kernel: $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME) \ 433 $(SYMROOT)/$(KERNEL_FILE_NAME) \ 434 $(KERNEL_STATIC_LINK_DST) 435 @: 436 437do_install_machine_specific_kernel_dSYM: \ 438 $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist \ 439 $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ 440 $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) \ 441 $(SYMROOT)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) 442 @: 443 444do_install_machine_specific_KDK_dSYM: \ 445 $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMINFODIR)/Info.plist \ 446 $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/lldbmacros \ 447 $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMLLDBMACROSDIR)/$(KERNEL_LLDBBOOTSTRAP_NAME) \ 448 $(DSTROOT)/$(INSTALL_KERNEL_SYM_DIR)/$(KERNEL_FILE_NAME).dSYM/$(DSYMDWARFDIR)/$(KERNEL_FILE_NAME) 449 @: 450 451endif 452 453# The $(RM) is needed so that the $(LN) doesn't dereference an existing 454# symlink during incremental builds and create a new symlink inside 455# the target of the existing symlink 456do_installhdrs_mi:: $(DSTROOT)/$(KRESDIR)/Info.plist 457ifneq ($(INSTALLHDRS_SKIP_HOST),YES) 458 $(_v)$(MKDIR) $(DSTROOT)/$(KINCFRAME) 459 $(_v)$(MKDIR) $(DSTROOT)/$(KPINCDIR) 460 $(_v)$(MKDIR) $(DSTROOT)/$(KRESDIR) 461 $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/Versions/Current 462 $(_v)$(LN) $(KINCVERS) $(DSTROOT)/$(KINCFRAME)/Versions/Current 463 $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/Headers 464 $(_v)$(LN) Versions/Current/Headers \ 465 $(DSTROOT)/$(KINCFRAME)/Headers 466 $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/PrivateHeaders 467 $(_v)$(LN) Versions/Current/PrivateHeaders \ 468 $(DSTROOT)/$(KINCFRAME)/PrivateHeaders 469 $(_v)$(RM) $(DSTROOT)/$(KINCFRAME)/Resources 470 $(_v)$(LN) Versions/Current/Resources \ 471 $(DSTROOT)/$(KINCFRAME)/Resources 472endif 473 474$(DSTROOT)/$(KRESDIR)/Info.plist: $(SOURCE)/EXTERNAL_HEADERS/Info.plist 475ifneq ($(INSTALLHDRS_SKIP_HOST),YES) 476 $(_v)$(MKDIR) $(DSTROOT)/$(KRESDIR) 477 $(_v)$(INSTALL) $(DATA_INSTALL_FLAGS) $< $@ 478 $(_v)$(NEWVERS) $@ $(_vstdout) 479ifeq ($(USE_BINARY_PLIST),1) 480 $(_v)$(PLUTIL) -convert binary1 -o $@ $@ 481endif 482endif 483 484$(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(ALIAS_FILE_NAME): ALWAYS 485 @$(LOG_ALIAS) "$(@F)$(Color0) ($(ColorLF)$(CURRENT_ARCH_CONFIG_LC)$(Color0) $(ColorLF)$(CURRENT_MACHINE_CONFIG_LC)$(Color0) $(ColorLF)$(CURRENT_ALIAS_MACHINE_CONFIG_LC)$(Color0))" 486 $(_v)$(INSTALL) $(EXEC_INSTALL_FLAGS) $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(KERNEL_FILE_NAME) $@ 487 488install_alias: $(DSTROOT)/$(INSTALL_KERNEL_DIR)/$(ALIAS_FILE_NAME) 489 490print_exports: 491 $(_v)printenv | sort 492 493# vim: set ft=make: 494