1# -*- mode: makefile;-*- 2# 3# Copyright (C) 1999-2012 Apple Inc. All rights reserved. 4# 5# MakeInc.def contains global definitions for building, 6# linking, and installing files. 7# 8 9# 10# Architecture Configuration options 11# 12SUPPORTED_ARCH_CONFIGS := X86_64 13 14# 15# Kernel Configuration options 16# 17SUPPORTED_KERNEL_CONFIGS = RELEASE DEVELOPMENT DEBUG PROFILE 18 19# 20# Machine Configuration options 21# 22 23SUPPORTED_X86_64_MACHINE_CONFIGS = NONE 24 25 26# 27# Platform options 28# 29SUPPORTED_PLATFORMS = MacOSX iPhoneOS iPhoneSimulator 30 31# 32# Setup up *_LC variables during recursive invocations 33# 34 35ifndef CURRENT_ARCH_CONFIG_LC 36 export CURRENT_ARCH_CONFIG_LC := $(shell printf "%s" "$(CURRENT_ARCH_CONFIG)" | $(TR) A-Z a-z) 37endif 38 39ifndef CURRENT_KERNEL_CONFIG_LC 40 export CURRENT_KERNEL_CONFIG_LC := $(shell printf "%s" "$(CURRENT_KERNEL_CONFIG)" | $(TR) A-Z a-z) 41endif 42 43ifndef CURRENT_MACHINE_CONFIG_LC 44 export CURRENT_MACHINE_CONFIG_LC := $(shell printf "%s" "$(CURRENT_MACHINE_CONFIG)" | $(TR) A-Z a-z) 45endif 46 47 48# 49# Component List 50# 51COMPONENT_LIST = osfmk bsd libkern iokit pexpert libsa security 52COMPONENT = $(if $(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(firstword $(subst /, ,$(RELATIVE_SOURCE_PATH)))) 53COMPONENT_IMPORT_LIST = $(filter-out $(COMPONENT),$(COMPONENT_LIST)) 54 55 56# 57# Deployment target flag 58# 59ifeq ($(PLATFORM),MacOSX) 60 DEPLOYMENT_TARGET_FLAGS = -mmacosx-version-min=$(SDKVERSION) 61else ifeq ($(PLATFORM),iPhoneOS) 62 DEPLOYMENT_TARGET_FLAGS = -miphoneos-version-min=$(SDKVERSION) 63else ifeq ($(PLATFORM),iPhoneSimulator) 64 DEPLOYMENT_TARGET_FLAGS = 65else 66 DEPLOYMENT_TARGET_FLAGS = 67endif 68 69 70# 71# Standard defines list 72# 73DEFINES = -DAPPLE -DKERNEL -DKERNEL_PRIVATE -DXNU_KERNEL_PRIVATE \ 74 -DPRIVATE -D__MACHO__=1 -Dvolatile=__volatile $(IDENT) \ 75 $(SEED_DEFINES) 76 77# 78# Compiler command 79# 80KCC = $(CC) 81KC++ = $(CXX) 82 83# 84# Compiler warning flags 85# 86 87CWARNFLAGS_STD = \ 88 -Wall -Werror -Wno-format-y2k -Wextra -Wstrict-prototypes \ 89 -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \ 90 -Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wchar-subscripts \ 91 -Winline -Wnested-externs -Wredundant-decls -Wextra-tokens 92 93# Can be overridden in Makefile.template or Makefile.$arch 94export CWARNFLAGS ?= $(CWARNFLAGS_STD) 95 96define add_perfile_cflags 97$(1)_CWARNFLAGS_ADD += $2 98endef 99 100CXXWARNFLAGS_STD = \ 101 -Wall -Werror -Wno-format-y2k -Wextra -Wpointer-arith -Wreturn-type \ 102 -Wcast-qual -Wwrite-strings -Wswitch -Wcast-align -Wchar-subscripts \ 103 -Wredundant-decls -Wextra-tokens 104 105# overloaded-virtual warnings are non-fatal (9000888) 106CXXWARNFLAGS_STD += -Wno-error=overloaded-virtual 107 108# Can be overridden in Makefile.template or Makefile.$arch 109export CXXWARNFLAGS ?= $(CXXWARNFLAGS_STD) 110 111define add_perfile_cxxflags 112$(1)_CXXWARNFLAGS_ADD += $2 113endef 114 115# 116# Default ARCH_FLAGS, for use with compiler/linker/assembler/mig drivers 117 118ARCH_FLAGS_X86_64 = -arch x86_64 119 120 121# 122# Default CFLAGS 123# 124ifdef RC_CFLAGS 125OTHER_CFLAGS = $(subst $(addprefix -arch ,$(RC_ARCHS)),,$(RC_CFLAGS)) 126endif 127 128# 129# Debug info 130# 131DSYMKERNELSYSDIR = mach_kernel.sys.dSYM 132DSYMINFODIR = Contents 133DSYMKGMACROSDIR = Contents/Resources 134DSYMLLDBMACROSDIR = Contents/Resources/Python 135DSYMDWARFDIR = Contents/Resources/DWARF 136 137DEBUG_CFLAGS := -gdwarf-2 138BUILD_DSYM := 1 139 140# 141# We must not use -fno-keep-inline-functions, or it will remove the dtrace 142# probes from the kernel. 143# 144CFLAGS_GEN = $(DEBUG_CFLAGS) -nostdinc \ 145 -freorder-blocks -fno-builtin -fno-common \ 146 -fsigned-bitfields $(OTHER_CFLAGS) 147 148CFLAGS_RELEASE = 149CFLAGS_DEVELOPMENT = 150CFLAGS_DEBUG = 151CFLAGS_PROFILE = -pg 152 153CFLAGS_X86_64 = -Dx86_64 -DX86_64 -D__X86_64__ -DLP64 \ 154 -DPAGE_SIZE_FIXED -mkernel -msoft-float \ 155 -fno-limit-debug-info # Workaround for 11076603 156 157 158CFLAGS_RELEASEX86_64 = -O2 159CFLAGS_DEVELOPMENTX86_64 = -O2 160# No space optimization for the DEBUG kernel for the benefit of gdb: 161CFLAGS_DEBUGX86_64 = -O0 162CFLAGS_PROFILEX86_64 = -O2 163 164CFLAGS_RELEASEARM = -O2 165CFLAGS_DEVELOPMENTARM = -O2 166CFLAGS_DEBUGARM = -O0 167CFLAGS_PROFILEARM = -O2 168 169CFLAGS = $(CFLAGS_GEN) \ 170 $($(addsuffix $(CURRENT_MACHINE_CONFIG),MACHINE_FLAGS_$(CURRENT_ARCH_CONFIG)_)) \ 171 $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \ 172 $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) \ 173 $($(addsuffix $(CURRENT_KERNEL_CONFIG),CFLAGS_)) \ 174 $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),CFLAGS_))) \ 175 $(DEPLOYMENT_TARGET_FLAGS) \ 176 $(DEFINES) 177 178# 179# Default C++ flags 180# 181 182OTHER_CXXFLAGS = 183 184CXXFLAGS_GEN = -fapple-kext $(OTHER_CXXFLAGS) 185 186# For the moment, do not use gnu++11 187#CXXFLAGS_ARM = -std=gnu++11 188 189CXXFLAGS = $(CXXFLAGS_GEN) \ 190 $($(addsuffix $(CURRENT_ARCH_CONFIG),CXXFLAGS_)) \ 191 $($(addsuffix $(CURRENT_KERNEL_CONFIG),CXXFLAGS_)) 192 193 194# 195# Assembler command 196# 197AS = $(CC) 198S_KCC = $(CC) 199 200# 201# Default SFLAGS 202# 203SFLAGS_GEN = -D__ASSEMBLER__ $(OTHER_CFLAGS) 204 205SFLAGS_RELEASE = 206SFLAGS_DEVELOPMENT = 207SFLAGS_DEBUG = 208SFLAGS_PROFILE = 209 210SFLAGS_X86_64 = $(CFLAGS_X86_64) 211 212SFLAGS = $(SFLAGS_GEN) \ 213 $($(addsuffix $(CURRENT_MACHINE_CONFIG),MACHINE_FLAGS_$(CURRENT_ARCH_CONFIG)_)) \ 214 $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \ 215 $($(addsuffix $(CURRENT_ARCH_CONFIG),SFLAGS_)) \ 216 $($(addsuffix $(CURRENT_KERNEL_CONFIG),SFLAGS_)) \ 217 $(DEPLOYMENT_TARGET_FLAGS) \ 218 $(DEFINES) 219 220# 221# Linker command 222# 223LD = $(KC++) -nostdlib 224 225# 226# Default LDFLAGS 227# 228# Availability of DWARF allows DTrace CTF (compressed type format) to be constructed. 229# ctf_insert creates the CTF section. It needs reserved padding in the 230# headers for the load command segment and the CTF section structures. 231# 232LDFLAGS_KERNEL_GEN = \ 233 -nostdlib \ 234 -fapple-kext \ 235 -Wl,-e,__start \ 236 -Wl,-sectalign,__TEXT,__text,0x1000 \ 237 -Wl,-sectalign,__DATA,__common,0x1000 \ 238 -Wl,-sectalign,__DATA,__bss,0x1000 \ 239 -Wl,-sectcreate,__PRELINK_TEXT,__text,/dev/null \ 240 -Wl,-sectcreate,__PRELINK_STATE,__kernel,/dev/null \ 241 -Wl,-sectcreate,__PRELINK_STATE,__kexts,/dev/null \ 242 -Wl,-sectcreate,__PRELINK_INFO,__info,/dev/null \ 243 -Wl,-new_linker \ 244 -Wl,-pagezero_size,0x0 \ 245 -Wl,-version_load_command \ 246 -Wl,-function_starts \ 247 -Wl,-headerpad,152 248 249LDFLAGS_KERNEL_RELEASE = 250LDFLAGS_KERNEL_DEVELOPMENT = 251LDFLAGS_KERNEL_DEBUG = 252LDFLAGS_KERNEL_PROFILE = 253 254# KASLR static slide config: 255ifndef SLIDE 256SLIDE=0x00 257endif 258KERNEL_MIN_ADDRESS = 0xffffff8000000000 259KERNEL_BASE_OFFSET = 0x100000 260KERNEL_STATIC_SLIDE = $(shell printf "0x%016x" \ 261 $$[ $(SLIDE) << 21 ]) 262KERNEL_STATIC_BASE = $(shell printf "0x%016x" \ 263 $$[ $(KERNEL_MIN_ADDRESS) + $(KERNEL_BASE_OFFSET) ]) 264KERNEL_HIB_SECTION_BASE = $(shell printf "0x%016x" \ 265 $$[ $(KERNEL_STATIC_BASE) + $(KERNEL_STATIC_SLIDE) ]) 266KERNEL_TEXT_BASE = $(shell printf "0x%016x" \ 267 $$[ $(KERNEL_HIB_SECTION_BASE) + 0x100000 ]) 268 269LDFLAGS_KERNEL_RELEASEX86_64 = \ 270 -Wl,-pie \ 271 -Wl,-segaddr,__HIB,$(KERNEL_HIB_SECTION_BASE) \ 272 -Wl,-image_base,$(KERNEL_TEXT_BASE) \ 273 -Wl,-seg_page_size,__TEXT,0x200000 \ 274 -Wl,-sectalign,__DATA,__const,0x1000 \ 275 -Wl,-sectalign,__DATA,__sysctl_set,0x1000 \ 276 -Wl,-sectalign,__HIB,__bootPT,0x1000 \ 277 -Wl,-sectalign,__HIB,__desc,0x1000 \ 278 -Wl,-sectalign,__HIB,__data,0x1000 \ 279 -Wl,-sectalign,__HIB,__text,0x1000 \ 280 -Wl,-sectalign,__HIB,__const,0x1000 \ 281 -Wl,-sectalign,__HIB,__bss,0x1000 \ 282 -Wl,-sectalign,__HIB,__common,0x1000 \ 283 $(LDFLAGS_NOSTRIP_FLAG) 284 285# Define KERNEL_BASE_OFFSET so known at compile time: 286CFLAGS_X86_64 += -DKERNEL_BASE_OFFSET=$(KERNEL_BASE_OFFSET) 287 288LDFLAGS_KERNEL_DEBUGX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64) 289LDFLAGS_KERNEL_DEVELOPMENTX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64) 290LDFLAGS_KERNEL_PROFILEX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64) 291 292 293LDFLAGS_KERNEL = $(LDFLAGS_KERNEL_GEN) \ 294 $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \ 295 $($(addsuffix $(CURRENT_ARCH_CONFIG),LDFLAGS_KERNEL_)) \ 296 $($(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_)) \ 297 $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_))) \ 298 $(DEPLOYMENT_TARGET_FLAGS) 299 300# 301# Default runtime libraries to be linked with the kernel 302# 303LD_KERNEL_LIBS = -lcc_kext 304 305# 306# DTrace support 307# 308ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE) 309ifneq ($(filter ARM%,$(CURRENT_ARCH_CONFIG)),) 310DO_CTFCONVERT = 0 311DO_CTFMERGE = 0 312DO_CTFMACHO = 0 313else 314DO_CTFCONVERT = $(SUPPORTS_CTFCONVERT) 315DO_CTFMERGE = 1 316DO_CTFMACHO = $(NEEDS_CTF_MACHOS) 317endif 318else 319DO_CTFCONVERT = $(SUPPORTS_CTFCONVERT) 320DO_CTFMERGE = 1 321DO_CTFMACHO = $(NEEDS_CTF_MACHOS) 322endif 323 324# 325# Default INCFLAGS 326# 327INCFLAGS_IMPORT = $(patsubst %, -I$(OBJROOT)/EXPORT_HDRS/%, $(COMPONENT_IMPORT_LIST)) 328INCFLAGS_EXTERN = -I$(SRCROOT)/EXTERNAL_HEADERS 329INCFLAGS_GEN = -I$(SRCROOT)/$(COMPONENT) -I$(OBJROOT)/EXPORT_HDRS/$(COMPONENT) 330INCFLAGS_LOCAL = -I. 331 332INCFLAGS = $(INCFLAGS_LOCAL) $(INCFLAGS_GEN) $(INCFLAGS_IMPORT) $(INCFLAGS_EXTERN) $(INCFLAGS_MAKEFILE) 333 334# 335# Default MIGFLAGS 336# 337MIGFLAGS = $(DEFINES) $(INCFLAGS) $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \ 338 $(DEPLOYMENT_TARGET_FLAGS) 339 340# 341# Support for LLVM Link Time Optimization (LTO) 342# 343# CFLAGS_NOLTO_FLAG is needed on a per-file basis (for files 344# that deal poorly with LTO, or files that must be machine 345# code *.o files for xnu to build (i.e, setsegname runs on 346# them). 347# 348# LDFLAGS_NOSTRIP_FLAG is used to support configurations that 349# do not utilize an export list. For these configs to build, 350# we need to prevent the LTO logic from dead stripping them. 351 352ifeq ($(BUILD_LTO),1) 353CFLAGS_GEN += -flto 354CXXFLAGS_GEN += -flto 355LDFLAGS_KERNEL_GEN += -Wl,-mllvm,-disable-simplify-libcalls -Wl,-object_path_lto,$(TARGET)/lto.o # -Wl,-mllvm -Wl,-disable-fp-elim 356LDFLAGS_NOSTRIP_FLAG = -rdynamic 357CFLAGS_NOLTO_FLAG = -fno-lto 358SUPPORTS_CTFCONVERT = 0 359NEEDS_CTF_MACHOS = 1 360else 361LDFLAGS_NOSTRIP_FLAG = 362CFLAGS_NOLTO_FLAG = 363SUPPORTS_CTFCONVERT = 1 364NEEDS_CTF_MACHOS = 0 365endif 366 367# 368# Default VPATH 369# 370export VPATH = .:$(SOURCE) 371 372# 373# Macros that control installation of kernel and its header files 374# 375# install flags for header files 376# 377INSTALL_FLAGS = -c -S -m 0444 378DATA_INSTALL_FLAGS = -c -S -m 0644 379EXEC_INSTALL_FLAGS = -c -S -m 0755 380 381# 382# Header file destinations 383# 384ifeq ($(RC_ProjectName),xnu_headers_Sim) 385 HEADER_INSTALL_PREFIX = $(SDKROOT) 386else 387 HEADER_INSTALL_PREFIX = 388endif 389 390FRAMEDIR = $(HEADER_INSTALL_PREFIX)/System/Library/Frameworks 391 392SINCVERS = B 393SINCFRAME = $(FRAMEDIR)/System.framework 394SINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Headers 395SPINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/PrivateHeaders 396SRESDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Resources 397 398ifndef INCDIR 399 INCDIR = $(HEADER_INSTALL_PREFIX)/usr/include 400endif 401ifndef LCLDIR 402 LCLDIR = $(SPINCDIR) 403endif 404 405KINCVERS = A 406KINCFRAME = $(FRAMEDIR)/Kernel.framework 407KINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Headers 408KPINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/PrivateHeaders 409KRESDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Resources 410 411XNU_PRIVATE_UNIFDEF = -UMACH_KERNEL_PRIVATE -UBSD_KERNEL_PRIVATE -UIOKIT_KERNEL_PRIVATE -ULIBKERN_KERNEL_PRIVATE -ULIBSA_KERNEL_PRIVATE -UPEXPERT_KERNEL_PRIVATE -UXNU_KERNEL_PRIVATE 412 413 414PLATFORM_UNIFDEF = $(foreach x,$(SUPPORTED_PLATFORMS),$(if $(filter $(PLATFORM),$(x)),-DPLATFORM_$(x) $(foreach token,$(PLATFORM_UNIFDEF_BLACKLIST_TOKENS_$(x)),-U$(token)),-UPLATFORM_$(x))) 415 416SPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ 417SINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ 418KPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DKERNEL_PRIVATE -DPRIVATE -DKERNEL -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ 419KINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UPRIVATE -DKERNEL -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ 420 421 422# 423# Compononent Header file destinations 424# 425EXPDIR = EXPORT_HDRS/$(COMPONENT) 426 427# 428# Strip Flags 429# 430STRIP_FLAGS_RELEASE = -S -x 431STRIP_FLAGS_DEVELOPMENT = -S -x 432STRIP_FLAGS_DEBUG = -S 433STRIP_FLAGS_PROFILE = -S -x 434 435STRIP_FLAGS = $($(addsuffix $(CURRENT_KERNEL_CONFIG),STRIP_FLAGS_)) 436 437# 438# dsymutil flags 439# 440DSYMUTIL_FLAGS_X86_64 = --arch=x86_64 441 442DSYMUTIL_FLAGS = $($(addsuffix $(CURRENT_ARCH_CONFIG),DSYMUTIL_FLAGS_)) 443 444# 445# Man Page destination 446# 447MANDIR = /usr/share/man 448 449# 450# DEBUG alias location 451# 452DEVELOPER_EXTRAS_DIR = /AppleInternal/CoreOS/xnu_debug 453 454# 455# mach_kernel install location 456# 457INSTALL_KERNEL_DIR = / 458 459# 460# System.kext pseudo-kext install location 461# 462INSTALL_EXTENSIONS_DIR = /System/Library/Extensions 463 464# 465# KDK location for iOS 466# 467INSTALL_KERNEL_SYM_DIR = /System/Library/Extensions/KDK 468 469# 470# Misc. Etc. 471# 472INSTALL_SHARE_MISC_DIR = /usr/share/misc 473INSTALL_DTRACE_SCRIPTS_DIR = /usr/lib/dtrace 474 475# 476# Overrides for XBS build aliases 477# 478ifeq ($(RC_ProjectName),xnu_debug) 479INSTALL_KERNEL_DIR := $(DEVELOPER_EXTRAS_DIR) 480DELETE_KERNEL_FRAMEWORK_AND_MISC = 1 481INSTALL_XNU_DEBUG_FILES = 1 482endif 483ifeq ($(PLATFORM),iPhoneOS) 484INSTALL_PRIMARY_KERNEL_LIKE_NON_PRIMARY = 1 485INSTALL_KERNEL_SYM_TO_KDK = 1 486USE_BINARY_PLIST = 1 487else ifeq ($(PLATFORM),iPhoneSimulator) 488INSTALL_SYSTEM_FRAMEWORK_SYMLINKS = 1 489USE_BINARY_PLIST = 1 490endif 491 492# vim: set ft=make: 493