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