Loading...
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
# -*- mode: makefile;-*-
#
# Copyright (C) 1999-2025 Apple Inc. All rights reserved.
#
# MakeInc.def contains global definitions for building,
# linking, and installing files.
#

#
# Architecture Configuration options
#
SUPPORTED_ARCH_CONFIGS := X86_64 X86_64H ARM64

#
# Kernel Configuration options
#
SUPPORTED_KERNEL_CONFIGS = RELEASE DEVELOPMENT DEBUG PROFILE KASAN SPTM


#
# Machine Configuration options
#

SUPPORTED_X86_64_MACHINE_CONFIGS = NONE
SUPPORTED_X86_64H_MACHINE_CONFIGS = NONE

ifneq ($(findstring _Sim,$(RC_ProjectName)),)
SUPPORTED_ARM64_MACHINE_CONFIGS = NONE
else ifneq ($(findstring _host,$(RC_ProjectName)),)
SUPPORTED_ARM64_MACHINE_CONFIGS = NONE
else
SUPPORTED_ARM64_MACHINE_CONFIGS = T6000 T6020 T6030 T6031 T6041 T8101 T8103 T8112 T8122 T8132 T8142 VMAPPLE

SPTM_ENABLED_SOCS_MacOSX = t6000 t8112 t6020 t8122 t6030 t6031 t8132 t6041 t8142
EXCLAVES_ENABLED_SOCS_MacOSX = t8142


endif

#
# Setup up *_LC variables during recursive invocations
#

ifndef CURRENT_ARCH_CONFIG_LC
	export CURRENT_ARCH_CONFIG_LC	:= $(shell printf "%s" "$(CURRENT_ARCH_CONFIG)" | $(TR) A-Z a-z)
endif

ifndef CURRENT_KERNEL_CONFIG_LC
	export CURRENT_KERNEL_CONFIG_LC := $(shell printf "%s" "$(CURRENT_KERNEL_CONFIG)" | $(TR) A-Z a-z)
endif

ifndef CURRENT_MACHINE_CONFIG_LC
	export CURRENT_MACHINE_CONFIG_LC := $(shell printf "%s" "$(CURRENT_MACHINE_CONFIG)" | $(TR) A-Z a-z)
endif

ARM64_EXTRA_BUILD_FLAGS =

# Enable BTI by default for all ARM64 targets
BTI_BUILD = 1


# -mkernel contains BTI by default
ifeq ($(BTI_BUILD),1)
	ARM64_EXTRA_BUILD_FLAGS += -DXNU_BUILT_WITH_BTI
else
	ARM64_EXTRA_BUILD_FLAGS += -fno-branch-target-identification -UXNU_BUILT_WITH_BTI
endif

MTE_SUPPORTED_SOCS = t8142

ifneq ($(filter $(CURRENT_MACHINE_CONFIG_LC),$(MTE_SUPPORTED_SOCS)),)
	DOCONF_KERNEL_TAG := -tag
endif

