1export SOURCE=$(shell /bin/pwd) 2export RELATIVE_SOURCE_PATH ?= . 3 4# 5# -- AppleARM -- 6# 7export DEFAULT_ARM_MACHINE_CONFIG = ARMPBA8 8export DEFAULT_L4_ARM_MACHINE_CONFIG = LOLWUT 9export DEFAULT_ARM64_MACHINE_CONFIG = FOUNDATION 10 11# 12# gnumake 3.77 support 13# 14export USE_APPLE_PB_SUPPORT = all 15 16# 17# Incremental Build option 18# 19ifndef INCR_EXPORTHDRS 20ifeq ($(shell test -d $$OBJROOT/EXPORT_HDRS;echo $$?),0) 21export INCR_EXPORTHDRS = TRUE 22else 23export INCR_EXPORTHDRS = FALSE 24endif 25endif 26 27# 28# Component List 29# 30ifndef COMPONENT_LIST 31export COMPONENT_LIST = osfmk bsd libkern iokit pexpert libsa security 32export COMPONENT_LIST_UC := $(shell printf "%s" "$(COMPONENT_LIST)" | $(TR) a-z A-Z) 33endif 34ifndef COMPONENT 35export COMPONENT := $(firstword $(subst /, ,$(RELATIVE_SOURCE_PATH))) 36export COMPONENT_IMPORT_LIST := $(filter-out $(COMPONENT),$(COMPONENT_LIST)) 37else 38ifeq ($(COMPONENT), .) 39export COMPONENT := $(if $(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(firstword $(subst /, ,$(RELATIVE_SOURCE_PATH)))) 40export COMPONENT_IMPORT_LIST := $(filter-out $(COMPONENT),$(COMPONENT_LIST)) 41endif 42endif 43 44# Architecture options 45# 46ifndef SUPPORTED_ARCH_CONFIGS 47export SUPPORTED_ARCH_CONFIGS = I386 X86_64 ARM ARM64 48endif 49 50ifndef ARCH_CONFIGS 51ifdef RC_ARCHS 52export ARCH_CONFIGS := $(shell printf "%s" "$(RC_ARCHS)" | $(TR) a-z A-Z | sed -E 's/ARMV[0-9][A-Z]?/ARM/g') 53else 54ifeq ($(PLATFORM),iPhoneOS) 55 export ARCH_CONFIGS := ARM 56else 57 export ARCH_CONFIGS := $(shell arch | $(TR) a-z A-Z | sed -E 's/ARMV[0-9][A-Z]?/ARM/g') 58endif 59endif 60endif 61ifdef ARCH_CONFIG 62ifndef ARCH_CONFIG_LC 63export ARCH_CONFIG_LC := $(shell printf "%s" "$(ARCH_CONFIG)" | $(TR) A-Z a-z) 64endif 65endif 66 67# 68# Platform options 69# 70ifndef SUPPORTED_PLATFORMS 71export SUPPORTED_PLATFORMS = MacOSX iPhoneOS iPhoneSimulator 72endif 73 74# PLATFORM is set earlier in MakeInc.cmd, closer to where decisions about 75# platform tools are made 76 77# 78# Kernel Configuration options 79# 80ifndef SUPPORTED_KERNEL_CONFIGS 81export SUPPORTED_KERNEL_CONFIGS = RELEASE DEVELOPMENT DEBUG PROFILE 82endif 83 84ifndef DEFAULT_KERNEL_CONFIG 85ifeq ($(RC_ProjectName),xnu_debug) 86export DEFAULT_KERNEL_CONFIG = DEBUG 87else 88export DEFAULT_KERNEL_CONFIG = RELEASE 89endif 90endif 91 92# If KERNEL_CONFIGS is specified it should override KERNEL_CONFIG. 93# If KERNEL_CONFIG is specified it will override the default. Will quit with 94# error if more than one config is specified. 95# If DEFAULT_KERNEL_CONFIG is not specified then it will be built RELEASE. 96ifndef KERNEL_CONFIGS 97 ifndef KERNEL_CONFIG 98 export KERNEL_CONFIGS = $(DEFAULT_KERNEL_CONFIG) 99 else 100 export KERNEL_CONFIGS = $(KERNEL_CONFIG) 101 endif 102endif 103 104ifndef KERNEL_CONFIG 105export KERNEL_CONFIG = $(firstword $(KERNEL_CONFIGS)) 106endif 107 108ifneq ($(words $(KERNEL_CONFIG)), 1) 109$(error There were $(words $(KERNEL_CONFIG)) parameters passed to KERNEL_CONFIG = $(KERNEL_CONFG). \ 110 Are you sure? To specify multiple configurations please use KERNEL_CONFIGS) 111endif 112 113ifndef MACHINE_CONFIG 114export MACHINE_CONFIG = DEFAULT 115endif 116 117 118# 119# Machine Configuration options 120# 121export SUPPORTED_I386_MACHINE_CONFIGS := DEFAULT 122export SUPPORTED_X86_64_MACHINE_CONFIGS := DEFAULT 123export SUPPORTED_ARM_MACHINE_CONFIGS := S5L8920X S5L8922X S5L8930X ARMPBA8 SUN4I OMAP3530 OMAP335X RASPBERRYPI \ 124 OMAP3430_RX51 ARM_RVEB_V6 S5L8720X S5L8900XRB MSM8960_TOUCHPAD 125export SUPPORTED_ARM64_MACHINE_CONFIGS := DEFAULT VEXPRESS 126 127# 128# Target configuration options. NOTE - target configurations will 129# override ARCH_CONFIGS and KERNEL_CONFIGS. 130# 131# Target configs come in groups of three parameters. The first is the 132# kernel configuration, the second is the architecture configuration, 133# and the third is the machine configuration. You may pass in as 134# many groups of configurations as you wish. Each item passed in is 135# separated by whitespace.$ 136# 137# Example: 138# TARGET_CONFIGS="release x86_64 default debug i386 default release arm S5l8920X" 139# Parameters may be in upper or lower case (they are converted to upper). 140# 141# "default" parameter is a special case. It means use the default value for 142# that parameter. Here are the default values for each configuration: 143# 144# default kernel configuration = DEFAULT_KERNEL_CONFIG 145# default architecture configuration = system architecture where you are running make. 146# default machine configuration for i386 = none at this time. 147# default machine configuration for x86_64 = none at this time. 148# default machine configuration for arm = "S5L8920X". 149# 150ifndef TARGET_CONFIGS_UC 151ifdef TARGET_CONFIGS 152 export TARGET_CONFIGS_UC := $(strip $(shell printf "%s" "$(TARGET_CONFIGS)" | $(TR) a-z A-Z)) 153 export MACHINE_CONFIG = $(word 3, $(TARGET_CONFIGS_UC)) 154 export DEFAULT_KERNEL_CONFIG = $(word 1, $(TARGET_CONFIGS_UC)) 155else 156 157 ifneq ($(filter %_embedded,$(MAKECMDGOALS)),) 158# generate set of standard embedded configs 159 export TARGET_CONFIGS = $(TARGET_CONFIGS_EMBEDDED) 160 else ifneq ($(filter %_devicemap,$(MAKECMDGOALS)),) 161 export TARGET_CONFIGS = $(strip $(foreach my_arch_config, $(ARCH_CONFIGS), $(foreach my_kern_config, $(KERNEL_CONFIGS), $(my_kern_config) $(my_arch_config) $(MACHINE_CONFIG)))) 162 else 163# generate TARGET_CONFIGS using KERNEL_CONFIGS and ARCH_CONFIGS and MACHINE_CONFIG (which defaults to "DEFAULT") 164 export TARGET_CONFIGS = $(strip $(foreach my_arch_config, $(ARCH_CONFIGS), $(foreach my_kern_config, $(KERNEL_CONFIGS), $(my_kern_config) $(my_arch_config) $(MACHINE_CONFIG)))) 165 endif 166 export TARGET_CONFIGS_UC := $(shell printf "%s" "$(TARGET_CONFIGS)" | $(TR) a-z A-Z) 167 export MACHINE_CONFIG = $(word 3, $(TARGET_CONFIGS_UC)) 168 export DEFAULT_KERNEL_CONFIG = $(word 1, $(TARGET_CONFIGS_UC)) 169endif 170endif 171 172export MACHINE_CONFIG_LC := $(shell printf "%s" "$(MACHINE_CONFIG)" | $(TR) A-Z a-z) 173export KERNEL_CONFIG_LC := $(shell printf "%s" "$(KERNEL_CONFIG)" | $(TR) A-Z a-z) 174 175# 176# Validate configuration options 177# 178ifneq ($(ARCH_CONFIG),) 179ifeq ($(filter $(ARCH_CONFIG),$(SUPPORTED_ARCH_CONFIGS)),) 180$(error Unsupported ARCH_CONFIG $(ARCH_CONFIG)) 181endif 182endif 183 184ifneq ($(KERNEL_CONFIG),) 185ifeq ($(filter $(KERNEL_CONFIG),$(SUPPORTED_KERNEL_CONFIGS)),) 186$(error Unsupported KERNEL_CONFIG $(KERNEL_CONFIG)) 187endif 188endif 189 190ifneq ($(MACHINE_CONFIG),) 191ifneq ($(ARCH_CONFIG),) 192ifeq ($(filter $(MACHINE_CONFIG),$(SUPPORTED_$(ARCH_CONFIG)_MACHINE_CONFIGS)),) 193$(error Unsupported MACHINE_CONFIG $(MACHINE_CONFIG)) 194endif 195endif 196endif 197 198ifneq ($(PLATFORM),) 199ifeq ($(filter $(PLATFORM),$(SUPPORTED_PLATFORMS)),) 200$(error Unsupported PLATFORM $(PLATFORM)) 201endif 202endif 203 204# 205# Kernel Configuration to install 206# 207# supported install architecture : I386 X86_64 ARM 208# 209export INSTALL_TYPE = $(DEFAULT_KERNEL_CONFIG) 210 211ifndef INSTALL_ARCHS 212export INSTALL_ARCHS = $(strip $(foreach my_config, $(SUPPORTED_ARCH_CONFIGS), $(filter $(TARGET_CONFIGS_UC),$(my_config)))) 213export INSTALL_ARCHS_LC := $(shell printf "%s" "$(INSTALL_ARCHS)" | $(TR) A-Z a-z) 214endif 215 216export INSTALL_ARCH_DEFAULT = $(firstword $(INSTALL_ARCHS)) 217ifeq ($(INSTALL_ARCH_DEFAULT),) 218$(error Could not determine INSTALL_ARCH_DEFAULT) 219endif 220 221# 222# Deployment target flag 223# 224ifeq ($(UNAME_S),Darwin) 225ifndef DEPLOYMENT_TARGET_FLAGS 226SDKVERSION=$(shell xcodebuild -sdk $(SDKROOT) -version SDKVersion | head -1) 227ifeq ($(PLATFORM),MacOSX) 228 export DEPLOYMENT_TARGET_FLAGS := -mmacosx-version-min=$(SDKVERSION) 229else ifeq ($(PLATFORM),iPhoneOS) 230 export DEPLOYMENT_TARGET_FLAGS := -miphoneos-version-min=$(SDKVERSION) 231else ifeq ($(PLATFORM),iPhoneSimulator) 232 export DEPLOYMENT_TARGET_FLAGS := 233else 234 export DEPLOYMENT_TARGET_FLAGS := 235endif 236endif 237else 238 export DEPLOYMENT_TARGET_FLAGS := 239endif 240 241# 242# Standard defines list 243# 244export DEFINES = -DAPPLE -DKERNEL -DKERNEL_PRIVATE -DXNU_KERNEL_PRIVATE \ 245 -DPRIVATE -D__MACHO__=1 -Dvolatile=__volatile $(IDENT) -DBOARD_CONFIG_$(MACHINE_CONFIG) 246 247# 248# Compiler command 249# 250KCC := $(CC) 251KC++ := $(CXX) 252 253# 254# Compiler warning flags 255# 256 257CWARNFLAGS_STD = \ 258 -Wall -Wno-format-y2k -Wextra -Wstrict-prototypes \ 259 -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \ 260 -Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wchar-subscripts \ 261 -Winline -Wnested-externs -Wredundant-decls -Wextra-tokens \ 262 -Wno-private-extern -Wno-cast-align 263 264# Certain warnings are non-fatal (8474835) 265CWARNFLAGS_STD += -Wno-error=cast-align -Wno-unused-parameter \ 266 -Wno-missing-prototypes -Wno-unused-variable \ 267 -Wno-incompatible-pointer-types 268 269# Can be overridden in Makefile.template or Makefile.$arch 270export CWARNFLAGS ?= $(CWARNFLAGS_STD) 271 272define add_perfile_cflags 273$(1)_CWARNFLAGS_ADD += $2 274endef 275 276CXXWARNFLAGS_STD = \ 277 -Wall -Wno-format-y2k -Wextra -Wpointer-arith -Wreturn-type \ 278 -Wcast-qual -Wwrite-strings -Wswitch -Wcast-align -Wchar-subscripts \ 279 -Wredundant-decls -Wextra-tokens \ 280 -Wno-private-extern -Wno-cast-align 281 282# Certain warnings are non-fatal (8474835, 9000888) 283CXXWARNFLAGS_STD += -Wno-error=cast-align -Wno-error=overloaded-virtual 284 285# Can be overridden in Makefile.template or Makefile.$arch 286export CXXWARNFLAGS ?= $(CXXWARNFLAGS_STD) 287 288define add_perfile_cxxflags 289$(1)_CXXWARNFLAGS_ADD += $2 290endef 291 292# 293# Setup for parallel sub-makes based on 2 times number of logical CPUs 294# 295ifeq ($(UNAME_S),Darwin) 296ifndef MAKEJOBS 297export MAKEJOBS = --jobs=$(shell expr `/usr/sbin//sysctl -n hw.logicalcpu` \* 2) 298endif 299else 300ifndef MAKEJOBS 301export MAKEJOBS := --jobs=$(shell expr `nproc` \* 2) 302endif 303endif 304 305# 306# Default ARCH_FLAGS, for use with compiler/linker/assembler/mig drivers 307# 308ARCH_FLAGS_I386 = -arch i386 309ARCH_FLAGS_X86_64 = -arch x86_64 310ARCH_FLAGS_ARM64 = -arch arm64 311 312ARCH_FLAGS_ARM = $($(addsuffix $(MACHINE_CONFIG),ARCH_FLAGS_ARM_)) 313 314ARCH_FLAGS_ARM_S5L8930X = -arch armv7 315ARCH_FLAGS_ARM_S5L8922X = -arch armv7 316ARCH_FLAGS_ARM_S5L8920X = -arch armv7 317ARCH_FLAGS_ARM_S5L8720X = -arch armv6 318ARCH_FLAGS_ARM_S5L8900XRB = -arch armv6 319ARCH_FLAGS_ARM_OMAP3530 = -arch armv7 320ARCH_FLAGS_ARM_OMAP3430_RX51 = -arch armv7 321ARCH_FLAGS_ARM_OMAP335X = -arch armv7 322ARCH_FLAGS_ARM_ARMPBA8 = -arch armv7 323ARCH_FLAGS_ARM_MSM8960_TOUCHPAD = -arch armv7 324ARCH_FLAGS_ARM_RASPBERRYPI = -arch armv6 325ARCH_FLAGS_ARM_ARM_RVEB_V6 = -arch armv6 326 327# 328# Default CFLAGS 329# 330 331ifeq ($(UNAME_S),Linux) 332 # XXX Fix this. 333 ifeq ($(word 2, $(TARGET_CONFIGS_UC)),ARM) 334 BUILD_NO_DEBUG := 1 335 RC_CFLAGS := -D__arm__ -DARM 336 endif 337endif 338 339ifdef RC_CFLAGS 340export OTHER_CFLAGS = $(subst $(addprefix -arch ,$(RC_ARCHS)),,$(RC_CFLAGS)) 341endif 342 343export DSYMRESDIR = ./Contents/Resources/ 344export DSYMBUILDDIR = ./Contents/Resources/DWARF/ 345 346# 347# We must not use -fno-keep-inline-functions, or it will remove the dtrace 348# probes from the kernel. 349# 350export CFLAGS_GEN = $(DEBUG_CFLAGS) -nostdinc \ 351 -freorder-blocks -fno-builtin -fno-common \ 352 -fsigned-bitfields $(OTHER_CFLAGS) 353 354ifeq ($(BUILD_STABS),1) 355export CFLAGS_GEN += -gstabs+ 356export BUILD_DWARF = 0 357export BUILD_STABS = 1 358else 359export CFLAGS_GEN += -gdwarf-2 360export BUILD_DWARF = 1 361export BUILD_STABS = 0 362endif 363 364export CFLAGS_RELEASE = 365export CFLAGS_DEVELOPMENT = 366export CFLAGS_DEBUG = -fstack-protector-all 367export CFLAGS_PROFILE = -pg 368 369export CFLAGS_I386 = -static -Di386 -DI386 -D__I386__ \ 370 -DPAGE_SIZE_FIXED -msoft-float \ 371 -integrated-as 372export CFLAGS_X86_64 = -Dx86_64 -DX86_64 -D__X86_64__ -DLP64 \ 373 -DPAGE_SIZE_FIXED -mkernel -msoft-float \ 374 -integrated-as 375export CFLAGS_ARM = -Darm -DARM -D__ARM__ -DPAGE_SIZE_FIXED \ 376 -fno-strict-aliasing -fno-keep-inline-functions \ 377 -msoft-float 378export CFLAGS_ARM64 = -Darm -DARM64 -D__arm__ -DARM -D__ARM64__ -DPAGE_SIZE_FIXED \ 379 -fno-strict-aliasing -fno-keep-inline-functions -DLP64 -integrated-as 380 381ifeq (-arch armv6,$(ARCH_FLAGS_ARM)) 382CFLAGS_ARM += -mno-thumb 383endif 384ifeq (-arch armv7,$(ARCH_FLAGS_ARM)) 385CFLAGS_ARM += -mthumb 386endif 387 388export CFLAGS_RELEASEARM64 = -O2 389export CFLAGS_DEVELOPMENTARM64 = -O2 390export CFLAGS_DEBUGARM64 = -O0 391export CFLAGS_PROFILEARM64 = -O2 392 393export CFLAGS_RELEASEI386 = -O2 394export CFLAGS_DEVELOPMENTI386 = -O2 395export CFLAGS_DEBUGI386 = -O0 396export CFLAGS_PROFILEI386 = -O2 397 398export CFLAGS_RELEASEX86_64 = -O2 399export CFLAGS_DEVELOPMENTX86_64 = -O2 400# No space optimization for the DEBUG kernel for the benefit of gdb: 401export CFLAGS_DEBUGX86_64 = -O0 402export CFLAGS_PROFILEX86_64 = -O2 403 404export CFLAGS_RELEASEARM = -O0 405export CFLAGS_DEVELOPMENTARM = -O0 406export CFLAGS_DEBUGARM = -O0 407export CFLAGS_PROFILEARM = -O0 408 409export CFLAGS = $(CFLAGS_GEN) \ 410 -DMACHINE_CONFIG_$(MACHINE_CONFIG) \ 411 $($(addsuffix $(MACHINE_CONFIG),MACHINE_FLAGS_)) \ 412 $($(addsuffix $(ARCH_CONFIG),ARCH_FLAGS_)) \ 413 $($(addsuffix $(ARCH_CONFIG),CFLAGS_)) \ 414 $($(addsuffix $(KERNEL_CONFIG),CFLAGS_)) \ 415 $($(addsuffix $(ARCH_CONFIG), $(addsuffix $(KERNEL_CONFIG),CFLAGS_))) \ 416 $(DEPLOYMENT_TARGET_FLAGS) \ 417 $(DEFINES) 418 419# 420# Default C++ flags 421# 422 423OTHER_CXXFLAGS = 424 425CXXFLAGS_GEN = -fapple-kext $(OTHER_CXXFLAGS) 426 427CXXFLAGS = $(CXXFLAGS_GEN) \ 428 $($(addsuffix $(ARCH_CONFIG),CXXFLAGS_)) \ 429 $($(addsuffix $(KERNEL_CONFIG),CXXFLAGS_)) 430 431# 432# Assembler command 433# 434AS = $(CC) 435S_KCC = $(CC) 436 437# 438# Default SFLAGS 439# 440export SFLAGS_GEN = -D__ASSEMBLER__ $(OTHER_CFLAGS) 441 442export SFLAGS_RELEASE = 443export SFLAGS_DEVELOPMENT = 444export SFLAGS_DEBUG = 445export SFLAGS_PROFILE = 446 447export SFLAGS_I386 = $(CFLAGS_I386) 448export SFLAGS_X86_64 = $(CFLAGS_X86_64) 449 450 451export SFLAGS = $(SFLAGS_GEN) \ 452 $($(addsuffix $(MACHINE_CONFIG),MACHINE_FLAGS_)) \ 453 $($(addsuffix $(ARCH_CONFIG),ARCH_FLAGS_)) \ 454 $($(addsuffix $(ARCH_CONFIG),SFLAGS_)) \ 455 $($(addsuffix $(KERNEL_CONFIG),SFLAGS_)) \ 456 $(DEPLOYMENT_TARGET_FLAGS) \ 457 $(DEFINES) 458 459 460# 461# Linker command 462# 463LD = $(KC++) -nostdlib 464 465# 466# Default LDFLAGS 467# 468export LDFLAGS_KERNEL_GEN = \ 469 $(RC_LDFLAGS) \ 470 -nostdlib \ 471 -fapple-kext \ 472 -read_only_relocs suppress \ 473 -Wl,-e,__start \ 474 -Wl,-sectalign,__TEXT,__text,0x1000 \ 475 -Wl,-sectalign,__TEXT,initcode,0x1000 \ 476 -Wl,-sectalign,__DATA,__common,0x1000 \ 477 -Wl,-sectalign,__DATA,__bss,0x1000 \ 478 -Wl,-sectcreate,__PRELINK_TEXT,__text,/dev/null \ 479 -Wl,-sectcreate,__PRELINK_STATE,__kernel,/dev/null \ 480 -Wl,-sectcreate,__PRELINK_STATE,__kexts,/dev/null \ 481 -Wl,-sectcreate,__PRELINK_INFO,__info,/dev/null \ 482 -Wl,-new_linker \ 483 -Wl,-pagezero_size,0x0 \ 484 -Wl,-version_load_command \ 485 -Wl,-function_starts 486 487# Availability of DWARF allows DTrace CTF (compressed type format) to be constructed. 488# ctf_insert creates the CTF section. It needs reserved padding in the 489# headers for the load command segment and the CTF section structures. 490ifeq ($(BUILD_DWARF),1) 491export LDFLAGS_KERNEL_GEN += \ 492 -Wl,-headerpad,152 493endif 494 495export LDFLAGS_KERNEL_RELEASE = 496export LDFLAGS_KERNEL_DEVELOPMENT = 497export LDFLAGS_KERNEL_DEBUG = 498export LDFLAGS_KERNEL_PROFILE = 499 500export LDFLAGS_KERNEL_RELEASEI386 = \ 501 -Wl,-segaddr,__INITPT,0x00100000 \ 502 -Wl,-segaddr,__INITGDT,0x00106000 \ 503 -Wl,-segaddr,__SLEEP,0x00107000 \ 504 -Wl,-segaddr,__HIB,0x00108000 \ 505 -Wl,-image_base,0x200000 \ 506 -Wl,-seg_page_size,__TEXT,0x200000 507 508export LDFLAGS_KERNEL_DEBUGI386 = $(LDFLAGS_KERNEL_RELEASEI386) 509export LDFLAGS_KERNEL_DEVELOPMENTI386 = $(LDFLAGS_KERNEL_RELEASEI386) 510export LDFLAGS_KERNEL_PROFILEI386 = $(LDFLAGS_KERNEL_RELEASEI386) 511 512# KASLR static slide config: 513ifndef SLIDE 514SLIDE=0x00 515endif 516KERNEL_MIN_ADDRESS := 0xffffff8000000000 517KERNEL_BASE_OFFSET := 0x100000 518KERNEL_STATIC_SLIDE := $(shell printf "0x%016x" \ 519 $(( $(SLIDE) << 21 ))) 520KERNEL_STATIC_BASE := $(shell printf "0x%016x" \ 521 $(( $(KERNEL_MIN_ADDRESS) + $(KERNEL_BASE_OFFSET) ))) 522KERNEL_HIB_SECTION_BASE := $(shell printf "0x%016x" \ 523 $(( $(KERNEL_STATIC_BASE) + $(KERNEL_STATIC_SLIDE) ))) 524KERNEL_TEXT_BASE := $(shell printf "0x%016x" \ 525 $(( $(KERNEL_HIB_SECTION_BASE) + 0x100000 ))) 526 527export LDFLAGS_KERNEL_RELEASEX86_64 = \ 528 -Wl,-pie \ 529 -Wl,-segaddr,__HIB,$(KERNEL_HIB_SECTION_BASE) \ 530 -Wl,-image_base,$(KERNEL_TEXT_BASE) \ 531 -Wl,-seg_page_size,__TEXT,0x200000 \ 532 -Wl,-sectalign,__DATA,__const,0x1000 \ 533 -Wl,-sectalign,__DATA,__sysctl_set,0x1000 \ 534 -Wl,-sectalign,__HIB,__bootPT,0x1000 \ 535 -Wl,-sectalign,__HIB,__desc,0x1000 \ 536 -Wl,-sectalign,__HIB,__data,0x1000 \ 537 -Wl,-sectalign,__HIB,__text,0x1000 \ 538 -Wl,-sectalign,__HIB,__const,0x1000 \ 539 -Wl,-sectalign,__HIB,__bss,0x1000 \ 540 -Wl,-sectalign,__HIB,__common,0x1000 \ 541 542export LDFLAGS_KERNEL_RELEASEARM64 = \ 543 -Wl,-pie \ 544 -Wl,-static \ 545 -Wl,-image_base,0xffffff8000202000 546export LDFLAGS_KERNEL_DEBUGARM64 = $(LDFLAGS_KERNEL_RELEASEARM64) 547export LDFLAGS_KERNEL_DEVELOPMENTARM64 = $(LDFLAGS_KERNEL_RELEASEARM64) 548 549# Define KERNEL_BASE_OFFSET so known at compile time: 550export CFLAGS_X86_64 += -DKERNEL_BASE_OFFSET=$(KERNEL_BASE_OFFSET) 551 552export LDFLAGS_KERNEL_DEBUGX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64) 553export LDFLAGS_KERNEL_DEVELOPMENTX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64) 554export LDFLAGS_KERNEL_PROFILEX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64) 555 556export LDFLAGS_KERNEL_RELEASEARM = \ 557 -Wl,-pie \ 558 -Wl,-static \ 559 -Wl,-image_base,0x80001000 \ 560 -Wl,-seg_page_size,__TEXT,0x1000 \ 561 -Wl,-sectalign,__DATA,__const,0x1000 \ 562 -Wl,-sectalign,__DATA,__sysctl_set,0x1000 \ 563 -Wl,-exported_symbols_list,$(TARGET)/kernel-kpi.exp \ 564 -Wl,-alias_list $(SRCROOT)/osfmk/arm/intrinsic.map 565 566export LDFLAGS_KERNEL_DEVELOPMENTARM = \ 567 -Wl,-pie \ 568 -Wl,-static \ 569 -Wl,-seg_page_size,__TEXT,0x1000 \ 570 -Wl,-sectalign,__DATA,__const,0x1000 \ 571 -Wl,-sectalign,__DATA,__sysctl_set,0x1000 \ 572 -Wl,-image_base,0x80001000 \ 573 -Wl,-alias_list $(SRCROOT)/osfmk/arm/intrinsic.map 574 575export LDFLAGS_KERNEL_DEBUGARM = $(LDFLAGS_KERNEL_DEVELOPMENTARM) 576 577# Offset image base by page to have iBoot load kernel TEXT correctly. 578# First page is used for various purposes : sleep token, reset vector. 579 580export LDFLAGS_KERNEL = $(LDFLAGS_KERNEL_GEN) \ 581 $($(addsuffix $(MACHINE_CONFIG),MACHINE_FLAGS_)) \ 582 $($(addsuffix $(ARCH_CONFIG),ARCH_FLAGS_)) \ 583 $($(addsuffix $(ARCH_CONFIG),LDFLAGS_KERNEL_)) \ 584 $($(addsuffix $(KERNEL_CONFIG),LDFLAGS_KERNEL_)) \ 585 $($(addsuffix $(ARCH_CONFIG), $(addsuffix $(KERNEL_CONFIG),LDFLAGS_KERNEL_))) \ 586 $(DEPLOYMENT_TARGET_FLAGS) 587 588# 589# Default runtime libraries to be linked with the kernel 590# 591export LD_KERNEL_LIBS = -lcc_kext 592 593 594# 595# Default INCFLAGS 596# 597export INCFLAGS_IMPORT = $(patsubst %, -I$(OBJROOT)/EXPORT_HDRS/%, $(COMPONENT_IMPORT_LIST)) 598export INCFLAGS_EXTERN = -I$(OBJROOT)/EXTERN_HDRS -I$(SRCROOT)/EXTERNAL_HEADERS -I$(SRCROOT)/EXTERNAL_HEADERS/bsd 599export INCFLAGS_GEN = -I$(SRCROOT)/$(COMPONENT) -I$(OBJROOT)/EXPORT_HDRS/$(COMPONENT) 600export INCFLAGS_POSIX = -I$(OBJROOT)/EXPORT_HDRS/bsd 601export INCFLAGS_LOCAL = -I. 602 603export INCFLAGS = $(INCFLAGS_LOCAL) $(INCFLAGS_GEN) $(INCFLAGS_IMPORT) $(INCFLAGS_EXTERN) $(INCFLAGS_MAKEFILE) 604 605# 606# Default MIGFLAGS 607# 608export MIGFLAGS = $(DEFINES) $(INCFLAGS) $($(addsuffix $(ARCH_CONFIG),CFLAGS_)) \ 609 $($(addsuffix $(ARCH_CONFIG),ARCH_FLAGS_)) \ 610 $(DEPLOYMENT_TARGET_FLAGS) 611 612# 613# Support for LLVM Link Time Optimization (LTO) 614# 615 616ifeq ($(BUILD_LTO),1) 617export CFLAGS_GEN += -flto 618export CXXFLAGS_GEN += -flto 619export LDFLAGS_KERNEL_GEN += -Wl,-object_path_lto,$(TARGET)/lto.o 620export CFLAGS_NOLTO_FLAG = -fno-lto 621export BUILD_MACHO_OBJ = 0 622export BUILD_LTO = 1 623else 624export CFLAGS_NOLTO_FLAG = 625export BUILD_MACHO_OBJ = 1 626export BUILD_LTO = 0 627endif 628 629# 630# Support for LLVM Integrated Assembler with clang driver 631# 632ifeq ($(BUILD_INTEGRATED_ASSEMBLER),1) 633export SFLAGS_GEN += -integrated-as 634export CFLAGS_GEN += -integrated-as 635export CXXFLAGS_GEN += -integrated-as 636export SFLAGS_NOINTEGRATEDAS_FLAGS = -no-integrated-as 637export CFLAGS_NOINTEGRATEDAS_FLAGS = -no-integrated-as 638else 639export SFLAGS_NOINTEGRATEDAS_FLAGS = 640export CFLAGS_NOINTEGRATEDAS_FLAGS = 641endif 642 643# 644# Default VPATH 645# 646empty:= 647space:= $(empty) $(empty) 648export VPATH_IMPORT = $(subst $(space),:,$(patsubst %,$(OBJROOT)/EXPORT_HDRS/%,$(strip $(COMPONENT_IMPORT_LIST)))): 649export VPATH_EXTERN = $(OBJROOT)/EXTERN_HDRS: 650export VPATH_GEN = .:$(SOURCE): 651 652export VPATH = $(VPATH_GEN)$(VPATH_IMPORT)$(VPATH_EXTERN)$(VPATH_MAKEFILE) 653 654# 655# Macros that control installation of kernel and its header files 656# 657# install flags for header files 658# 659INSTALL_FLAGS = -c -m 0444 660FILE_INSTALL_FLAGS = -c -m 0644 661DATA_INSTALL_FLAGS = -c -m 0644 662 663# 664# Header file destinations 665# 666ifeq ($(RC_ProjectName),xnu_headers_Sim) 667 HEADER_INSTALL_PREFIX = $(SDKROOT) 668else 669 HEADER_INSTALL_PREFIX = 670endif 671 672FRAMEDIR = $(HEADER_INSTALL_PREFIX)/System/Library/Frameworks 673 674SINCVERS = B 675SINCFRAME = $(FRAMEDIR)/System.framework 676SINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Headers 677SPINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/PrivateHeaders 678SRESDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Resources 679 680ifndef INCDIR 681 INCDIR = $(HEADER_INSTALL_PREFIX)/usr/include 682endif 683ifndef LCLDIR 684 LCLDIR = $(SPINCDIR) 685endif 686 687KINCVERS = A 688KINCFRAME = $(FRAMEDIR)/Kernel.framework 689KINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Headers 690KPINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/PrivateHeaders 691KRESDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Resources 692 693XNU_PRIVATE_UNIFDEF = -UMACH_KERNEL_PRIVATE -UBSD_KERNEL_PRIVATE -UIOKIT_KERNEL_PRIVATE -ULIBKERN_KERNEL_PRIVATE -ULIBSA_KERNEL_PRIVATE -UPEXPERT_KERNEL_PRIVATE -UXNU_KERNEL_PRIVATE 694 695PLATFORM_UNIFDEF = $(foreach x,$(SUPPORTED_PLATFORMS),$(if $(filter $(PLATFORM),$(x)),-DPLATFORM_$(x),-UPLATFORM_$(x))) 696 697SPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -U_OPEN_SOURCE_ 698SINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -D_OPEN_SOURCE_ 699KPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) -DKERNEL_PRIVATE -DPRIVATE -DKERNEL -U_OPEN_SOURCE_ 700KINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) -UKERNEL_PRIVATE -UPRIVATE -DKERNEL -D_OPEN_SOURCE_ 701 702 703# 704# Component Header file destinations 705# 706EXPDIR = EXPORT_HDRS/$(COMPONENT) 707 708# 709# Strip Flags 710# 711export STRIP_FLAGS_RELEASE = -S -x 712export STRIP_FLAGS_DEVELOPMENT = -S -x 713export STRIP_FLAGS_DEBUG = -S 714export STRIP_FLAGS_PROFILE = -S -x 715 716export STRIP_FLAGS = $($(addsuffix $(KERNEL_CONFIG),STRIP_FLAGS_)) 717 718# 719# dsymutil flags 720# 721export DSYMUTIL_FLAGS_I386 = --arch=i386 722export DSYMUTIL_FLAGS_X86_64 = --arch=x86_64 723 724export DSYMUTIL_FLAGS = $($(addsuffix $(ARCH_CONFIG),DSYMUTIL_FLAGS_)) 725 726# 727# Man Page destination 728# 729MANDIR = usr/share/man 730 731# 732# DEBUG alias location 733# 734DEVELOPER_EXTRAS_DIR = AppleInternal/Developer/Extras 735 736# 737# This must be here before any rules are possibly defined by the 738# machine dependent makefile fragment so that a plain "make" command 739# always works. The config program will emit an appropriate rule to 740# cause "all" to depend on every kernel configuration it generates. 741# 742 743default: all 744 745# vim: set ft=make: 746