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