#
# Component List
#
COMPONENT_LIST	= osfmk bsd libkern iokit pexpert libsa security san
COMPONENT	= $(if $(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(firstword $(subst /, ,$(RELATIVE_SOURCE_PATH))))
COMPONENT_IMPORT_LIST = $(filter-out $(COMPONENT),$(COMPONENT_LIST))

MACHINE_FLAGS_ARM64_T8101 = -DARM64_BOARD_CONFIG_T8101			-mcpu=apple-a14 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T8103 = -DARM64_BOARD_CONFIG_T8103                  -mcpu=apple-a14 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T6000 = -DARM64_BOARD_CONFIG_T6000			-mcpu=apple-a14 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T6020 = -DARM64_BOARD_CONFIG_T6020 			-mcpu=apple-a15 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T8112 = -DARM64_BOARD_CONFIG_T8112 			-mcpu=apple-a15 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T6030 = -DARM64_BOARD_CONFIG_T6030 			-mcpu=apple-m3 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T6031 = -DARM64_BOARD_CONFIG_T6031 			-mcpu=apple-m3 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T6041 = -DARM64_BOARD_CONFIG_T6041			-mcpu=apple-m4 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T8122 = -DARM64_BOARD_CONFIG_T8122_T8130		-mcpu=apple-m3 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T8132 = -DARM64_BOARD_CONFIG_T8132			-mcpu=apple-m4 -D__ARM_ARCH_8_2__=1
MACHINE_FLAGS_ARM64_T8142 = -DARM64_BOARD_CONFIG_T8142 			-mcpu=apple-m4+memtag+predres2 -D__ARM_ARCH_8_2__=1

MACHINE_FLAGS_ARM64_VMAPPLE = -DARM64_BOARD_CONFIG_VMAPPLE              -march=armv8.5a+sme2 -D__ARM_ARCH_8_2__=1


#
# Deployment target flag
#
ifeq ($(PLATFORM),MacOSX)
    DEPLOYMENT_TARGET_FLAGS = -mmacosx-version-min=$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS = -Wl,-macosx_version_min,$(SDKVERSION)
else ifeq ($(PLATFORM),DriverKit)
    DEPLOYMENT_TARGET_FLAGS = -target apple-driverkit$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS = -Wl,-target,apple-driverkit$(SDKVERSION)
else ifeq ($(PLATFORM),WatchOS)
    DEPLOYMENT_TARGET_FLAGS = -mwatchos-version-min=$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS =
else ifeq ($(PLATFORM),tvOS)
    DEPLOYMENT_TARGET_FLAGS = -mtvos-version-min=$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS =
else ifeq ($(PLATFORM),AppleTVOS)
    DEPLOYMENT_TARGET_FLAGS = -mtvos-version-min=$(SDKVERSION)
else ifeq ($(PLATFORM),BridgeOS)
    DEPLOYMENT_TARGET_FLAGS = -mbridgeos-version-min=$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS =
else ifeq ($(PLATFORM),XROS)
    DEPLOYMENT_TARGET_FLAGS = -target unknown-apple-xros$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS = -Wl,-target,unknown-apple-xros$(SDKVERSION)
else ifneq ($(filter $(SUPPORTED_EMBEDDED_PLATFORMS),$(PLATFORM)),)
    DEPLOYMENT_TARGET_FLAGS = -miphoneos-version-min=$(SDKVERSION)
    DEPLOYMENT_LINKER_FLAGS = -Wl,-ios_version_min,$(SDKVERSION)
else ifneq ($(filter $(SUPPORTED_SIMULATOR_PLATFORMS),$(PLATFORM)),)
    DEPLOYMENT_TARGET_FLAGS =
    DEPLOYMENT_LINKER_FLAGS =
else
    DEPLOYMENT_TARGET_FLAGS =
    DEPLOYMENT_LINKER_FLAGS =
endif

ifeq ($(PLATFORM_FOR_CONFIG),MacOSX)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_OSX
else ifeq ($(PLATFORM_FOR_CONFIG),DriverKit)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_OSX
else ifeq ($(PLATFORM_FOR_CONFIG),WatchOS)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_WATCH
else ifeq ($(PLATFORM_FOR_CONFIG),tvOS)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_TV
else ifeq ($(PLATFORM_FOR_CONFIG),AppleTVOS)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_TV
else ifeq ($(PLATFORM_FOR_CONFIG),BridgeOS)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_BRIDGE
else ifeq ($(PLATFORM_FOR_CONFIG),XROS)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_XR
else ifneq ($(filter $(SUPPORTED_EMBEDDED_PLATFORMS),$(PLATFORM_FOR_CONFIG)),)
    DEPLOYMENT_TARGET_FLAGS += -DXNU_TARGET_OS_IOS
endif


DEPLOYMENT_TARGET_DEFINES = -DXNU_PLATFORM_$(PLATFORM_FOR_CONFIG)


#
# Standard defines list
#
DEFINES = -DAPPLE -DKERNEL -DKERNEL_PRIVATE -DXNU_KERNEL_PRIVATE \
	-DPRIVATE -D__MACHO__=1 -Dvolatile=__volatile -DXNU_KERN_EVENT_DATA_IS_VLA \
	-DCURRENT_MACHINE_CONFIG_LC=$(CURRENT_MACHINE_CONFIG_LC) \
	$(CONFIG_DEFINES) $(SEED_DEFINES)

# Append experimental definition
ifneq ($(RC_EXPERIMENTAL_SYSTEM_VERSION_COMPAT),)
DEFINES += -DXNU_EXPERIMENTAL_SYSTEM_VERSION_COMPAT
endif

# Enable caching with `make CCACHE=ccache`
# This intentionally does not override $(CC) because that will confuse
# utilities like mig.
CCACHE ?=

#
# Compiler command
#
KCC  = $(CCACHE) $(CC)
KC++ = $(CCACHE) $(CXX)

GENASSYM_KCC = $(CCACHE) $(CC)

#
# Compiler warning flags
#

USE_WERROR := 1
ifneq ($(BUILD_WERROR),)
USE_WERROR := $(BUILD_WERROR)
endif

ifeq ($(USE_WERROR),1)
WERROR := -Werror
endif

# Shared C/C++ warning flags
# NOTE: order matters here.  -Wno-xxx goes before opt-in of ones we want
WARNFLAGS_STD := \
	-Weverything \
	-Wundef-prefix=TARGET_OS_ \
	-Wundef-prefix=LCK_GRP_USE_ARG \
	-Wno-pedantic \
	$(WERROR) \
	-Wno-bad-function-cast \
	-Wno-bitwise-instead-of-logical \
	-Wno-c++-compat \
	-Wno-c++98-compat \
	-Wno-conditional-uninitialized \
	-Wno-covered-switch-default \
	-Wno-disabled-macro-expansion \
	-Wno-documentation-unknown-command \
	-Wno-extra-semi-stmt \
	-Wno-format-non-iso \
	-Wno-language-extension-token \
	-Wno-missing-variable-declarations \
	-Wno-packed \
	-Wno-padded \
	-Wno-ms-bitfield-padding \
	-Wno-partial-availability \
	-Wno-reserved-id-macro \
	-Wno-shift-sign-overflow \
	-Wno-switch-enum \
	-Wno-unaligned-access \
	-Wno-undef \
	-Wno-invalid-offsetof \
	-Wno-unused-macros \
	-Wno-used-but-marked-unused \
	-Wno-variadic-macros \
	-Wno-zero-length-array \
	-Wno-packed \
	-Wno-cast-function-type-strict \
	-Wno-incompatible-function-pointer-types-strict \
	-Wno-four-char-constants \
	-Wno-allocator-wrappers

# Avoid lock-step changes between compiler submissions and xnu.
WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-unknown-warning-option

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-anon-enum-enum-conversion

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-enum-enum-conversion

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-c99-designator

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-reorder-init-list

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-switch-default

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-tautological-value-range-compare

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-null-pointer-subtraction

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-deprecated-volatile

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-incompatible-function-pointer-types-strict

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-cast-function-type-strict

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-bounds-safety-legacy-checks-enabled

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-nrvo

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-unterminated-string-initialization

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-unnecessary-virtual-specifier

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-global-constructors

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-uninitialized-const-pointer

WARNFLAGS_STD := $(WARNFLAGS_STD) -Wno-sometimes-uninitialized

WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-quoted-include-in-framework-header

WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-declaration-after-statement

# Hand-written sign conversion diagnostics are resolved, but the
# auto-generated ones need mig and iig to be updated to fix.  Disable the
# diagnostic here until we've completed that:
WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-sign-compare \
	-Wno-sign-conversion

WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-pre-c11-compat

WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-missing-designated-field-initializers

WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-format-signedness

WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wno-switch-default

# Opt-ins:
WARNFLAGS_STD := $(WARNFLAGS_STD) \
	-Wpointer-arith \
	-Wxnu-typed-allocators


CWARNFLAGS_STD = \
	$(WARNFLAGS_STD)


# Can be overridden in Makefile.template or Makefile.$arch
export CWARNFLAGS ?= $(CWARNFLAGS_STD)

define add_perfile_cflags
$(1)_CWARNFLAGS_ADD += $2
endef

define rm_perfile_cflags
$(1)_CFLAGS_RM += $2
endef

CXXWARNFLAGS_STD = \
	$(WARNFLAGS_STD) \
	-Wno-c++98-compat-pedantic \
	-Wno-exit-time-destructors \
	-Wno-global-constructors \
	-Wno-old-style-cast

# Can be overridden in Makefile.template or Makefile.$arch
export CXXWARNFLAGS ?= $(CXXWARNFLAGS_STD)

define add_perfile_cxxflags
$(1)_CXXWARNFLAGS_ADD += $2
endef

#
# Default ARCH_FLAGS, for use with compiler/linker/assembler/mig drivers

ARCH_FLAGS_X86_64	  = -arch x86_64
ARCH_FLAGS_X86_64H	  = -arch x86_64h

ifeq ($(RC_ProjectName),xnu_libraries)
BUILD_STATIC_LINK := 1
BUILD_XNU_LIBRARY := 1
RC_NONARCH_CFLAGS += -D__BUILDING_XNU_LIBRARY__=1
ifneq ($(XNU_LibFlavour),)
RC_NONARCH_CFLAGS += -D__BUILDING_XNU_LIB_$(XNU_LibFlavour)__=1
endif
endif

ifneq ($(filter ARM ARM64,$(CURRENT_ARCH_CONFIG)),)

ifneq ($(findstring _Sim,$(RC_ProjectName)),)
ARCH_FLAGS_ARM64          = -arch arm64e
else ifneq ($(findstring _host,$(RC_ProjectName)),)
ARCH_FLAGS_ARM64          = -arch arm64e
else

ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG ?=

ifeq ($(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),)

ifneq ($(EMBEDDED_DEVICE_MAP),)
export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := $(shell $(EMBEDDED_DEVICE_MAP) -db $(EDM_DBPATH) -list -query SELECT DISTINCT KernelMachOArchitecture FROM Targets WHERE KernelPlatform IS \"$(CURRENT_MACHINE_CONFIG_LC)\" LIMIT 1 || echo UNKNOWN )
ifeq ($(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),)
ifeq ($(filter $(EXTRA_TARGET_CONFIGS_$(CURRENT_KERNEL_CONFIG)),$(CURRENT_MACHINE_CONFIG)),)
$(error Machine config $(CURRENT_MACHINE_CONFIG_LC) not found in EmbeddedDeviceMap)
endif
endif
endif

endif

ifeq ($(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),)

# Without embdedded device map, use a default arch string
export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := $(shell echo $(CURRENT_ARCH_CONFIG) | tr A-Z a-z)
ifneq ($(filter arm64,$(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG)),)
export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := arm64e
endif

endif


BUILD_STATIC_LINK := 1

ARCH_FLAGS_ARM64	  = -arch $(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG)

endif

else
# non arm machine config string
ifndef ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG
export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := $(shell echo $(CURRENT_ARCH_CONFIG) | tr A-Z a-z)
endif

endif

#
# Default CFLAGS
#
ifdef RC_NONARCH_CFLAGS
OTHER_CFLAGS = $(RC_NONARCH_CFLAGS)
endif

#
# Debug info
#
DSYMINFODIR	= Contents
DSYMKGMACROSDIR	= Contents/Resources
DSYMLLDBMACROSDIR = Contents/Resources/Python
DSYMDWARFDIR	= Contents/Resources/DWARF

DEBUG_CFLAGS := -g
BUILD_DSYM := 1

#
# We must not use -fno-keep-inline-functions, or it will remove the dtrace
# probes from the kernel.
#
CFLAGS_GEN = $(DEBUG_CFLAGS) -nostdlibinc \
	-ferror-limit=10000 \
	-fno-builtin \
	-fno-common \
	-ftrivial-auto-var-init=zero \
	-fsigned-bitfields \
	-fmerge-all-constants \
	-fno-c++-static-destructors \
	-Wframe-larger-than=0 -Wno-frame-larger-than \
	$(OTHER_CFLAGS)

CFLAGS_RELEASE	=
CFLAGS_DEVELOPMENT	=
CFLAGS_DEBUG	=
CFLAGS_KASAN = $(CFLAGS_DEVELOPMENT)
CFLAGS_PROFILE	=  -pg

CFLAGS_X86_64	= -Dx86_64 -DX86_64 -D__X86_64__ -DLP64 \
				-DPAGE_SIZE_FIXED -mkernel -msoft-float

CFLAGS_X86_64H = $(CFLAGS_X86_64)

# By default, all ARM64 targets use the small memory config
ARM64_LARGE_MEMORY = 0
ARM64_PLKSEG_ADDR  = 0xfffffff004004000
ARM64_LINK_ADDR    = 0xfffffff007004000

# Use ARM_LARGE_MEMORY config for all MacOSX targets.
ifneq ($(filter $(PLATFORM),MacOSX),)
ARM64_LARGE_MEMORY = 1
ARM64_PLKSEG_ADDR  = 0xfffffe0004004000
ARM64_LINK_ADDR    = 0xfffffe0007004000
endif


ifeq ($(ARM64_LARGE_MEMORY),1)
	ARM64_EXTRA_BUILD_FLAGS += -DARM_LARGE_MEMORY=1
else
	ARM64_EXTRA_BUILD_FLAGS += -UARM_LARGE_MEMORY
endif

ifeq ($(ARM64_LARGE_MEMORY_KERNONLY),1)
	ARM64_EXTRA_BUILD_FLAGS += -DARM_LARGE_MEMORY_KERNONLY=1
else
	ARM64_EXTRA_BUILD_FLAGS += -UARM_LARGE_MEMORY_KERNONLY
endif



ifeq ($(BUILD_XNU_LIBRARY),1)
# __static_testable makes some static function not static and generate these warnings
CFLAGS_KERNEL   = -Wno-missing-prototypes
else
CFLAGS_KERNEL   = -mkernel
endif

CFLAGS_ARM64	= -Darm64 -DARM64 -D__ARM64__ -DLP64 -DPAGE_SIZE_FIXED -DVM_KERNEL_LINK_ADDRESS=$(ARM64_LINK_ADDR) \
				$(ARM64_EXTRA_BUILD_FLAGS) -mno-implicit-sme -momit-leaf-frame-pointer -fno-strict-aliasing -D__API__=v4 $(CFLAGS_KERNEL)

CXXFLAGS_ARM64  = $(ARM64_EXTRA_BUILD_FLAGS)

CFLAGS_RELEASEX86_64 = -O2
CFLAGS_DEVELOPMENTX86_64 = -O2
CFLAGS_KASANX86_64 = $(CFLAGS_DEVELOPMENTX86_64)
# No space optimization for the DEBUG kernel for the benefit of gdb:
CFLAGS_DEBUGX86_64 = -O0
CFLAGS_PROFILEX86_64 = -O2

CFLAGS_RELEASEX86_64H = -O2
CFLAGS_DEVELOPMENTX86_64H = -O2
CFLAGS_KASANX86_64H = $(CFLAGS_DEVELOPMENTX86_64H)
# No space optimization for the DEBUG kernel for the benefit of gdb:
CFLAGS_DEBUGX86_64H = -O0
CFLAGS_PROFILEX86_64H = -O2

CFLAGS_RELEASEARM = -O2
CFLAGS_DEVELOPMENTARM = -O2
CFLAGS_DEBUGARM = -O0
CFLAGS_PROFILEARM = -O2

CFLAGS_RELEASEARM64 = -O2
CFLAGS_DEVELOPMENTARM64 = -O2
CFLAGS_KASANARM64 = $(CFLAGS_DEVELOPMENTARM64)
CFLAGS_DEBUGARM64 = -O0
CFLAGS_SPTMARM64 = $(CFLAGS_DEVELOPMENTARM64)
CFLAGS_PROFILEARM64 = -O2

#
# bounds-safety support
#
# Controlling flags:
#
# BOUND_CHECKS controls the support for the bounds-safety features.
# 	- On x86_64, bounds-safety features are disabled.
#	- On other platforms, explicitly setting BOUND_CHECKS=0
#		disables the support for the bounds-safety features
#	- Otherwise, the support for the bounds-safety features
#		is dynamically detected.
#
# BOUND_CHECKS_SOFT controls the support for the resumption of the bounds-safety traps.
#	- On x86_64, resumption of bounds-safety traps is not available.
#	- On other platforms, explicitly setting BOUND_CHECKS_SOFT=0
#		disables the support for the bounds-safety resumption
#	- Otherwise, the support for the bounds-safety features
#		is dynamically detected.
#
# Note: while it is generally expected that BOUND_CHECKS_SOFT will always
#     be accompanied with BOUND_CHECKS, a developer is allowed to use
#     BOUND_CHECKS_SOFT=1 as a shortcut for BOUND_CHECKS=1 BOUND_CHECKS_SOFT=1
#     The combination BOUND_CHECKS_SOFT=1 BOUND_CHECKS=0 is not supported.
#
#
ifndef BOUND_CHECKS
    ifeq ($(shell $(CC) -E -fbounds-safety /dev/null 2>/dev/null && echo 1),1)
        BOUND_CHECKS := 1
    else
        BOUND_CHECKS := 0
    endif
	export BOUND_CHECKS
endif # ifndef BOUND_CHECKS

ifndef BOUND_CHECKS_SOFT
	ifeq ($(shell $(CC) -E -fbounds-safety -ftrap-function-returns /dev/null 2>/dev/null && echo 1),1)
		BOUND_CHECKS_SOFT := 1
	else
		BOUND_CHECKS_SOFT := 0
	endif
	export BOUND_CHECKS_SOFT
endif # ifndef BOUND_CHECKS_SOFT

# On x86_64, the bounds-safety features are disabled
ifeq ($(CURRENT_ARCH_CONFIG_LC),x86_64)
	BOUND_CHECKS := 0
	BOUND_CHECKS_SOFT := 0
endif # x86_64

# When BOUND_CHECKS_SOFT is enabled, ensure that BOUND_CHECKS is enabled as well
ifneq ($(BOUND_CHECKS_SOFT),0)
    ifeq ($(BOUND_CHECKS),0)
        BOUND_CHECKS := 1
    endif # ifeq ($(BOUND_CHECKS),0)
endif # ifneq($(BOUND_CHECKS_SOFT),0)

# Set the values for the CFLAGS_BOUND_CHECKS* variables.
# Notes:
# 1. If building at desk, and the developer had set any of
#    CFLAGS_BOUND_CHECKS, CFLAGS_BOUND_CHECKS_SOFT, or CFLAGS_BOUND_CHECKS_DEBUG
#    the values are preserved. For B&I builds the values are reset.
# 2. The CFLAGS_BOUND_CHECKS_PENDING, CFLAGS_BOUND_CHECKS_ENABLE_NEW_CHECKS,
#    and CFLAGS_BOUND_CHECKS_DISABLE_NEW_CHECKS variables do not take into
#    consideration any pre-existing value.
#
ifeq ($(RC_XBS),YES)
    CFLAGS_BOUND_CHECKS :=
    CFLAGS_BOUND_CHECKS_SOFT :=
    CFLAGS_BOUND_CHECKS_DEBUG :=
else # ifeq ($(RC_XBS),YES)
    CFLAGS_BOUND_CHECKS ?=
    CFLAGS_BOUND_CHECKS_SOFT ?=
    CFLAGS_BOUND_CHECKS_DEBUG ?=
endif # ifeq ($(RC_XBS),YES)

export CFLAGS_BOUND_CHECKS
export CFLAGS_BOUND_CHECKS_SOFT
export CFLAGS_BOUND_CHECKS_DEBUG
CFLAGS_BOUND_CHECKS_PENDING = -DBOUND_CHECKS_PENDING=1 -Wno-self-assign
export CFLAGS_BOUND_CHECKS_PENDING
export CFLAGS_BOUND_CHECKS_ENABLE_NEW_CHECKS
export CFLAGS_BOUND_CHECKS_DISABLE_NEW_CHECKS

# If bounds-safety is available, update the CFLAGS_BOUND_CHECKS accordingly.
ifneq ($(BOUND_CHECKS),0)
	CFLAGS_BOUND_CHECKS += -fbounds-safety
	CFLAGS_BOUND_CHECKS_ENABLE_NEW_CHECKS := -fbounds-safety-bringup-missing-checks
	CFLAGS_BOUND_CHECKS_DISABLE_NEW_CHECKS := -fno-bounds-safety-bringup-missing-checks
else # ifneq($(BOUND_CHECKS),0)
	CFLAGS_BOUND_CHECKS += -Wno-error=self-assign
	CFLAGS_BOUND_CHECKS_ENABLE_NEW_CHECKS :=
	CFLAGS_BOUND_CHECKS_DISABLE_NEW_CHECKS :=
endif # ifneq($(BOUND_CHECKS),0)

# Propagate the value of CFLAGS_BOUND_CHECKS CFLAGS_BOUND_CHECKS_{SOFT,DEBUG} variants,
# and set the appropriate flags if trap resumption is supported.
CFLAGS_BOUND_CHECKS_SOFT += $(CFLAGS_BOUND_CHECKS)
CFLAGS_BOUND_CHECKS_DEBUG = $(CFLAGS_BOUND_CHECKS_SOFT)
ifneq ($(BOUND_CHECKS_SOFT),0)
    CFLAGS_BOUND_CHECKS_SOFT += -ftrap-function=ml_bound_chk_soft_trap -ftrap-function-returns
    CFLAGS_BOUND_CHECKS_DEBUG += -DBOUND_CHECKS_DEBUG=1
endif # ifneq($(BOUND_CHECKS_SOFT),0)

# Bounds-safety adoption mode
#
# * Tells Clang to run in bounds-safety adoption mode which is allowed to
#   produce better diagnostics but a slower build.
# * Doesn't try to suppress any warnings in staging (see Bounds-safety warning
#   staging)
#
BOUNDS_SAFETY_ADOPTION_MODE ?= 0
ifneq ($(BOUNDS_SAFETY_ADOPTION_MODE),0)
  ifeq ($(BOUND_CHECKS),0)
    $(error BOUNDS_SAFETY_ADOPTION_MODE cannot be enabled when BOUND_CHECKS=0)
  endif
  ifeq ($(RC_XBS),YES)
    # This mode should **only** be used at engineers' desks and not in B&I
    # builds because it may add compile-time overhead.
    $(error BOUNDS_SAFETY_ADOPTION_MODE should not be enabled in B&I builds)
  endif
  CFLAGS_BOUND_CHECKS += -fbounds-safety-adoption-mode
endif

# Bounds-safety warning staging
#
# To prevent new bounds-safety warnings in a soon to be submitted Clang from
# breaking the build they can be explicitly be prevented from being errors by
# adding `-Wno-error=<new_warning_name>` to
# `BOUNDS_SAFETY_DOWNGRADED_UPCOMING_WARNFLAGS`.
#
# A warning in `BOUNDS_SAFETY_DOWNGRADED_UPCOMING_WARNFLAGS` should be
# removed once the new Clang with the warning is in the OS and the code builds
# without it firing.
#
BOUNDS_SAFETY_DOWNGRADED_UPCOMING_WARNFLAGS =

ifneq ($(words $(BOUNDS_SAFETY_DOWNGRADED_UPCOMING_WARNFLAGS)),0)
  ifeq ($(BOUNDS_SAFETY_ADOPTION_MODE),0)
    # Note this implicitly relies on `-Wno-unknown-warning-option` already being
    # passed to the compiler.
    CFLAGS_BOUND_CHECKS +=  $(BOUNDS_SAFETY_DOWNGRADED_UPCOMING_WARNFLAGS)
  endif
endif

#
# Sanitizers Support (KASan, UBSan)
#

# Which kernel configurations are built with KCOV enabled.
KCOV_RUNTIME := KASAN

ifneq ($(filter RELEASE, $(KCOV_RUNTIME)),)
$(error "Sanitizer runtime should not be enabled for RELEASE kernel.")
endif


SAN=0

# KASan support
#

ifeq ($(CURRENT_KERNEL_CONFIG),KASAN)
# KASan kernel config implicitly enables the KASan instrumentation.
# Instrumentation for other sanitizers is enabled explicitly at build time.
KASAN = 1
endif

ifeq ($(KASAN),1)
SAN=1
BUILD_LTO=0

# KASan Light support
#
# Light mode omits the HWASAN stack instrumentation.
# Not supported by KASan Classic at this moment.

KASAN_LIGHT_PLATFORM := WatchOS

ifneq ($(filter $(PLATFORM), $(KASAN_LIGHT_PLATFORM)),)
KASAN_LIGHT=1
HWASAN_INSTRUMENT_STACK=0
else
KASAN_LIGHT=0
HWASAN_INSTRUMENT_STACK=1
endif

KASAN_DENYLIST=$(OBJROOT)/san/kasan-denylist-$(CURRENT_ARCH_CONFIG_LC)

# To calculate the kasan offset, subtract the lowest KVA to sanitize, shifted right by KASAN_SCALE_$INSTRUMENTATION bits,
# from the base address of the kasan shadow area, (e.g. for x86_64 solve the following equation:
# OFFSET = {VA mapped by the first KASAN PML4 [Currently #494]} - (LOWEST_KVA >> 3)
# OFFSET = (0ULL - (512GiB * (512 - 494))) - (LOWEST_SAN_KVA >> 3)
# OFFSET = FFFFF70000000000 - ((0ULL - (512GiB * (512 - 496))) >> 3) [PML4 #496 is the first possible KVA]
# OFFSET = FFFFF70000000000 - (FFFFF80000000000 >> 3)
# OFFSET = DFFFF80000000000
# ).
KASAN_OFFSET_X86_64=0xdffff80000000000
KASAN_OFFSET_X86_64H=$(KASAN_OFFSET_X86_64)
KASAN_OFFSET_ARM64=0xf000000000000000

KASAN_OFFSET=$($(addsuffix $(CURRENT_ARCH_CONFIG),KASAN_OFFSET_))

# CLANG HWASAN/KHWASAN instrumentation powers KASAN_TBI. HWASAN traditional prefixing
# is replaced by __asan_ to commonize exports across models.
KASAN_SCALE_TBI=4
CFLAGS_KASAN_INSTRUMENTATION_TBI = -DKASAN_TBI=1 -DKASAN_SCALE=$(KASAN_SCALE_TBI) \
	-fsanitize=kernel-hwaddress \
	-fsanitize-ignorelist=$(KASAN_DENYLIST) \
	-mllvm -hwasan-recover=0 \
	-mllvm -hwasan-mapping-offset=$(KASAN_OFFSET) \
	-mllvm -hwasan-instrument-atomics=1 \
	-mllvm -hwasan-instrument-stack=$(HWASAN_INSTRUMENT_STACK) \
	-mllvm -hwasan-generate-tags-with-calls=1 \
	-mllvm -hwasan-instrument-with-calls=0 \
	-mllvm -hwasan-use-short-granules=0 \
	-mllvm -hwasan-memory-access-callback-prefix="__asan_"


KASAN_SCALE_CLASSIC=3
CFLAGS_KASAN_INSTRUMENTATION_CLASSIC = -DKASAN_CLASSIC=1 -DKASAN_SCALE=$(KASAN_SCALE_CLASSIC) \
	-fsanitize=address \
	-mllvm -asan-globals-live-support \
	-mllvm -asan-mapping-offset=$(KASAN_OFFSET) \
	-fsanitize-ignorelist=$(KASAN_DENYLIST)

CFLAGS_KASANARM64 += $(CFLAGS_KASAN_INSTRUMENTATION_TBI)
CFLAGS_KASANX86_64 += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
CFLAGS_KASANX86_64H += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
CFLAGS_GEN += -DKASAN=1 -DKASAN_OFFSET=$(KASAN_OFFSET) -DKASAN_LIGHT=$(KASAN_LIGHT)

SFLAGS_KASANARM64 += $(CFLAGS_KASAN_INSTRUMENTATION_TBI)
SFLAGS_KASANX86_64 += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
SFLAGS_KASANX86_64H += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
SFLAGS_GEN += -DKASAN=1 -DKASAN_OFFSET=$(KASAN_OFFSET) -DKASAN_LIGHT=$(KASAN_LIGHT)

endif

# UBSan
#
# The Undefined Behavior sanitizer runtime is always built as part of, and only for,
# KASAN variants. UBSan instrumentation is disabled by default and only enabled explicitly
# when building with UBSAN=1.
#
# On iOS RELEASE and DEVELOPMENT kernels, a subset of UBSan checks is enabled along with a minimal
# runtime that emulates trap mode (but makes it recoverable).

ifeq ($(KASAN), 1)

ifeq ($(UBSAN),1)
SAN=1

UBSAN_RUNTIME =
UBSAN_CHECKS += signed-integer-overflow shift pointer-overflow bounds object-size # non-fatal (calls runtime, can return)
# UBSAN_CHECKS = undefined nullability unsigned-integer-overflow # everything
UBSAN_CHECKS_FATAL =                                           # fatal (calls runtime, must not return)
UBSAN_CHECKS_TRAP = vla-bound builtin                          # emit a trap instruction (no runtime support)
UBSAN_DISABLED += vptr function     # requires unsupported C++ runtime

# UBSan alignment + KASan code size is too large
# UBSan unreachable doesn't play nice with ASan (40723397)
UBSAN_DISABLED += alignment unreachable

endif

else

# DEVELOPMENT and RELEASE variants
ifeq ($(PLATFORM),iPhoneOS)

# Currently we have to keep alive two separated UBSAN runtimes (minimal for DEVELOPMENT,
# full for KASAN). This implies that we cannot use CFLAGS_$(CURRENT_KERNEL_CONFIG), because
# CFLAGS_DEVELOPMENT is folded into CFLAGS_KASAN. For the time being we leave this check here,
# as we work (independently) to both break the CFLAGS direct dependency and commonize the
# sanitizer runtimes.
UBSAN_MINIMAL_RUNTIME := DEVELOPMENT DEBUG
ifneq ($(filter $(CURRENT_KERNEL_CONFIG), $(UBSAN_MINIMAL_RUNTIME)),)

# This is (unfortunately) intentional. Currently the "kasan" denylist, which folds both
# ubsan and kasan specific files, is generated for all builds during the
# setup phase. The denylist file itself is divided per-sanitizer, so won't
# affect the UBSAN build outside of the entries that are legitimately
# intended for it.
UBSAN_DENYLIST=$(OBJROOT)/san/kasan-denylist-$(CURRENT_ARCH_CONFIG_LC)

UBSAN_CHECKS = signed-integer-overflow
UBSAN_RUNTIME = -fsanitize-minimal-runtime -fsanitize-ignorelist=$(UBSAN_DENYLIST)
UBSAN_CHECKS_TRAP =
UBSAN_CHECKS_FATAL =
UBSAN_DISABLED =
endif
endif

endif

CFLAGS_GEN += $(UBSAN_RUNTIME)
CFLAGS_GEN += $(foreach x,$(UBSAN_CHECKS) $(UBSAN_CHECKS_FATAL) $(UBSAN_CHECKS_TRAP),-fsanitize=$(x))
CFLAGS_GEN += $(foreach x,$(UBSAN_CHECKS_FATAL),-fno-sanitize-recover=$(x))
CFLAGS_GEN += $(foreach x,$(UBSAN_CHECKS_TRAP),-fsanitize-trap=$(x))
CFLAGS_GEN += $(foreach x,$(UBSAN_DISABLED),-fno-sanitize=$(x))

ifeq ($(KSANCOV),1)
# Enable SanitizerCoverage instrumentation in xnu
SAN = 1
KCOV_DENYLIST := $(OBJROOT)/san/kcov-denylist-$(CURRENT_ARCH_CONFIG_LC)
KCOV_CFLAGS := -fsanitize-coverage=trace-pc-guard,trace-cmp -fsanitize-coverage-ignorelist=$(KCOV_DENYLIST)
CFLAGS_GEN += $(KCOV_CFLAGS) -DKSANCOV=1
endif

ifeq ($(SAN),1)
CFLAGS_GEN += -fsanitize-ignorelist=$(OBJROOT)/san/kasan-denylist-$(CURRENT_ARCH_CONFIG_LC)
endif

# Any extra flags that get passed at the command line during build.
ifeq ($(CFLAGS_EXTRA),)
CFLAGS_EXTRA =
endif

CFLAGS	= $(CFLAGS_GEN) \
		  $($(addsuffix $(CURRENT_MACHINE_CONFIG),MACHINE_FLAGS_$(CURRENT_ARCH_CONFIG)_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) \
		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),CFLAGS_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),CFLAGS_))) \
		  $(DEPLOYMENT_TARGET_FLAGS) \
		  $(DEPLOYMENT_TARGET_DEFINES) \
		  $(DEFINES) \
		  $(CFLAGS_EXTRA)

