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