@@ -36,6 +36,10 @@ option(SWIFT_STDLIB_SIL_DEBUGGING
36
36
"Compile the Swift standard library with -gsil to enable debugging and profiling on SIL level"
37
37
FALSE )
38
38
39
+ option (SWIFT_CHECK_INCREMENTAL_COMPILATION
40
+ "Check if incremental compilation works when compiling the Swift libraries"
41
+ FALSE )
42
+
39
43
option (SWIFT_BUILD_TOOLS
40
44
"Build the Swift compiler and other tools"
41
45
TRUE )
@@ -230,14 +234,6 @@ option(SWIFT_STDLIB_ENABLE_RESILIENCE
230
234
"Build the standard libraries and overlays with resilience enabled; see docs/LibraryEvolution.rst"
231
235
FALSE )
232
236
233
- option (SWIFT_STDLIB_ENABLE_REFLECTION_METADATA
234
- "Build the standard libraries and overlays with remote reflection metadata; see docs/proposals/RemoteMirrors.rst"
235
- TRUE )
236
-
237
- option (SWIFT_STDLIB_ENABLE_REFLECTION_NAMES
238
- "Build the standard libraries and overlays with remote reflection names; see docs/proposals/RemoteMirrors.rst"
239
- FALSE )
240
-
241
237
option (SWIFT_STDLIB_SIL_SERIALIZE_ALL
242
238
"Build the standard libraries and overlays serializing all method bodies"
243
239
TRUE )
@@ -286,6 +282,7 @@ include(CMakeParseArguments)
286
282
include (SwiftTranslateFlag )
287
283
include (SwiftHandleGybSources )
288
284
include (SwiftSetIfArchBitness )
285
+ include (SwiftSource )
289
286
include (AddSwift )
290
287
include (SwiftConfigureSDK )
291
288
include (SwiftInstallComponents )
@@ -385,29 +382,78 @@ function(check_working_std_regex result_var_name)
385
382
# Apple operating systems use libc++, which has a working std::regex.
386
383
set ("${result_var_name} " TRUE PARENT_SCOPE )
387
384
else ()
388
- # libstdc++ 4.8 has an incomplete std::regex implementation, and crashes
389
- # on many regexes.
390
- # libstdc++ 4.9 works.
391
- set (std_regex_test_source
392
- "
393
- #include <regex>
394
- const std::regex broken_regex{
395
- \" ([a]+)\" ,
396
- std::regex::ECMAScript | std::regex::nosubs};
397
-
398
- int main() {}
399
- " )
400
-
401
- check_cxx_source_runs ("${std_regex_test_source} " result )
402
- if (result )
403
- set ("${result_var_name} " TRUE PARENT_SCOPE )
404
- else ()
385
+ if (CMAKE_CROSSCOMPILING )
386
+ # Can't run C source when cross-compiling; assume false until we have a static check.
405
387
set ("${result_var_name} " FALSE PARENT_SCOPE )
388
+ else ()
389
+ # libstdc++ 4.8 has an incomplete std::regex implementation, and crashes
390
+ # on many regexes.
391
+ # libstdc++ 4.9 works.
392
+ set (std_regex_test_source
393
+ "
394
+ #include <regex>
395
+ const std::regex broken_regex{
396
+ \" ([a]+)\" ,
397
+ std::regex::ECMAScript | std::regex::nosubs};
398
+
399
+ int main() {}
400
+ " )
401
+
402
+ check_cxx_source_runs ("${std_regex_test_source} " "${result_var_name} _TEST" )
403
+ if ("${${result_var_name} _TEST}" )
404
+ set ("${result_var_name} " TRUE PARENT_SCOPE )
405
+ else ()
406
+ set ("${result_var_name} " FALSE PARENT_SCOPE )
407
+ endif ()
406
408
endif ()
407
409
endif ()
408
410
endfunction ()
409
411
check_working_std_regex (SWIFT_HAVE_WORKING_STD_REGEX )
410
412
413
+ # If SWIFT_HOST_VARIANT_SDK not given, try to detect from the CMAKE_SYSTEM_NAME.
414
+ if (SWIFT_HOST_VARIANT_SDK )
415
+ set (SWIFT_HOST_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK} " )
416
+ else ()
417
+ if ("${CMAKE_SYSTEM_NAME} " STREQUAL "Linux" )
418
+ set (SWIFT_HOST_VARIANT_SDK_default "LINUX" )
419
+ elseif ("${CMAKE_SYSTEM_NAME} " STREQUAL "FreeBSD" )
420
+ set (SWIFT_HOST_VARIANT_SDK_default "FREEBSD" )
421
+ elseif ("${CMAKE_SYSTEM_NAME} " STREQUAL "CYGWIN" )
422
+ set (SWIFT_HOST_VARIANT_SDK_default "CYGWIN" )
423
+ elseif ("${CMAKE_SYSTEM_NAME} " STREQUAL "Darwin" )
424
+ set (SWIFT_HOST_VARIANT_SDK_default "OSX" )
425
+ else ()
426
+ message (FATAL_ERROR "Unable to detect SDK for host system: ${CMAKE_SYSTEM_NAME} " )
427
+ endif ()
428
+ endif ()
429
+
430
+ # If SWIFT_HOST_VARIANT_ARCH not given, try to detect from the CMAKE_SYSTEM_PROCESSOR.
431
+ if (SWIFT_HOST_VARIANT_ARCH )
432
+ set (SWIFT_HOST_VARIANT_ARCH_default, "${SWIFT_HOST_VARIANT_ARCH} " )
433
+ else ()
434
+ if ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "x86_64" )
435
+ set (SWIFT_HOST_VARIANT_ARCH_default "x86_64" )
436
+ elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "aarch64" )
437
+ set (SWIFT_HOST_VARIANT_ARCH_default "aarch64" )
438
+ elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "ppc64" )
439
+ set (SWIFT_HOST_VARIANT_ARCH_default "powerpc64" )
440
+ elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "ppc64le" )
441
+ set (SWIFT_HOST_VARIANT_ARCH_default "powerpc64le" )
442
+ # FIXME: Only matches v6l/v7l - by far the most common variants
443
+ elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "armv6l" )
444
+ set (SWIFT_HOST_VARIANT_ARCH_default "armv6" )
445
+ elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "armv7l" )
446
+ set (SWIFT_HOST_VARIANT_ARCH_default "armv7" )
447
+ else ()
448
+ message (FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR} " )
449
+ endif ()
450
+ endif ()
451
+
452
+ set (SWIFT_HOST_VARIANT_SDK "${SWIFT_HOST_VARIANT_SDK_default} " CACHE STRING
453
+ "Deployment sdk for Swift host tools (the compiler)." )
454
+ set (SWIFT_HOST_VARIANT_ARCH "${SWIFT_HOST_VARIANT_ARCH_default} " CACHE STRING
455
+ "Deployment arch for Swift host tools (the compiler)." )
456
+
411
457
#
412
458
# Enable additional warnings.
413
459
#
@@ -434,114 +480,95 @@ function(is_sdk_requested name result_var_name)
434
480
endif ()
435
481
endfunction ()
436
482
437
- # FIXME: separate the notions of SDKs used for compiler tools and target
438
- # binaries.
439
- if ("${CMAKE_SYSTEM_NAME} " STREQUAL "Linux" )
483
+ # FIXME: the parameters we specify in SWIFT_SDKS are lacking architecture specifics,
484
+ # so we need to hard-code it. For example, the SDK for Android is just 'ANDROID',
485
+ # which we assume below to be armv7.
486
+ # The iOS SDKs all have their architectures hardcoded because they are just specified by name (e.g. 'IOS' or 'WATCHOS').
487
+ # We can't cross-compile the standard library for another linux architecture,
488
+ # because the SDK list would just be 'LINUX' and we couldn't disambiguate it from the host.
489
+ #
490
+ # To fix it, we would need to append the architecture to the SDKs,
491
+ # for example: 'OSX-x86_64;IOS-armv7;...etc'.
492
+ # We could easily do that - we have all of that information in build-script-impl.
493
+ # Also, we would need to be provided with the sysroot for each SDK (see SWIFT_ANDROID_SDK_PATH/SWIFT_SDK_ANDROID_PATH).
494
+ # Darwin targets cheat and use `xcrun`.
495
+
496
+ if ("${SWIFT_HOST_VARIANT_SDK} " STREQUAL "LINUX" )
497
+
440
498
set (CMAKE_EXECUTABLE_FORMAT "ELF" )
441
-
442
499
set (SWIFT_HOST_VARIANT "linux" CACHE STRING
443
500
"Deployment OS for Swift host tools (the compiler) [linux]." )
444
501
445
- set ( SWIFT_HOST_VARIANT_SDK "LINUX" )
446
- set ( SWIFT_PRIMARY_VARIANT_SDK_default "LINUX " )
447
-
448
- # FIXME: This will not work while trying to cross-compile.
449
- if ("${CMAKE_SYSTEM_PROCESSOR } " STREQUAL "x86_64 " )
450
- set (SWIFT_HOST_VARIANT_ARCH "x86_64 " )
451
- set ( SWIFT_PRIMARY_VARIANT_ARCH_default "x86_64 " )
452
-
453
- if ("${SWIFT_ANDROID_NDK_PATH } " STREQUAL " " )
454
- set (swift_can_crosscompile_stdlib FALSE )
502
+ # Calculate the host triple
503
+ if ( " ${SWIFT_HOST_TRIPLE} " STREQUAL " " )
504
+ if ( " ${SWIFT_HOST_VARIANT_ARCH} " STREQUAL "x86_64" )
505
+ set ( SWIFT_HOST_TRIPLE "x86_64-unknown-linux-gnu" )
506
+ elseif ("${SWIFT_HOST_VARIANT_ARCH } " STREQUAL "aarch64 " )
507
+ set (SWIFT_HOST_TRIPLE "aarch64-unknown-linux-gnu " )
508
+ elseif ( " ${SWIFT_HOST_VARIANT_ARCH} " MATCHES "(powerpc64|powerpc64le) " )
509
+ set ( SWIFT_HOST_TRIPLE " ${SWIFT_HOST_VARIANT_ARCH} -unknown-linux-gnu" )
510
+ elseif ("${SWIFT_HOST_VARIANT_ARCH } " MATCHES "(armv6|armv7) " )
511
+ set (SWIFT_HOST_TRIPLE " ${SWIFT_HOST_VARIANT_ARCH} -unknown-linux-gnueabihf" )
455
512
else ()
456
- set ( swift_can_crosscompile_stdlib TRUE )
513
+ message ( FATAL_ERROR "Unable to calculate triple for linux host on ${SWIFT_HOST_VARIANT_ARCH} " )
457
514
endif ()
515
+ endif ()
458
516
459
- is_sdk_requested (LINUX swift_build_linux )
460
- if (swift_build_linux )
461
- configure_sdk_unix (LINUX "Linux" "linux" "linux" "x86_64" "x86_64-unknown-linux-gnu" )
462
- set (SWIFT_PRIMARY_VARIANT_SDK_default "LINUX" )
463
- set (SWIFT_PRIMARY_VARIANT_ARCH_default "x86_64" )
464
- endif ()
517
+ # Should we build the standard library for the host?
518
+ is_sdk_requested (LINUX swift_build_linux )
519
+ if (swift_build_linux )
520
+ configure_sdk_unix (LINUX "Linux" "linux" "${SWIFT_HOST_VARIANT} " "${SWIFT_HOST_VARIANT_ARCH} " "${SWIFT_HOST_TRIPLE} " "/" )
521
+ set (SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK} " )
522
+ set (SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH} " )
523
+ endif ()
465
524
466
- is_sdk_requested (ANDROID swift_build_android )
467
- if (swift_build_android AND ${swift_can_crosscompile_stdlib} )
468
- configure_sdk_unix (ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi" )
469
- # This must be set, as variables such as "${SWIFT_SDK_${sdk}_PATH}" are
470
- # referenced in several other locations.
471
- set (SWIFT_SDK_ANDROID_PATH "${SWIFT_ANDROID_SDK_PATH} " )
525
+ # Compatible cross-compile SDKS for LINUX: ANDROID (arch always armv7)
526
+ is_sdk_requested (ANDROID swift_build_android )
527
+ if ("${SWIFT_ANDROID_NDK_PATH} " STREQUAL "" )
528
+ set (swift_can_crosscompile_stdlib_android FALSE )
529
+ else ()
530
+ set (swift_can_crosscompile_stdlib_android TRUE )
531
+ endif ()
472
532
533
+ if (swift_build_android AND ${swift_can_crosscompile_stdlib_android} )
534
+ configure_sdk_unix (ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi" "${SWIFT_ANDROID_SDK_PATH} " )
535
+ # If we're not building for the host, the cross-compiled target should be the 'primary variant'.
536
+ if ("${swift_build_linux} " STREQUAL "FALSE" )
473
537
set (SWIFT_PRIMARY_VARIANT_SDK_default "ANDROID" )
474
538
set (SWIFT_PRIMARY_VARIANT_ARCH_default "armv7" )
475
539
endif ()
476
-
477
- # FIXME: This only matches ARMv6l (by far the most common variant).
478
- elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "armv6l" )
479
- configure_sdk_unix (LINUX "Linux" "linux" "linux" "armv6" "armv6-unknown-linux-gnueabihf" )
480
- set (SWIFT_HOST_VARIANT_ARCH "armv6" )
481
- set (SWIFT_PRIMARY_VARIANT_ARCH_default "armv6" )
482
- # FIXME: This only matches ARMv7l (by far the most common variant).
483
- elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "armv7l" )
484
- configure_sdk_unix (LINUX "Linux" "linux" "linux" "armv7" "armv7-unknown-linux-gnueabihf" )
485
- set (SWIFT_HOST_VARIANT_ARCH "armv7" )
486
- set (SWIFT_PRIMARY_VARIANT_ARCH_default "armv7" )
487
- elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "aarch64" )
488
- configure_sdk_unix (LINUX "Linux" "linux" "linux" "aarch64" "aarch64-unknown-linux-gnu" )
489
- set (SWIFT_HOST_VARIANT_ARCH "aarch64" )
490
- set (SWIFT_PRIMARY_VARIANT_ARCH_default "aarch64" )
491
- elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "ppc64" )
492
- configure_sdk_unix (LINUX "Linux" "linux" "linux" "powerpc64" "powerpc64-unknown-linux-gnu" )
493
- set (SWIFT_HOST_VARIANT_ARCH "powerpc64" )
494
- set (SWIFT_PRIMARY_VARIANT_ARCH_default "powerpc64" )
495
- elseif ("${CMAKE_SYSTEM_PROCESSOR} " STREQUAL "ppc64le" )
496
- configure_sdk_unix (LINUX "Linux" "linux" "linux" "powerpc64le" "powerpc64le-unknown-linux-gnu" )
497
- set (SWIFT_HOST_VARIANT_ARCH "powerpc64le" )
498
- set (SWIFT_PRIMARY_VARIANT_ARCH_default "powerpc64le" )
499
- else ()
500
- message (FATAL_ERROR "Unknown or unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR} " )
501
540
endif ()
502
541
503
- elseif ("${CMAKE_SYSTEM_NAME} " STREQUAL "FreeBSD" )
542
+ elseif ("${SWIFT_HOST_VARIANT_SDK} " STREQUAL "FREEBSD" )
543
+
544
+ set (CMAKE_EXECUTABLE_FORMAT "ELF" )
545
+ set (SWIFT_HOST_VARIANT "freebsd" CACHE STRING
546
+ "Deployment OS for Swift host tools (the compiler) [freebsd]." )
547
+
504
548
# FIXME: Using the host OS version won't produce correct results for
505
549
# cross-compilation.
506
550
string (REPLACE "[-].*" "" FREEBSD_SYSTEM_VERSION ${CMAKE_SYSTEM_VERSION} )
507
551
message (STATUS "FreeBSD Version: ${FREEBSD_SYSTEM_VERSION} " )
508
552
configure_sdk_unix (FREEBSD "FreeBSD" "freebsd" "freebsd" "x86_64"
509
- "x86_64-unknown-freebsd${FREEBSD_SYSTEM_VERSION} " )
510
-
511
- set (CMAKE_EXECUTABLE_FORMAT "ELF" )
512
-
513
- set (SWIFT_HOST_VARIANT "freebsd" CACHE STRING
514
- "Deployment OS for Swift host tools (the compiler) [freebsd]." )
515
-
516
- set (SWIFT_HOST_VARIANT_SDK "FREEBSD" )
517
- set (SWIFT_HOST_VARIANT_ARCH "x86_64" )
518
-
519
- set (SWIFT_PRIMARY_VARIANT_SDK_default "FREEBSD" )
553
+ "x86_64-unknown-freebsd${FREEBSD_SYSTEM_VERSION} " "/" )
554
+ set (SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK} " )
520
555
set (SWIFT_PRIMARY_VARIANT_ARCH_default "x86_64" )
521
- elseif ("${CMAKE_SYSTEM_NAME} " STREQUAL "CYGWIN" )
522
- configure_sdk_unix (CYGWIN "Cygwin" "windows" "cygwin" "x86_64" "x86_64-unknown-windows-cygnus" )
523
-
524
- # set(CMAKE_EXECUTABLE_FORMAT "ELF")
525
-
556
+
557
+ elseif ("${SWIFT_HOST_VARIANT_SDK} " STREQUAL "CYGWIN" )
558
+
559
+ # set(CMAKE_EXECUTABLE_FORMAT "ELF")
526
560
set (SWIFT_HOST_VARIANT "windows" CACHE STRING
527
561
"Deployment OS for Swift host tools (the compiler) [windows]." )
528
-
529
- set (SWIFT_HOST_VARIANT_SDK "CYGWIN" )
530
- set (SWIFT_HOST_VARIANT_ARCH "x86_64" )
531
562
532
- set (SWIFT_PRIMARY_VARIANT_SDK_default "CYGWIN" )
563
+ configure_sdk_unix (CYGWIN "Cygwin" "windows" "cygwin" "windows" "x86_64-unknown-windows-cygnus" "/" )
564
+ set (SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK} " )
533
565
set (SWIFT_PRIMARY_VARIANT_ARCH_default "x86_64" )
534
- elseif ( " ${CMAKE_SYSTEM_NAME} " STREQUAL "Darwin" )
535
- # Set defaults.
566
+
567
+ elseif ( " ${SWIFT_HOST_VARIANT_SDK} " MATCHES "(OSX|IOS*|TVOS*|WATCHOS*)" )
536
568
537
569
set (SWIFT_HOST_VARIANT "macosx" CACHE STRING
538
570
"Deployment OS for Swift host tools (the compiler) [macosx, iphoneos]." )
539
571
540
- set (SWIFT_HOST_VARIANT_SDK "OSX" CACHE STRING
541
- "Deployment sdk for Swift host tools (the compiler)." )
542
- set (SWIFT_HOST_VARIANT_ARCH "x86_64" CACHE STRING
543
- "Deployment arch for Swift host tools (the compiler)." )
544
-
545
572
# Display Xcode toolchain version.
546
573
# The SDK configuration below prints each SDK version.
547
574
execute_process (
@@ -562,6 +589,9 @@ elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
562
589
configure_target_variant (OSX-R "OS X Release" OSX R "Release" )
563
590
endif ()
564
591
592
+ # Compatible cross-compile SDKS for Darwin OSes: IOS, IOS_SIMULATOR, TVOS,
593
+ # TVOS_SIMULATOR, WATCHOS, WATCHOS_SIMULATOR (archs hardcoded below).
594
+
565
595
if (XCODE )
566
596
# FIXME: Cannot cross-compile stdlib using Xcode. Xcode insists on
567
597
# passing -mmacosx-version-min to the compiler, and we want to pass
@@ -649,9 +679,10 @@ elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
649
679
# set(SWIFT_PRIMARY_VARIANT ${SWIFT_PRIMARY_VARIANT_GUESS} CACHE STRING
650
680
# "[OSX-DA, OSX-RA, OSX-R, IOS-DA, IOS-RA, IOS-R, IOS_SIMULATOR-DA, IOS_SIMULATOR-RA, IOS_SIMULATOR-R]")
651
681
#
652
- # FIXME: hardcode OS X as the default variant for now .
682
+ # Primary variant is always OSX; even on iOS hosts .
653
683
set (SWIFT_PRIMARY_VARIANT_SDK_default "OSX" )
654
684
set (SWIFT_PRIMARY_VARIANT_ARCH_default "x86_64" )
685
+
655
686
endif ()
656
687
657
688
if ("${SWIFT_PRIMARY_VARIANT_SDK} " STREQUAL "" )
0 commit comments