#
# Default C++ flags
#

OTHER_CXXFLAGS	=

ifeq ($(BUILD_XNU_LIBRARY),1)
CXXFLAGS_KERNEL   = -fno-exceptions -Wno-missing-prototypes
else
CXXFLAGS_KERNEL   = -fapple-kext
endif

CXXFLAGS_GEN  = -std=gnu++2b -fsized-deallocation $(CXXFLAGS_KERNEL) $(OTHER_CXXFLAGS)

CXXFLAGS      = $(CXXFLAGS_GEN) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),CXXFLAGS_)) \
		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),CXXFLAGS_))

#
# Assembler command
#
AS	= $(CCACHE) $(CC)
S_KCC	= $(CC)

#
# Default SFLAGS
#
SFLAGS_GEN = -D__ASSEMBLER__ -DASSEMBLER $(OTHER_CFLAGS)

SFLAGS_RELEASE	=
SFLAGS_DEVELOPMENT	=

# When making non-compatible changes to the XNU runtime, it can be useful to build
# a KASAN kernel + runtime, but linked against a DEVELOPMENT kernel cache.
# Uncomment the lines below to be able to build development, but passing KASAN=1.
# #_ifeq ($(KASAN),1)
# SFLAGS_DEVELOPMENT += -DKASAN=1
# #_endif

