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