SFLAGS_KASAN = $(SFLAGS_DEVELOPMENT) -DKASAN=1
SFLAGS_DEBUG	=
SFLAGS_PROFILE	=

SFLAGS_X86_64	= $(CFLAGS_X86_64)
SFLAGS_X86_64H	= $(CFLAGS_X86_64H)
SFLAGS_ARM64	= $(CFLAGS_ARM64)

SFLAGS	= $(SFLAGS_GEN) \
		  $($(addsuffix $(CURRENT_MACHINE_CONFIG),MACHINE_FLAGS_$(CURRENT_ARCH_CONFIG)_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),SFLAGS_)) \
		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),SFLAGS_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),SFLAGS_))) \
		  $(DEPLOYMENT_TARGET_FLAGS) \
		  $(DEPLOYMENT_TARGET_DEFINES) \
		  $(DEFINES)

#
# Linker command
#
LD	= $(KC++) -nostdlib

#
# Default LDFLAGS
#
# Availability of DWARF allows DTrace CTF (compressed type format) to be constructed.
# ctf_insert creates the CTF section.  It needs reserved padding in the
# headers for the load command segment and the CTF section structures.
#
LDFLAGS_KERNEL_GEN = \
	-nostdlib \
	-fapple-kext \
	-Wl,-e,__start \
	-Wl,-sectalign,__TEXT,__text,0x1000 \
	-Wl,-sectalign,__DATA,__common,0x1000 \
	-Wl,-sectalign,__DATA,__bss,0x1000 \
	-Wl,-sectcreate,__PRELINK_TEXT,__text,/dev/null \
	-Wl,-segprot,__PRELINK_TEXT,r-x,r-x \
	-Wl,-sectcreate,__PRELINK_INFO,__info,/dev/null \
	-Wl,-pagezero_size,0x0 \
	-Wl,-version_load_command \
	-Wl,-function_starts \
	-Wl,-headerpad,152

# LDFLAGS_KERNEL_SDK	= -L$(SDKROOT)/usr/local/lib/kernel -lfirehose_kernel
LDFLAGS_KERNEL_SDK	= -L$(SDKROOT)/usr/local/lib/kernel -L$(SDKROOT)/usr/local/lib/kernel/platform
ifneq ($(KDKROOT),)
LDFLAGS_KERNEL_SDK     += -L$(KDKROOT)/usr/local/lib/kernel/platform
endif

LDFLAGS_KERNEL_RELEASE	=
LDFLAGS_KERNEL_DEVELOPMENT =
LDFLAGS_KERNEL_KASAN = $(LDFLAGS_KERNEL_DEVELOPMENT)
LDFLAGS_KERNEL_DEBUG	=
LDFLAGS_KERNEL_PROFILE	=

# Tightbeam finds modules in the "tightbeam" subdirectory.
TIGHTBEAM_MODULE_DIR       = $(SDKROOT)/usr/local/lib/kernel/tightbeam

# KASLR static slide config:
ifndef SLIDE
SLIDE=0x00
endif
KERNEL_MIN_ADDRESS      = 0xffffff8000000000
KERNEL_BASE_OFFSET      = 0x100000
# POSIX shells use signed long for their arithmetic expressions. However,
# we're dealing with uintptr_t values here, so explicitly use bash which
# is known to be able to handle such larger values. ksh also works; dash
# and zsh both fail with different results (zsh even warns you).
KERNEL_STATIC_SLIDE     = $(shell $(BASH) -c 'printf "0x%016x" \
			  $$(( $(SLIDE) << 21 ))')
KERNEL_STATIC_BASE      = $(shell $(BASH) -c 'printf "0x%016x" \
			  $$(( $(KERNEL_MIN_ADDRESS) + $(KERNEL_BASE_OFFSET) ))')
KERNEL_HIB_SECTION_BASE = $(shell $(BASH) -c 'printf "0x%016x" \
			  $$(( $(KERNEL_STATIC_BASE) + $(KERNEL_STATIC_SLIDE) ))')
KERNEL_TEXT_BASE        = $(shell $(BASH) -c 'printf "0x%016x" \
			  $$(( $(KERNEL_HIB_SECTION_BASE) + 0x100000 ))')

LDFLAGS_KERNEL_RELEASEX86_64 = \
	-Wl,-pie \
	-Wl,-segaddr,__HIB,$(KERNEL_HIB_SECTION_BASE) \
	-Wl,-image_base,$(KERNEL_TEXT_BASE) \
	-Wl,-seg_page_size,__TEXT,0x200000 \
	-Wl,-sectalign,__HIB,__bootPT,0x1000 \
	-Wl,-sectalign,__HIB,__desc,0x1000 \
	-Wl,-sectalign,__HIB,__data,0x1000 \
	-Wl,-sectalign,__HIB,__text,0x1000 \
	-Wl,-sectalign,__HIB,__const,0x1000 \
	-Wl,-sectalign,__HIB,__bss,0x1000 \
	-Wl,-sectalign,__HIB,__common,0x1000 \
	-Wl,-sectalign,__HIB,__llvm_prf_cnts,0x1000 \
	-Wl,-sectalign,__HIB,__llvm_prf_names,0x1000 \
	-Wl,-sectalign,__HIB,__llvm_prf_data,0x1000 \
	-Wl,-sectalign,__HIB,__textcoal_nt,0x1000 \
	-Wl,-sectalign,__HIB,__cstring,0x1000 \
	-Wl,-sectalign,__DATA,__percpu,0x1000 \
	-Wl,-rename_section,__DATA,__const,__DATA_CONST,__const \
	-Wl,-segprot,__DATA_CONST,r--,r-- \
	-Wl,-rename_section,__KLD,__const,__KLDDATA,__const \
	-Wl,-rename_section,__KLD,__cstring,__KLDDATA,__cstring \
	-Wl,-segprot,__KLDDATA,rw-,rw- \
	-Wl,-segprot,__KLD,r-x,r-x \
	-Wl,-no_zero_fill_sections \
	$(LDFLAGS_NOSTRIP_FLAG)

ifeq ($(SAN),1)
LDFLAGS_KERNEL_RELEASEX86_64 += \
	-Wl,-sectalign,__HIB,__cstring,0x1000
endif

ifeq ($(KSANCOV),1)
LDFLAGS_KERNEL_RELEASEX86_64 += \
	-Wl,-sectalign,__HIB,__sancov_guards,0x1000 \
	-Wl,-sectalign,__HIB,__sancov_pcs,0x1000
endif

# Define KERNEL_BASE_OFFSET so known at compile time:
CFLAGS_X86_64 += -DKERNEL_BASE_OFFSET=$(KERNEL_BASE_OFFSET)
CFLAGS_X86_64H += -DKERNEL_BASE_OFFSET=$(KERNEL_BASE_OFFSET)

LDFLAGS_KERNEL_DEBUGX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64)
LDFLAGS_KERNEL_DEVELOPMENTX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64)
LDFLAGS_KERNEL_KASANX86_64 = $(LDFLAGS_KERNEL_DEVELOPMENTX86_64) \
	-Wl,-sectalign,__HIB,__asan_globals,0x1000 \
	-Wl,-sectalign,__HIB,__asan_liveness,0x1000 \
	-Wl,-sectalign,__HIB,__mod_term_func,0x1000 \
	-Wl,-rename_section,__HIB,__mod_init_func,__NULL,__mod_init_func \
	-Wl,-rename_section,__HIB,__eh_frame,__NULL,__eh_frame
LDFLAGS_KERNEL_PROFILEX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64)

LDFLAGS_KERNEL_RELEASEX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64)
LDFLAGS_KERNEL_DEBUGX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64H)
LDFLAGS_KERNEL_DEVELOPMENTX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64H)
LDFLAGS_KERNEL_KASANX86_64H = $(LDFLAGS_KERNEL_KASANX86_64)
LDFLAGS_KERNEL_PROFILEX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64H)

# Offset image base by page to have iBoot load kernel TEXT correctly.
# First page is used for various purposes : sleep token, reset vector.
# We also need a 32MB offset, as this is the minimum block mapping size
# for a 16KB page runtime, and we wish to use the first virtual block
# to map the low globals page.  We also need another 4MB to account for
# the address space reserved by L4 (because the reservation is not a
# multiple of the block size in alignment/length, we will implictly map
# it with our block mapping, and we therefore must reflect that the
# first 4MB of the block mapping for xnu do not belong to xnu).
# For the moment, kaliber has a unique memory layout (monitor at the top
# of memory).  Support this by breaking 16KB on other platforms and
# mandating 32MB alignment. Image base (i.e. __TEXT) must be 16KB
# aligned since ld64 will link with 16KB alignment for ARM64.
#
# We currently offset by an additional 32MB in order to reclaim memory.
# We need a dedicated virtual page for the low globals.  Our bootloader
# may have a significant chunk of memory (up to an L2 entry in size)
# that lies before the kernel.  The addition 32MB of virtual padding
# ensures that we have enough virtual address space to map all of that
# memory as part of the V-to-P mapping.
# 23355738 - put __PRELINK_TEXT first. We reserve enough room
# for 0x0000000003000000 = 48MB of kexts
#
# 0xfffffff000000000 (32MB range for low globals)
# 0xfffffff002000000 (32MB range to allow for large page physical slide)
# 0xfffffff004000000 (16KB range to reserve the first available page)
# 0xfffffff004004000 (48MB range for kexts)
# 0xfffffff007004000 (Start of xnu proper).
LDFLAGS_KERNEL_GENARM64 = \
	-Wl,-pie \
	-Wl,-static \
	-Wl,-segaddr,__PRELINK_TEXT,$(ARM64_PLKSEG_ADDR) \
	-Wl,-image_base,$(ARM64_LINK_ADDR) \
	\
	-Wl,-rename_section,__HIB,__text,__TEXT_EXEC,__hib_text \
	\
	-Wl,-rename_section,__HIB,__const,__DATA_CONST,__hib_const \
	-Wl,-rename_section,__HIB,__cstring,__DATA_CONST,__hib_const \
	-Wl,-rename_section,__HIB,__literal8,__DATA_CONST,__hib_const \
	-Wl,-rename_section,__HIB,__literal16,__DATA_CONST,__hib_const \
	\
	-Wl,-rename_segment,__HIB,__HIBDATA \
	\
	-Wl,-sectalign,__DATA,__const,0x4000 \
	-Wl,-sectalign,__DATA,__percpu,0x4000 \
	-Wl,-sectalign,__DATA,__data,0x4000 \
	-Wl,-rename_section,__DATA,__mod_init_func,__DATA_CONST,__mod_init_func \
	-Wl,-rename_section,__DATA,__mod_term_func,__DATA_CONST,__mod_term_func \
	-Wl,-rename_section,__DATA,__auth_ptr,__DATA_CONST,__auth_ptr \
	-Wl,-rename_section,__DATA,__auth_got,__DATA_CONST,__auth_got \
	-Wl,-rename_section,__DATA,__const,__DATA_CONST,__const \
	-Wl,-segprot,__DATA_CONST,r--,r-- \
	-Wl,-rename_section,__KLD,__const,__KLDDATA,__const \
	-Wl,-rename_section,__KLD,__cstring,__KLDDATA,__cstring \
	-Wl,-segprot,__KLDDATA,rw-,rw- \
	-Wl,-segprot,__KLD,r-x,r-x \
	-Wl,-rename_section,__TEXT,__text,__TEXT_EXEC,__text \
	-Wl,-rename_section,__TEXT,__stubs,__TEXT_EXEC,__stubs \
	-Wl,-sectcreate,"__PLK_TEXT_EXEC",__text,/dev/null \
	-Wl,-sectcreate,__PRELINK_DATA,__data,/dev/null \
	-Wl,-sectcreate,"__PLK_DATA_CONST",__data,/dev/null \
	-Wl,-sectcreate,"__PLK_LLVM_COV",__llvm_covmap,/dev/null \
	-Wl,-sectcreate,"__PLK_LINKEDIT",__data,/dev/null

# To support code coverage for kexts, the coverage mapping sections __llvm_covmap
# and __llvm_covfun are put into the __PLK_LLVM_COV segment rather than the
# standard __LLVM_COV segment. For later processing of the coverage data using
# llvm-cov, we move the coverage mapping for the kernel itself into the same
# segment (see also rdar://104951137)
ifeq ($(BUILD_CODE_COVERAGE),1)
LDFLAGS_KERNEL_GENARM64 += \
  -Wl,-rename_section,__LLVM_COV,__llvm_covmap,__PLK_LLVM_COV,__llvm_covmap \
  -Wl,-rename_section,__LLVM_COV,__llvm_covfun,__PLK_LLVM_COV,__llvm_covfun
endif

LDFLAGS_KERNEL_SEGARM64_SEG_ORDER = \
	__TEXT:__DATA_CONST:__DATA_SPTM:__LINKEDIT:__TEXT_EXEC:__TEXT_BOOT_EXEC:__KLD:__PPLTEXT:__PPLTRAMP:__PPLDATA_CONST:__LASTDATA_CONST:__LAST:__PPLDATA:__KLDDATA:__DATA:__HIBDATA:__BOOTDATA

LDFLAGS_KERNEL_SEGARM64 = \
	-Wl,-rename_section,__PPLDATA,__const,__PPLDATA_CONST,__const \
	-Wl,-segment_order,$(LDFLAGS_KERNEL_SEGARM64_SEG_ORDER) \
	-Wl,-segprot,__TEXT,r--,r-- \
	-Wl,-segprot,__TEXT_EXEC,r-x,r-x \
	-Wl,-segprot,__TEXT_BOOT_EXEC,r-x,r-x \
	-Wl,-segprot,__PPLTEXT,r-x,r-x \
	-Wl,-segprot,__PPLTRAMP,r-x,r-x \
	-Wl,-segprot,__PPLDATA_CONST,r--,r-- \
	-Wl,-segprot,__LASTDATA_CONST,r--,r-- \
	-Wl,-segprot,__LAST,r-x,r-x \

LDFLAGS_KERNEL_RELEASEARM64     = \
	$(LDFLAGS_KERNEL_GENARM64) \
	$(LDFLAGS_KERNEL_SEGARM64) \
	$(LDFLAGS_KERNEL_STRIP_LTO)

LDFLAGS_KERNEL_ONLY_CONFIG_RELEASEARM64     = \
	-Wl,-exported_symbols_list,$(TARGET)/all-kpi.exp

LDFLAGS_KERNEL_DEVELOPMENTARM64     = \
	$(LDFLAGS_KERNEL_GENARM64) \
	$(LDFLAGS_KERNEL_SEGARM64) \
	$(LDFLAGS_NOSTRIP_FLAG)

LDFLAGS_KERNEL_ONLY_CONFIG_DEVELOPMENTARM64 =

LDFLAGS_KERNEL_KASANARM64 = $(LDFLAGS_KERNEL_DEVELOPMENTARM64)
LDFLAGS_KERNEL_DEBUGARM64 = $(LDFLAGS_KERNEL_DEVELOPMENTARM64)
LDFLAGS_KERNEL_SPTMARM64 = $(LDFLAGS_KERNEL_DEVELOPMENTARM64)

LDFLAGS_KERNEL_ONLY_CONFIG_KASANARM64 = $(LDFLAGS_KERNEL_ONLY_CONFIG_DEVELOPMENTARM64)
LDFLAGS_KERNEL_ONLY_CONFIG_DEBUGARM64 = $(LDFLAGS_KERNEL_ONLY_CONFIG_DEVELOPMENTARM64)

#
# arm64e specific linker flags that should be used only when linking the kernel
# (and not the static kernel cache / kcgen)
#
LDFLAGS_KERNEL_ONLY_SUBARCH_arm64e = \
	-Wl,-add_split_seg_info \
	-Wl,-kernel

LDFLAGS_KERNEL_ONLY_SUBARCH_x86_64 = \
	-Wl,-add_split_seg_info \
	-Wl,-kernel
LDFLAGS_KERNEL_ONLY_SUBARCH_x86_64h = $(LDFLAGS_KERNEL_ONLY_SUBARCH_x86_64)

LDFLAGS_KERNEL	= $(LDFLAGS_KERNEL_GEN) \
		  $(LDFLAGS_KERNEL_SDK) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG),LDFLAGS_KERNEL_)) \
		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_)) \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_))) \
		  $(DEPLOYMENT_TARGET_FLAGS)

LDFLAGS_KERNEL_ONLY  +=   \
		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_ONLY_CONFIG_))) \
		  $($(addsuffix $(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),LDFLAGS_KERNEL_ONLY_SUBARCH_)) \
		  -Wl,-alias_list,$(TARGET)/all-alias.exp \
		  -Wl,-sectcreate,__LINKINFO,__symbolsets,$(TARGET)/symbolsets.plist -Wl,-segprot,__LINKINFO,r--,r--

LDFILES_KERNEL_ONLY = $(TARGET)/all-kpi.exp $(TARGET)/all-alias.exp $(TARGET)/symbolsets.plist

#
# Default runtime libraries to be linked with the kernel
#
LD_KERNEL_LIBS	   = -lcc_kext
LD_KERNEL_ARCHIVES = $(LDFLAGS_KERNEL_SDK) -lfirehose_kernel

# Link binary support library
ifneq ($(CURRENT_MACHINE_CONFIG),NONE)
        LDFLAGS_KERNEL_ONLY += -rdynamic -Wl,-force_load,$(KDKROOT)/System/Library/KernelSupport/lib$(CURRENT_MACHINE_CONFIG).os.$(CURRENT_KERNEL_CONFIG).a
endif

#
# Derive SPTM/TXM and Exclaves enablement from the EDM properties.
#
ifneq ($(EMBEDDED_DEVICE_MAP),)
PLATFORM_NORMALIZED := $(shell echo $(PLATFORM) | tr '[:upper:]' '[:lower:]')

SPTM_ENABLED := $(shell $(EMBEDDED_DEVICE_MAP) -db $(EDM_DBPATH) -query SELECT DISTINCT EnableSPTMTXM FROM Targets WHERE KernelPlatform IS \"$(CURRENT_MACHINE_CONFIG_LC)\" AND SDKPlatform IS \"$(PLATFORM_NORMALIZED)\" AND EnableSPTMTXM == 1)


EXCLAVES_ENABLED := $(shell $(EMBEDDED_DEVICE_MAP) -db $(EDM_DBPATH) -query SELECT DISTINCT HascL4 FROM Targets WHERE KernelPlatform IS \"$(CURRENT_MACHINE_CONFIG_LC)\" AND SDKPlatform IS \"$(PLATFORM_NORMALIZED)\" AND HascL4 == 1)
endif # !EMBEDDED_DEVICE_MAP

ifeq ($(CURRENT_KERNEL_CONFIG),SPTM)
  SPTM_ENABLED = 1
endif # SPTM


ifneq ($(filter $(CURRENT_MACHINE_CONFIG_LC),$(SPTM_ENABLED_SOCS_$(PLATFORM))),)
  SPTM_ENABLED = 1
endif
ifneq ($(filter $(CURRENT_MACHINE_CONFIG_LC),$(EXCLAVES_ENABLED_SOCS_$(PLATFORM))),)
  EXCLAVES_ENABLED := 1
endif

ifeq ($(SPTM_ENABLED),1)
  LD_KERNEL_ARCHIVES += -lTrustedExecutionMonitor_Kernel
  LD_KERNEL_ARCHIVES += -lsptm_xnu
  DOCONF_SPTM := -sptm
endif # !SPTM_ENABLED

ifeq ($(EXCLAVES_ENABLED),1)
  DOCONF_EXCLAVES := -exclaves
endif # !EXCLAVES_ENABLED


ifneq ($(wildcard $(SDKROOT)/usr/local/lib/kernel/platform/libTightbeam.a),)
XNU_CONFIG_TIGHTBEAM := 1
TIGHTBEAM_IN_SDK := 1
else ifneq ($(wildcard $(KDKROOT)/usr/local/lib/kernel/platform/libTightbeam.a),)
XNU_CONFIG_TIGHTBEAM := 1
endif
ifeq ($(XNU_CONFIG_TIGHTBEAM),1)
  ifeq ($(TIGHTBEAM_IN_SDK),1)
    # Force-import the Tightbeam static lib so that all of its symbols can be exported to kexts
    LD_KERNEL_ARCHIVES += -Wl,-force_load,$(SDKROOT)/usr/local/lib/kernel/platform/libTightbeam.a
    TIGHTBEAM_EXPORTS := $(SDKROOT)/usr/local/lib/kernel/platform/libTightbeam.exports
  else # !TIGHTBEAM_IN_SDK
    LD_KERNEL_ARCHIVES += -Wl,-force_load,$(KDKROOT)/usr/local/lib/kernel/platform/libTightbeam.a
    TIGHTBEAM_EXPORTS := $(KDKROOT)/usr/local/lib/kernel/platform/libTightbeam.exports
  endif # TIGHTBEAM_IN_SDK
endif

#
# DTrace support
#
ifndef DO_CTFMERGE
DO_CTFMERGE := 1
ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)
ifneq ($(PLATFORM),MacOSX)
DO_CTFMERGE := 0
endif
endif
endif # DO_CTFMERGE


#
# Default INCFLAGS
#
INCFLAGS_IMPORT	= $(patsubst %, -I$(OBJROOT)/EXPORT_HDRS/%, $(COMPONENT_IMPORT_LIST))
INCFLAGS_EXTERN	= -I$(SRCROOT)/EXTERNAL_HEADERS
INCFLAGS_GEN	= -I$(SRCROOT)/$(COMPONENT) -I$(OBJROOT)/EXPORT_HDRS/$(COMPONENT)
INCFLAGS_LOCAL	= -I.
INCFLAGS_SDK    = -I$(SDKROOT)/usr/local/include/kernel -I$(SDKROOT)/usr/local/include/iBoot -I$(SDKROOT)/$(KPINCDIR)/AppleFeatures
INCFLAGS_PLATFORM = -I$(SDKROOT)/$(KPINCDIR)/platform
ifneq ($(KDKROOT),)
INCFLAGS_SDK   += -I$(KDKROOT)/$(KPINCDIR) -I$(KDKROOT)/System/Library/KernelSupport
INCFLAGS_PLATFORM += -I$(KDKROOT)/$(KINCDIR)/platform -I$(KDKROOT)/$(KPINCDIR)/platform
endif

INCFLAGS	= $(INCFLAGS_LOCAL) $(INCFLAGS_GEN) $(INCFLAGS_IMPORT) $(INCFLAGS_EXTERN) $(INCFLAGS_MAKEFILE) $(INCFLAGS_SDK) $(INCFLAGS_PLATFORM)

#
# Default MIGFLAGS
#
MIGFLAGS	= $(DEFINES) $(INCFLAGS) -novouchers $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
		$(DEPLOYMENT_TARGET_FLAGS)

#
# Default MIG Kernel Server flags
#
MIGKSFLAGS = \
	-DMACH_KERNEL_PRIVATE \
	-DKERNEL_SERVER=1 \
	-mach_msg2

#
# Default MIG KernelUser flags
#
MIGKUFLAGS = \
	-DMACH_KERNEL_PRIVATE \
	-DKERNEL_USER=1 \
	-DEXC_SERVER_AUDITTOKEN=1 \
	-DMACH_EXC_SERVER_AUDITTOKEN=1 \
	-maxonstack 1024

# Support for LLVM Profile Guided Optimization (PGO)

ifeq ($(BUILD_PROFILE),1)
CFLAGS_GEN += -fprofile-instr-generate -DPROFILE
CXXFLAGS_GEN += -fprofile-instr-generate -DPROFILE
endif

ifdef USE_PROFILE
CFLAGS_GEN += -fprofile-instr-use=$(USE_PROFILE)
CXXFLAGS_GEN += -fprofile-instr-use=$(USE_PROFILE)
LDFLAGS_KERNEL_GEN += -fprofile-instr-use=$(USE_PROFILE)

CFLAGS_GEN += -Wno-error=profile-instr-out-of-date
endif

# Support for LLVM Source-based Code coverage. Since enabling code coverage
# increases the size of __LINKEDIT, it might be necessary to set the keepsyms=1
# boot-arg when building the kernel with code coverage enabled.
ifeq ($(BUILD_CODE_COVERAGE),1)
CFLAGS_GEN += -fprofile-instr-generate -fcoverage-mapping
CXXFLAGS_GEN += -fprofile-instr-generate -fcoverage-mapping
endif

#
# Support for LLVM Link Time Optimization (LTO)
#
# LTO can be explicitly enabled or disabled with BUILD_LTO=1|0
# and defaults to enabled except for DEBUG kernels
#
# CFLAGS_NOLTO_FLAG is needed on a per-file basis (for files
# that deal poorly with LTO, or files that must be machine
# code *.o files for xnu to build (i.e, setsegname runs on
# them).
#
# LDFLAGS_NOSTRIP_FLAG is used to support configurations that
# do not utilize an export list.  For these configs to build,
# we need to prevent the LTO logic from dead stripping them.

LTO_ENABLED_RELEASE = 1
LTO_ENABLED_DEVELOPMENT = 1
LTO_ENABLED_DEBUG = 0
LTO_ENABLED_KASAN = 0
LTO_ENABLED_SPTM = $(LTO_ENABLED_DEVELOPMENT)

ifneq ($(BUILD_LTO),)
USE_LTO = $(BUILD_LTO)
else
USE_LTO = $(LTO_ENABLED_$(CURRENT_KERNEL_CONFIG))
endif

ifeq ($(USE_LTO),1)
CFLAGS_GEN	+= -flto -DBUILT_LTO=1
CXXFLAGS_GEN	+= -flto -DBUILT_LTO=1
LDFLAGS_KERNEL_LTO	= -Wl,-mllvm,-inline-threshold=100
LDFLAGS_KERNEL_GEN	+= $(LDFLAGS_KERNEL_LTO) -Wl,-object_path_lto,$(TARGET)/lto.o
LDFLAGS_NOSTRIP_FLAG = -rdynamic
LDFLAGS_KERNEL_STRIP_LTO = -Wl,-dead_strip,-no_dead_strip_inits_and_terms

CFLAGS_NOLTO_FLAG = -fno-lto
else
LDFLAGS_KERNEL_LTO =
LDFLAGS_NOSTRIP_FLAG =
LDFLAGS_KERNEL_STRIP_LTO =
CFLAGS_NOLTO_FLAG =
endif

ifneq ($(SAVE_OPT_RECORD),)
ifeq ($(USE_LTO),1)
REMARKS_FLAGS = -Wl,-mllvm,--lto-pass-remarks-filter="$(SAVE_OPT_RECORD)" \
                -Wl,-mllvm,--lto-pass-remarks-output=lto_remarks.opt.yaml \
                -Wl,-mllvm,--lto-pass-remarks-format=yaml
LDFLAGS_KERNEL_LTO += $(REMARKS_FLAGS)
LDFLAGS_KERNEL_GEN += $(REMARKS_FLAGS)
else
REMARKS_FLAGS = -foptimization-record-passes="$(SAVE_OPT_RECORD)" \
                -fsave-optimization-record=yaml
CFLAGS_GEN += $(REMARKS_FLAGS)
CXXFLAGS_GEN += $(REMARKS_FLAGS)
endif
endif

#
# Default VPATH
#
export VPATH = .:$(SOURCE)



#
# Macros that control installation of kernel and its header files
#
# install flags for header files
#
INSTALL_FLAGS = -c -S -m 0444
DATA_INSTALL_FLAGS = -c -S -m 0644
DATA_INSTALL_FLAGS_RO = -c -S -m 0444
EXEC_INSTALL_FLAGS = -c -S -m 0755

#
# Header file destinations
#

ifeq ($(DRIVERKIT),1)
    SDKHEADERSROOT=$(DRIVERKITRUNTIMEROOT)
    # only whitelisted headers install outside of the DriverKit Runtime hierarchy
    DRIVERKITSDKHEADERSROOT=$(DRIVERKITROOT)
    DRIVERKITFRAMEDIR = $(DRIVERKITROOT)/System/Library/Frameworks
endif

ifeq ($(EXCLAVEKIT),1)
    EXCLAVEKITSDKHEADERSROOT=$(EXCLAVEKITROOT)
    EXCLAVEKITFRAMEDIR = $(EXCLAVEKITROOT)/System/Library/Frameworks
endif

ifeq ($(EXCLAVECORE),1)
    EXCLAVECORESDKHEADERSROOT=$(EXCLAVECOREROOT)
    EXCLAVECOREFRAMEDIR = $(EXCLAVECOREROOT)/System/Library/Frameworks
endif

FRAMEDIR = $(SDKHEADERSROOT)/System/Library/Frameworks

IINCVERS = A
IINCFRAME = $(FRAMEDIR)/IOKit.framework
IINCDIR = $(IINCFRAME)/Versions/$(IINCVERS)/Headers
IPINCDIR = $(IINCFRAME)/Versions/$(IINCVERS)/PrivateHeaders
IRESDIR = $(IINCFRAME)/Versions/$(IINCVERS)/Resources

SINCVERS = B
SINCFRAME = $(FRAMEDIR)/System.framework
SINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Headers
SPINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/PrivateHeaders
SRESDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Resources

ifndef INCDIR
    INCDIR = $(SDKHEADERSROOT)/usr/include
endif
ifndef DRIVERKITINCDIR
    DRIVERKITINCDIR = $(DRIVERKITSDKHEADERSROOT)/usr/include
endif
ifndef EXCLAVEKITINCDIR
    EXCLAVEKITINCDIR = $(EXCLAVEKITSDKHEADERSROOT)/usr/include
endif
ifndef EXCLAVECOREINCDIR
    EXCLAVECOREINCDIR = $(EXCLAVECORESDKHEADERSROOT)/usr/include
endif
ifndef LCLDIR
	LCLDIR = $(SDKHEADERSROOT)/usr/local/include
endif
ifndef DRIVERKITLCLDIR
    DRIVERKITLCLDIR = $(DRIVERKITSDKHEADERSROOT)/usr/local/include
endif

KINCVERS = A
KINCFRAME = $(FRAMEDIR)/Kernel.framework
KINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Headers
KPINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/PrivateHeaders
KRESDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Resources

KLIBCXXDIR = $(KPINCDIR)/kernel_sdkroot
KLIBCXXINCDIR = $(KLIBCXXDIR)/usr/include

DKIT_INCFRAME = DriverKit.framework

ifeq ($(PLATFORM),MacOSX)
DKIT_INCVERS = A
DKIT_INCDIR = $(DKIT_INCFRAME)/Versions/$(DKIT_INCVERS)/Headers
DKIT_PINCDIR = $(DKIT_INCFRAME)/Versions/$(DKIT_INCVERS)/PrivateHeaders
else
# non-macOS SDK frameworks use shallow bundle structure
DKIT_INCDIR = $(DKIT_INCFRAME)/Headers
DKIT_PINCDIR = $(DKIT_INCFRAME)/PrivateHeaders
endif

# DriverKit SDK frameworks use shallow bundle structure
DRIVERKIT_DKIT_INCDIR = $(DKIT_INCFRAME)/Headers
DRIVERKIT_DKIT_PINCDIR = $(DKIT_INCFRAME)/PrivateHeaders

XNU_PRIVATE_UNIFDEF ?=
XNU_PRIVATE_UNIFDEF += -UMACH_KERNEL_PRIVATE
XNU_PRIVATE_UNIFDEF += -UBSD_KERNEL_PRIVATE
XNU_PRIVATE_UNIFDEF += -UIOKIT_KERNEL_PRIVATE
XNU_PRIVATE_UNIFDEF += -ULIBKERN_KERNEL_PRIVATE
XNU_PRIVATE_UNIFDEF += -ULIBSA_KERNEL_PRIVATE
XNU_PRIVATE_UNIFDEF += -UPEXPERT_KERNEL_PRIVATE
XNU_PRIVATE_UNIFDEF += -UXNU_KERNEL_PRIVATE


PLATFORM_UNIFDEF = $(foreach x,$(SUPPORTED_PLATFORMS),$(if $(filter $(PLATFORM),$(x)),-DXNU_PLATFORM_$(x) $(foreach token,$(PLATFORM_UNIFDEF_BLACKLIST_TOKENS_$(x)),-U$(token)),-UXNU_PLATFORM_$(x)))


# Some header guards need to be present and checked in kernel headers but removed from userspace headers
KERNEL_ONLY_GUARDS_UNIFDEF =

# Test-only guards should be stripped from all exported headers
TEST_ONLY_GUARDS_UNIFDEF = -USCHED_TEST_HARNESS

SPINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
SINCFRAME_UNIFDEF   = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
SFPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
DKPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -DDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
DKINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -DDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
EKPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -DEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
EKINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -UDRIVERKIT -DEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
ECPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -UEXCLAVEKIT -DEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
ECINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -DEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF) $(TEST_ONLY_GUARDS_UNIFDEF)
KPINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UMODULES_SUPPORTED -DKERNEL_PRIVATE -DKERNEL -DPRIVATE -UDRIVERKIT -UXNU_LIBCXX_SDKROOT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(TEST_ONLY_GUARDS_UNIFDEF)
LIBCXXINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UMODULES_SUPPORTED -DKERNEL_PRIVATE -DKERNEL -DPRIVATE -UDRIVERKIT -DXNU_LIBCXX_SDKROOT -UEXCLAVEKIT -UEXCLAVECORE  -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(TEST_ONLY_GUARDS_UNIFDEF)
KINCFRAME_UNIFDEF   = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UMODULES_SUPPORTED -UKERNEL_PRIVATE -DKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(TEST_ONLY_GUARDS_UNIFDEF)
PDATA_UNIFDEF       = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -DPRIVATE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(TEST_ONLY_GUARDS_UNIFDEF)
DATA_UNIFDEF        = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DMODULES_SUPPORTED -UPRIVATE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(TEST_ONLY_GUARDS_UNIFDEF)

#
# Compononent Header file destinations
#
EXPDIR = EXPORT_HDRS/$(COMPONENT)

#
# Strip Flags
#
STRIP_FLAGS_RELEASE	= -S -x
STRIP_FLAGS_DEVELOPMENT	= -S
STRIP_FLAGS_KASAN = $(STRIP_FLAGS_DEVELOPMENT)
STRIP_FLAGS_DEBUG	= -S
STRIP_FLAGS_SPTM = $(STRIP_FLAGS_DEVELOPMENT)
STRIP_FLAGS_PROFILE	= -S -x

STRIP_FLAGS	= $($(addsuffix $(CURRENT_KERNEL_CONFIG),STRIP_FLAGS_))

#
# dsymutil flags
#
DSYMUTIL_FLAGS_X86_64	= --arch=x86_64
DSYMUTIL_FLAGS_X86_64H	= --arch=x86_64h
DSYMUTIL_FLAGS_ARM64	=

DSYMUTIL_FLAGS = $($(addsuffix $(CURRENT_ARCH_CONFIG),DSYMUTIL_FLAGS_))




#
# Man Page destination
#
MANDIR = /usr/share/man

#
# DEBUG alias location
#
DEVELOPER_EXTRAS_DIR = /AppleInternal/CoreOS/xnu_$(CURRENT_KERNEL_CONFIG_LC)

#
# mach_kernel install location
#
INSTALL_KERNEL_DIR = /

#
# new OS X install location
#
SYSTEM_LIBRARY_KERNELS_DIR = /System/Library/Kernels

#
# File names in DSTROOT
#

ifeq ($(PLATFORM),MacOSX)
KERNEL_FILE_NAME_PREFIX = kernel
else
KERNEL_FILE_NAME_PREFIX = mach
endif

ifeq ($(CURRENT_MACHINE_CONFIG),NONE)
ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)
KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX)
KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX).py
else
KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC)
KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX).py
endif
else
KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC).$(CURRENT_MACHINE_CONFIG_LC)
KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX)_$(CURRENT_KERNEL_CONFIG_LC).py
endif

CURRENT_ALIAS_MACHINE_CONFIG = $(word 4,$(subst ^, ,$(CURRENT_BUILD_CONFIG)))
CURRENT_ALIAS_MACHINE_CONFIG_LC = $(shell printf "%s" "$(CURRENT_ALIAS_MACHINE_CONFIG)" | $(TR) A-Z a-z)
ifneq ($(CURRENT_ALIAS_MACHINE_CONFIG),)
ALIAS_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC).$(CURRENT_ALIAS_MACHINE_CONFIG_LC)
endif

#
# System.kext pseudo-kext install location
#
INSTALL_EXTENSIONS_DIR = /System/Library/Extensions
SYSTEM_KEXT_INFO_PLIST = $(addprefix $(INSTALL_EXTENSIONS_DIR),/System.kext/Info.plist)

#
# System.kext PlugIns install location
#
DSTROOT_SYSTEM_KEXT_PATH = $(addprefix $(DSTROOT)$(INSTALL_EXTENSIONS_DIR),/System.kext/PlugIns)
SYMROOT_SYSTEM_KEXT_PATH = $(addprefix $(SYMROOT),/System.kext/PlugIns)

#
# KDK location
#
INSTALL_KERNEL_SYM_DIR = /System/Library/Extensions/KDK

#
# Misc. Etc.
#
INSTALL_SHARE_MISC_DIR = /usr/share/misc
INSTALL_DTRACE_SCRIPTS_DIR = /usr/lib/dtrace
INSTALL_DTRACE_LIBEXEC_DIR = /usr/libexec/dtrace
INSTALL_ARIADNE_PLISTS_DIR = /AppleInternal/Library/Ariadne/Plists
#
# Generated xnu version file
#
XNU_VERSION = $(OBJROOT)/xnuVersion

#
# Overrides for XBS build aliases
#
ifneq ($(filter $(RC_ProjectName),xnu_headers_driverkit),)
USE_BINARY_PLIST = 1
else ifneq ($(filter $(RC_ProjectName),xnu_debug),)
INSTALL_KERNEL_DIR := $(DEVELOPER_EXTRAS_DIR)
INSTALL_KERNEL_SYM_DIR := $(DEVELOPER_EXTRAS_DIR)
INSTALL_KERNEL_SYM_TO_KDK = 1
INSTALL_XNU_DEBUG_FILES = 1
else ifneq ($(filter $(SUPPORTED_EMBEDDED_PLATFORMS),$(PLATFORM)),)
INSTALL_KERNEL_SYM_TO_KDK = 1
USE_BINARY_PLIST = 1
else ifneq ($(filter $(SUPPORTED_SIMULATOR_PLATFORMS),$(PLATFORM)),)
USE_BINARY_PLIST = 1
else ifeq ($(PLATFORM),MacOSX)
INSTALL_KERNEL_DIR := $(SYSTEM_LIBRARY_KERNELS_DIR)
INSTALL_KERNEL_SYM_DIR := $(SYSTEM_LIBRARY_KERNELS_DIR)
INSTALL_KERNEL_SYM_TO_KDK = $(if $(filter YES,$(DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT)),1,0)
endif

ifneq ($(filter $(RC_ProjectName),xnu_kasan),)
INSTALL_KASAN_ONLY = 1
endif

# vim: set ft=make: