diff --git a/docs/HowToGuides/GettingStarted.md b/docs/HowToGuides/GettingStarted.md index d031f6dddd3dc..a7534af860331 100644 --- a/docs/HowToGuides/GettingStarted.md +++ b/docs/HowToGuides/GettingStarted.md @@ -135,6 +135,9 @@ toolchain as a one-off, there are a couple of differences: - Before running `update-checkout`, double-check that `swift` is the only repository inside the `swift-project` directory. Otherwise, `update-checkout` may not clone the necessary dependencies. +- Running `update-checkout` may fail if the `git-lfs` dependency is not + installed. This may report as an error related to `icu`. A workaround is + passing `--skip-repository icu` to `update-checkout`. ## Installing dependencies diff --git a/utils/build-presets.ini b/utils/build-presets.ini index 3c37a558f5cbe..ed5dbacf5717d 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -840,6 +840,7 @@ llbuild swiftpm swift-driver xctest +libicu swiftdocc swiftformat @@ -853,6 +854,7 @@ install-swiftpm install-swift-driver install-swiftsyntax install-xctest +install-libicu install-prefix=/usr install-sourcekit-lsp install-swiftformat @@ -949,6 +951,7 @@ skip-test-xctest skip-test-foundation skip-test-libdispatch skip-test-playgroundsupport +skip-test-libicu skip-test-indexstore-db skip-test-sourcekit-lsp skip-test-swiftdocc @@ -1176,6 +1179,7 @@ mixin-preset= mixin_linux_install_components_with_clang build-subdir=buildbot_incremental +libicu llbuild swiftpm swift-driver @@ -1190,6 +1194,7 @@ install-llvm install-static-linux-config install-swift install-llbuild +install-libicu install-swiftpm install-swift-driver install-swiftsyntax @@ -1783,6 +1788,7 @@ skip-test-osx llvm-cmake-options=-DCLANG_DEFAULT_LINKER=gold foundation +libicu libdispatch test @@ -1826,14 +1832,17 @@ mixin-preset= mixin_linux_install_components_with_clang libdispatch +libicu foundation xctest libcxx=false +install-libicu install-foundation install-libdispatch install-xctest +skip-test-libicu skip-test-foundation skip-test-libdispatch skip-test-xctest @@ -2104,6 +2113,7 @@ mixin-preset=buildbot_indexstoredb_linux,sanitize mixin-preset= mixin_linux_install_components_with_clang +libicu llbuild swiftpm xctest @@ -2119,6 +2129,7 @@ reconfigure install-foundation install-libdispatch +install-libicu install-libcxx install-llvm install-static-linux-config @@ -3045,6 +3056,7 @@ mixin-preset= [preset: linux_lldb] lldb foundation +libicu libdispatch build-ninja diff --git a/utils/build-script-impl b/utils/build-script-impl index 1157f87b2675d..c7541cf6aef4b 100755 --- a/utils/build-script-impl +++ b/utils/build-script-impl @@ -298,6 +298,7 @@ components=( foundation libcxx libdispatch + libicu libxml2 zlib curl @@ -1248,6 +1249,7 @@ FOUNDATION_SWIFTFOUNDATION_SOURCE_DIR="${WORKSPACE}/swift-foundation" FOUNDATION_SWIFTFOUNDATIONICU_SOURCE_DIR="${WORKSPACE}/swift-foundation-icu" LIBDISPATCH_SOURCE_DIR="${WORKSPACE}/swift-corelibs-libdispatch" LIBDISPATCH_STATIC_SOURCE_DIR="${WORKSPACE}/swift-corelibs-libdispatch" +LIBICU_SOURCE_DIR="${WORKSPACE}/icu" LIBCXX_SOURCE_DIR="${WORKSPACE}/llvm-project/runtimes" SWIFT_COLLECTIONS_SOURCE_DIR="${WORKSPACE}/swift-collections" SWIFT_PATH_TO_STRING_PROCESSING_SOURCE="${WORKSPACE}/swift-experimental-string-processing" @@ -1255,6 +1257,7 @@ SWIFTSYNTAX_SOURCE_DIR="${WORKSPACE}/swift-syntax" SWIFT_SYNTAX_SOURCE_DIR="${WORKSPACE}/swift-syntax" [[ "${SKIP_BUILD_LIBCXX}" ]] || PRODUCTS+=(libcxx) +[[ "${SKIP_BUILD_LIBICU}" ]] || PRODUCTS+=(libicu) [[ "${SKIP_BUILD_SWIFT}" ]] || PRODUCTS+=(swift) [[ "${SKIP_BUILD_LLDB}" ]] || PRODUCTS+=(lldb) [[ "${SKIP_BUILD_LIBDISPATCH}" ]] || PRODUCTS+=(libdispatch) @@ -1342,6 +1345,8 @@ function build_directory_bin() { libdispatch|libdispatch_static) echo "${root}/${LIBDISPATCH_BUILD_TYPE}/bin" ;; + libicu) + ;; *) echo "error: unknown product: ${product}" exit 1 @@ -1480,6 +1485,8 @@ function cmake_config_opt() { libdispatch|libdispatch_static) echo "--config ${LIBDISPATCH_BUILD_TYPE}" ;; + libicu) + ;; *) echo "error: unknown product: ${product}" exit 1 @@ -2413,6 +2420,29 @@ for host in "${ALL_HOSTS[@]}"; do continue fi + if [[ ! "${SKIP_BUILD_LIBICU}" ]] ; then + ICU_ROOT=$(build_directory ${host} libicu)/tmp_install + ICU_LIBDIR="$(build_directory ${host} swift)/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}" + LIBICU_BUILD_ARGS=( + -DICU_ROOT:PATH=${ICU_ROOT} + -DICU_INCLUDE_DIR:PATH=${ICU_ROOT}/include + -DICU_DATA_LIBRARIES:FILEPATH=${ICU_LIBDIR}/libicudataswift.so + -DICU_DATA_LIBRARY:FILEPATH=${ICU_LIBDIR}/libicudataswift.so + -DICU_DATA_LIBRARY_DEBUG:FILEPATH=${ICU_LIBDIR}/libicudataswift.so + -DICU_DATA_LIBRARY_RELEASE:FILEPATH=${ICU_LIBDIR}/libicudataswift.so + -DICU_UC_LIBRARIES:FILEPATH=${ICU_LIBDIR}/libicuucswift.so + -DICU_UC_LIBRARY:FILEPATH=${ICU_LIBDIR}/libicuucswift.so + -DICU_UC_LIBRARY_DEBUG:FILEPATH=${ICU_LIBDIR}/libicuucswift.so + -DICU_UC_LIBRARY_RELEASE:FILEPATH=${ICU_LIBDIR}/libicuucswift.so + -DICU_I18N_LIBRARIES:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so + -DICU_I18N_LIBRARY:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so + -DICU_I18N_LIBRARY_DEBUG:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so + -DICU_I18N_LIBRARY_RELEASE:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so + ) + else + LIBICU_BUILD_ARGS=() + fi + if [[ ! "${SKIP_BUILD_LIBXML2}" ]]; then BASE_INSTALL_DIR="$(get_host_install_destdir ${host})" LIBXML2_HEADERS="${BASE_INSTALL_DIR}/usr/include/libxml2" @@ -2476,6 +2506,12 @@ for host in "${ALL_HOSTS[@]}"; do call rm -rf "${build_dir}" fi + # Set the PKG_CONFIG_PATH so that core-foundation can find the libraries and + # header files + LIBICU_BUILD_DIR="$(build_directory ${host} libicu)" + export PKG_CONFIG_PATH="${LIBICU_BUILD_DIR}/config:${PKG_CONFIG_PATH}" + export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":"${LIBICU_BUILD_DIR}/lib" + cmake_options=( ${cmake_options[@]} -DCMAKE_BUILD_TYPE:STRING=${FOUNDATION_BUILD_TYPE} @@ -2486,6 +2522,8 @@ for host in "${ALL_HOSTS[@]}"; do -DCMAKE_Swift_FLAGS:STRING="$(common_swift_flags)" -DCMAKE_INSTALL_PREFIX:PATH=$(get_host_install_prefix ${host}) + ${LIBICU_BUILD_ARGS[@]} + ${LIBXML2_BUILD_ARGS[@]} ${ZLIB_BUILD_ARGS[@]} @@ -2513,7 +2551,7 @@ for host in "${ALL_HOSTS[@]}"; do if [[ $(is_cross_tools_host ${host}) ]] ; then cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") - # Foundation looks for the libXML2 and libcurl libraries + # Foundation looks for the ICU, libXML2 and libcurl libraries # using find_package(), so search for them in # CROSS_COMPILE_DEPS_PATH using the CMake process for doing # so, see the linked CMake docs for more info: @@ -2573,6 +2611,62 @@ for host in "${ALL_HOSTS[@]}"; do ;; esac + ;; + libicu) + SWIFT_BUILD_PATH=$(build_directory ${host} swift) + LIBICU_BUILD_DIR=$(build_directory ${host} ${product}) + ICU_TMPINSTALL=$LIBICU_BUILD_DIR/tmp_install + ICU_TMPLIBDIR="${SWIFT_BUILD_PATH}/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}" + if [[ "${RECONFIGURE}" || ! -f "${LIBICU_BUILD_DIR}"/config.status ]]; then + echo "Reconfiguring libicu" + if [[ "$LIBICU_BUILD_TYPE" != "Release" ]] ; then + libicu_enable_debug="--enable-debug" + else + libicu_enable_debug="" + fi + call mkdir -p "${LIBICU_BUILD_DIR}" + + if [ $(true_false "${BUILD_SWIFT_STATIC_STDLIB}") == "TRUE" ]; then + libicu_enable_static="--enable-static" + else + libicu_enable_static="" + fi + + with_pushd "${LIBICU_BUILD_DIR}" \ + call env CXXFLAGS=-fPIC LDFLAGS='-Wl,-rpath=\$$ORIGIN' \ + "${LIBICU_SOURCE_DIR}"/icu4c/source/runConfigureICU Linux \ + ${icu_build_variant_arg} --prefix=${ICU_TMPINSTALL} \ + ${libicu_enable_debug} \ + --enable-renaming --with-library-suffix=swift \ + --libdir=${ICU_TMPLIBDIR} \ + --enable-shared --enable-static \ + --enable-strict --disable-icuio \ + --disable-plugins --disable-dyload --disable-extras \ + --disable-samples --disable-layoutex --with-data-packaging=auto + else + echo "Skipping reconfiguration of libicu" + fi + with_pushd "${LIBICU_BUILD_DIR}" \ + call make -j ${BUILD_JOBS} install + ICU_LIBDIR="$(build_directory ${host} swift)/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}" + ICU_LIBDIR_STATIC="$(build_directory ${host} swift)/lib/swift_static/${SWIFT_HOST_VARIANT}" + ICU_LIBDIR_STATIC_ARCH="$(build_directory ${host} swift)/lib/swift_static/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}" + # Add in the ICU renaming config into uconfig.h + call sed -e "/^#define __UCONFIG_H__/ r ${LIBICU_BUILD_DIR}/uconfig.h.prepend" -i ${ICU_TMPINSTALL}/include/unicode/uconfig.h + + if [ $(true_false "${BUILD_SWIFT_STATIC_STDLIB}") == "TRUE" ]; then + # Copy the static libs into the swift_static directory + call mkdir -p "${ICU_LIBDIR_STATIC_ARCH}" + for l in uc i18n data + do + lib="${ICU_LIBDIR}/libicu${l}swift.a" + call cp "${lib}" "${ICU_LIBDIR_STATIC}" + call cp "${lib}" "${ICU_LIBDIR_STATIC_ARCH}" + done + fi + + # libicu builds itself and doesn't use cmake + continue ;; *) echo "error: unknown product: ${product}" @@ -2853,6 +2947,17 @@ for host in "${ALL_HOSTS[@]}"; do # libdispatch_static continue ;; + libicu) + if [[ "${SKIP_TEST_LIBICU}" ]]; then + continue + fi + LIBICU_BUILD_DIR=$(build_directory ${host} ${product}) + echo "--- Running tests for ${product} ---" + with_pushd "${LIBICU_BUILD_DIR}/test" \ + call make -j ${BUILD_JOBS} + echo "--- Finished tests for ${product} ---" + continue + ;; *) echo "error: unknown product: ${product}" exit 1 @@ -3031,6 +3136,42 @@ for host in "${ALL_HOSTS[@]}"; do ;; esac ;; + libicu) + if [[ -z "${INSTALL_LIBICU}" ]]; then + continue + fi + echo "--- Installing ${product} ---" + ICU_BUILD_DIR=$(build_directory ${host} ${product}) + ICU_INSTALL_DIR="$(get_host_install_destdir ${host})$(get_host_install_prefix ${host})" + ICU_LIBDIR="$(build_directory ${host} swift)/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}" + LIBICU_DEST_DIR="${ICU_INSTALL_DIR}lib/swift/${SWIFT_HOST_VARIANT}" + call mkdir -p ${LIBICU_DEST_DIR} + + for l in uc i18n data + do + lib=${ICU_LIBDIR}/libicu${l}swift + echo "${lib} => ${LIBICU_DEST_DIR}" + call cp -d ${lib}.so ${lib}.so.* ${LIBICU_DEST_DIR} + done + + if [ $(true_false "${BUILD_SWIFT_STATIC_STDLIB}") == "TRUE" ]; then + LIBICU_DEST_DIR_STATIC="${ICU_INSTALL_DIR}lib/swift_static/${SWIFT_HOST_VARIANT}" + call mkdir -p ${LIBICU_DEST_DIR_STATIC} + for l in uc i18n data + do + lib=${ICU_LIBDIR}/libicu${l}swift + echo "${lib} => ${LIBICU_DEST_DIR_STATIC}" + call cp -d ${lib}.a ${LIBICU_DEST_DIR_STATIC} + done + fi + + ICU_TMP_INSTALL_DIR="${ICU_BUILD_DIR}/tmp_install" + call mkdir -p "${ICU_INSTALL_DIR}include" + call cp -a "${ICU_TMP_INSTALL_DIR}/include/unicode" "${ICU_INSTALL_DIR}include" + call mkdir -p "${ICU_INSTALL_DIR}share/icuswift" + call cp -a "${ICU_TMP_INSTALL_DIR}/share/icuswift" "${ICU_INSTALL_DIR}share" + continue + ;; *) echo "error: unknown product: ${product}" exit 1 diff --git a/utils/build.ps1 b/utils/build.ps1 index 753b4759a9f96..49c72b049a91a 100644 --- a/utils/build.ps1 +++ b/utils/build.ps1 @@ -1543,6 +1543,43 @@ function Build-CURL([Platform]$Platform, $Arch) { }) } +function Build-ICU([Platform]$Platform, $Arch) { + $ArchName = $Arch.LLVMName + + if (-not $ToBatch) { + if (-not (Test-Path -Path "$SourceCache\icu\icu4c\CMakeLists.txt")) { + Copy-Item $SourceCache\swift-installer-scripts\shared\ICU\CMakeLists.txt $SourceCache\icu\icu4c\ + Copy-Item $SourceCache\swift-installer-scripts\shared\ICU\icupkg.inc.cmake $SourceCache\icu\icu4c\ + } + } + + if ($Platform -eq "Windows" -and (($Arch.CMakeName -eq $BuildArch.CMakeName) -or ($Arch.CMakeName -ne "ARM64"))) { + $BuildToolsDefines = @{BUILD_TOOLS = "YES"} + } else { + $BuildToolsDefines = @{ + BUILD_TOOLS = "NO"; + BUILD_DATA = if ($Platform -eq "Android") { "NO" } else { "YES" }; + ICU_TOOLS_DIR = "$($BuildArch.BinaryCache)\windows\icu-69.1" + } + } + + Build-CMakeProject ` + -Src $SourceCache\icu\icu4c ` + -Bin "$($Arch.BinaryCache)\$Platform\icu-69.1" ` + -InstallTo "$LibraryRoot\icu-69.1\usr" ` + -Arch $Arch ` + -Platform $Platform ` + -UseMSVCCompilers C,CXX ` + -BuildTargets default ` + -Defines ($BuildToolsDefines + @{ + BUILD_SHARED_LIBS = "NO"; + CMAKE_SYSTEM_NAME = $Platform.ToString(); + CMAKE_POSITION_INDEPENDENT_CODE = "YES"; + CMAKE_INSTALL_BINDIR = "bin/$Platform/$ArchName"; + CMAKE_INSTALL_LIBDIR = "lib/$Platform/$ArchName"; + }) +} + function Build-Runtime([Platform]$Platform, $Arch) { $PlatformDefines = @{} if ($Platform -eq "Android") { @@ -1650,7 +1687,28 @@ function Build-Foundation([Platform]$Platform, $Arch, [switch]$Test = $false) { -BuildTargets $Targets ` -Defines (@{ FOUNDATION_BUILD_TOOLS = if ($Platform -eq "Windows") { "YES" } else { "NO" }; + # Turn off safeseh for lld as it has safeseh enabled by default + # and fails with an ICU data object file icudt69l_dat.obj. This + # matters to X86 only. + CMAKE_Swift_FLAGS = if ($Arch -eq $ArchX86) { @("-Xlinker", "/SAFESEH:NO") } else { "" }; CURL_DIR = "$LibraryRoot\curl-8.5.0\usr\lib\$Platform\$ShortArch\cmake\CURL"; + ICU_DATA_LIBRARY_RELEASE = if ($Platform -eq "Windows") { + "$LibraryRoot\icu-69.1\usr\lib\$Platform\$ShortArch\sicudt69.lib" + } else { + "$LibraryRoot\icu-69.1\usr\lib\$Platform\$ShortArch\libicudt69.a" + }; + ICU_I18N_LIBRARY_RELEASE = if ($Platform -eq "Windows") { + "$LibraryRoot\icu-69.1\usr\lib\$Platform\$ShortArch\sicuin69.lib" + } else { + "$LibraryRoot\icu-69.1\usr\lib\$Platform\$ShortArch\libicuin69.a" + }; + ICU_ROOT = "$LibraryRoot\icu-69.1\usr"; + ICU_INCLUDE_DIR = "$LibraryRoot\icu-69.1\usr\include"; + ICU_UC_LIBRARY_RELEASE = if ($Platform -eq "Windows") { + "$LibraryRoot\icu-69.1\usr\lib\$Platform\$ShortArch\sicuuc69.lib"; + } else { + "$LibraryRoot\icu-69.1\usr\lib\$Platform\$ShortArch\libicuuc69.a" + }; LIBXML2_LIBRARY = if ($Platform -eq "Windows") { "$LibraryRoot\libxml2-2.11.5\usr\lib\$Platform\$ShortArch\libxml2s.lib"; } else { @@ -2295,6 +2353,7 @@ if (-not $SkipBuild) { Invoke-BuildStep Build-ZLib Windows $Arch Invoke-BuildStep Build-XML2 Windows $Arch Invoke-BuildStep Build-CURL Windows $Arch + Invoke-BuildStep Build-ICU Windows $Arch Invoke-BuildStep Build-LLVM Windows $Arch # Build platform: SDK, Redist and XCTest @@ -2308,6 +2367,7 @@ if (-not $SkipBuild) { Invoke-BuildStep Build-ZLib Android $Arch Invoke-BuildStep Build-XML2 Android $Arch Invoke-BuildStep Build-CURL Android $Arch + Invoke-BuildStep Build-ICU Android $Arch Invoke-BuildStep Build-LLVM Android $Arch # Build platform: SDK, Redist and XCTest diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index b46003e8e09b6..996a7c5d97ff9 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -99,6 +99,9 @@ def _apply_default_arguments(args): if args.libdispatch_build_variant is None: args.libdispatch_build_variant = args.build_variant + if args.libicu_build_variant is None: + args.libicu_build_variant = args.build_variant + if args.libxml2_build_variant is None: args.libxml2_build_variant = args.build_variant @@ -817,6 +820,9 @@ def create_argument_parser(): option('--libdispatch', toggle_true('build_libdispatch'), help='build libdispatch') + option('--libicu', toggle_true('build_libicu'), + help='build libicu') + option('--static-libxml2', toggle_true('build_libxml2'), default=False, help='build static libxml2') @@ -940,6 +946,10 @@ def create_argument_parser(): const='Debug', help='build the Debug variant of libdispatch') + option('--debug-libicu', store('libicu_build_variant'), + const='Debug', + help='build the Debug variant of libicu') + option('--debug-libxml2', store('libxml2_build_variant'), const='Debug', help='build the Debug variant of libxml2') @@ -1573,6 +1583,7 @@ def create_argument_parser(): /swift-corelibs-xctest (optional) /swift-corelibs-foundation (optional) /swift-corelibs-libdispatch (optional) + /icu (optional) /libxml2 (optional) /zlib (optional) /curl (optional) diff --git a/utils/build_swift/tests/build_swift/test_driver_arguments.py b/utils/build_swift/tests/build_swift/test_driver_arguments.py index 6ea1992f4b1a8..fdcd3ed086225 100644 --- a/utils/build_swift/tests/build_swift/test_driver_arguments.py +++ b/utils/build_swift/tests/build_swift/test_driver_arguments.py @@ -534,6 +534,7 @@ def test_implied_defaults_build_variant(self): self.assertEqual(namespace.cmark_build_variant, 'Debug') self.assertEqual(namespace.foundation_build_variant, 'Debug') self.assertEqual(namespace.libdispatch_build_variant, 'Debug') + self.assertEqual(namespace.libicu_build_variant, 'Debug') self.assertEqual(namespace.lldb_build_variant, 'Debug') self.assertEqual(namespace.llvm_build_variant, 'Debug') self.assertEqual(namespace.swift_build_variant, 'Debug') diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index b4c2d095de853..47e5faecaf891 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -64,6 +64,7 @@ 'build_ios_simulator': False, 'build_jobs': multiprocessing.cpu_count(), 'build_libdispatch': False, + 'build_libicu': False, 'build_libxml2': False, 'build_zlib': False, 'build_curl': False, @@ -213,6 +214,7 @@ 'ios_all': False, 'legacy_impl': False, 'libdispatch_build_variant': 'Debug', + 'libicu_build_variant': 'Debug', 'libxml2_build_variant': 'Debug', 'linux_archs': None, 'lit_jobs': multiprocessing.cpu_count(), @@ -478,6 +480,7 @@ class BuildScriptImplOption(_BaseOption): dest='foundation_build_variant', value='Debug'), SetOption('--debug-libdispatch', dest='libdispatch_build_variant', value='Debug'), + SetOption('--debug-libicu', dest='libicu_build_variant', value='Debug'), SetOption('--debug-libxml2', dest='libxml2_build_variant', value='Debug'), SetOption('--debug-zlib', dest='zlib_build_variant', value='Debug'), SetOption('--debug-curl', dest='curl_build_variant', value='Debug'), @@ -629,6 +632,7 @@ class BuildScriptImplOption(_BaseOption): EnableOption('--only-executable-test'), EnableOption('--only-non-executable-test'), EnableOption('--libdispatch', dest='build_libdispatch'), + EnableOption('--libicu', dest='build_libicu'), EnableOption('--static-libxml2', dest='build_libxml2'), EnableOption('--static-zlib', dest='build_zlib'), EnableOption('--static-curl', dest='build_curl'), diff --git a/utils/swift_build_support/swift_build_support/build_script_invocation.py b/utils/swift_build_support/swift_build_support/build_script_invocation.py index 0666ba961a904..7f660a7e9d09c 100644 --- a/utils/swift_build_support/swift_build_support/build_script_invocation.py +++ b/utils/swift_build_support/swift_build_support/build_script_invocation.py @@ -112,6 +112,7 @@ def convert_to_impl_arguments(self): "--lldb-build-type", args.lldb_build_variant, "--foundation-build-type", args.foundation_build_variant, "--libdispatch-build-type", args.libdispatch_build_variant, + "--libicu-build-type", args.libicu_build_variant, "--xctest-build-type", args.build_variant, "--llbuild-build-type", args.build_variant, "--swift-enable-assertions", str(args.swift_assertions).lower(), @@ -273,6 +274,7 @@ def convert_to_impl_arguments(self): (args.build_llbuild, "llbuild"), (args.build_libcxx, "libcxx"), (args.build_libdispatch, "libdispatch"), + (args.build_libicu, "libicu"), (args.build_libxml2, 'libxml2'), (args.build_zlib, 'zlib'), (args.build_curl, 'curl') @@ -308,6 +310,7 @@ def convert_to_impl_arguments(self): "--skip-test-xctest", "--skip-test-foundation", "--skip-test-libdispatch", + "--skip-test-libicu", ] if args.build_runtime_with_host_compiler: impl_args += ["--build-runtime-with-host-compiler"] @@ -634,6 +637,8 @@ def compute_product_pipelines(self): builder.add_impl_product(products.LibCXX, is_enabled=self.args.build_libcxx) + builder.add_impl_product(products.LibICU, + is_enabled=self.args.build_libicu) builder.add_impl_product(products.Swift, is_enabled=self.args.build_swift) builder.add_impl_product(products.LLDB, diff --git a/utils/swift_build_support/swift_build_support/products/__init__.py b/utils/swift_build_support/swift_build_support/products/__init__.py index 1ef4efac89c5a..2d0532e91adde 100644 --- a/utils/swift_build_support/swift_build_support/products/__init__.py +++ b/utils/swift_build_support/swift_build_support/products/__init__.py @@ -18,6 +18,7 @@ from .indexstoredb import IndexStoreDB from .libcxx import LibCXX from .libdispatch import LibDispatch +from .libicu import LibICU from .libxml2 import LibXML2 from .llbuild import LLBuild from .lldb import LLDB @@ -49,6 +50,7 @@ 'Foundation', 'LibCXX', 'LibDispatch', + 'LibICU', 'LibXML2', 'Zlib', 'LibCurl', diff --git a/utils/swift_build_support/swift_build_support/products/benchmarks.py b/utils/swift_build_support/swift_build_support/products/benchmarks.py index 337ecd64e0d56..0ec3f4c897e28 100644 --- a/utils/swift_build_support/swift_build_support/products/benchmarks.py +++ b/utils/swift_build_support/swift_build_support/products/benchmarks.py @@ -17,6 +17,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -89,6 +90,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/foundation.py b/utils/swift_build_support/swift_build_support/products/foundation.py index 38759f5223d37..12057fe560d5c 100644 --- a/utils/swift_build_support/swift_build_support/products/foundation.py +++ b/utils/swift_build_support/swift_build_support/products/foundation.py @@ -14,6 +14,7 @@ from . import curl from . import libcxx from . import libdispatch +from . import libicu from . import libxml2 from . import llvm from . import product @@ -51,6 +52,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, libxml2.LibXML2, diff --git a/utils/swift_build_support/swift_build_support/products/indexstoredb.py b/utils/swift_build_support/swift_build_support/products/indexstoredb.py index fc7445d86b9a9..804c881e8038a 100644 --- a/utils/swift_build_support/swift_build_support/products/indexstoredb.py +++ b/utils/swift_build_support/swift_build_support/products/indexstoredb.py @@ -18,6 +18,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -73,6 +74,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/libicu.py b/utils/swift_build_support/swift_build_support/products/libicu.py new file mode 100644 index 0000000000000..4daefced485d7 --- /dev/null +++ b/utils/swift_build_support/swift_build_support/products/libicu.py @@ -0,0 +1,52 @@ +# swift_build_support/products/libicu.py ------------------------------------- +# +# This source file is part of the Swift.org open source project +# +# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See https://swift.org/LICENSE.txt for license information +# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +# +# ---------------------------------------------------------------------------- + +from . import cmark +from . import libcxx +from . import llvm +from . import product + + +class LibICU(product.Product): + @classmethod + def is_build_script_impl_product(cls): + """is_build_script_impl_product -> bool + + Whether this product is produced by build-script-impl. + """ + return True + + @classmethod + def is_before_build_script_impl_product(cls): + """is_before_build_script_impl_product -> bool + + Whether this product is built before any build-script-impl products. + """ + return False + + @classmethod + def product_source_name(cls): + """product_source_name() -> str + + The name of the source code directory of this product. + """ + return "icu" + + @classmethod + def is_nondarwin_only_build_product(cls): + return True + + @classmethod + def get_dependencies(cls): + return [cmark.CMark, + llvm.LLVM, + libcxx.LibCXX] diff --git a/utils/swift_build_support/swift_build_support/products/llbuild.py b/utils/swift_build_support/swift_build_support/products/llbuild.py index ca903e48314f1..adb5ddbab7d6c 100644 --- a/utils/swift_build_support/swift_build_support/products/llbuild.py +++ b/utils/swift_build_support/swift_build_support/products/llbuild.py @@ -14,6 +14,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llvm from . import product from . import swift @@ -42,6 +43,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/lldb.py b/utils/swift_build_support/swift_build_support/products/lldb.py index 6f9d76faf3f38..106f5b3b9a9ed 100644 --- a/utils/swift_build_support/swift_build_support/products/lldb.py +++ b/utils/swift_build_support/swift_build_support/products/lldb.py @@ -12,6 +12,7 @@ from . import cmark from . import libcxx +from . import libicu from . import llvm from . import product from . import swift @@ -39,4 +40,5 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift] diff --git a/utils/swift_build_support/swift_build_support/products/playgroundsupport.py b/utils/swift_build_support/swift_build_support/products/playgroundsupport.py index d0898edf6441d..90d7c16116fa3 100644 --- a/utils/swift_build_support/swift_build_support/products/playgroundsupport.py +++ b/utils/swift_build_support/swift_build_support/products/playgroundsupport.py @@ -17,6 +17,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import lldb from . import llvm @@ -130,6 +131,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, lldb.LLDB, libdispatch.LibDispatch, diff --git a/utils/swift_build_support/swift_build_support/products/skstresstester.py b/utils/swift_build_support/swift_build_support/products/skstresstester.py index b9b38ceca4e16..ea673f0bde5d2 100644 --- a/utils/swift_build_support/swift_build_support/products/skstresstester.py +++ b/utils/swift_build_support/swift_build_support/products/skstresstester.py @@ -19,6 +19,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -110,6 +111,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/sourcekitlsp.py b/utils/swift_build_support/swift_build_support/products/sourcekitlsp.py index 960b08bd14619..59ec79f4308ca 100644 --- a/utils/swift_build_support/swift_build_support/products/sourcekitlsp.py +++ b/utils/swift_build_support/swift_build_support/products/sourcekitlsp.py @@ -15,6 +15,7 @@ from . import indexstoredb from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -67,6 +68,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/swiftdocc.py b/utils/swift_build_support/swift_build_support/products/swiftdocc.py index dd62c149829b0..5e438591baa2c 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftdocc.py +++ b/utils/swift_build_support/swift_build_support/products/swiftdocc.py @@ -18,6 +18,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -105,6 +106,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/swiftdriver.py b/utils/swift_build_support/swift_build_support/products/swiftdriver.py index cb2435a5a297c..ff3e0f02506af 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftdriver.py +++ b/utils/swift_build_support/swift_build_support/products/swiftdriver.py @@ -16,6 +16,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -50,6 +51,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/swiftformat.py b/utils/swift_build_support/swift_build_support/products/swiftformat.py index a17441fb55615..92d33f42319f9 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftformat.py +++ b/utils/swift_build_support/swift_build_support/products/swiftformat.py @@ -18,6 +18,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -169,6 +170,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/swiftinspect.py b/utils/swift_build_support/swift_build_support/products/swiftinspect.py index 80e74cb1a374f..be00b0e4cc2c0 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftinspect.py +++ b/utils/swift_build_support/swift_build_support/products/swiftinspect.py @@ -17,6 +17,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -67,6 +68,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/swiftpm.py b/utils/swift_build_support/swift_build_support/products/swiftpm.py index e0fba6c8546ad..c9024e64bdaab 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftpm.py +++ b/utils/swift_build_support/swift_build_support/products/swiftpm.py @@ -16,6 +16,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -137,6 +138,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/swiftsyntax.py b/utils/swift_build_support/swift_build_support/products/swiftsyntax.py index 72254eb471769..0977632db12f6 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftsyntax.py +++ b/utils/swift_build_support/swift_build_support/products/swiftsyntax.py @@ -19,6 +19,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -149,6 +150,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/tsan_libdispatch.py b/utils/swift_build_support/swift_build_support/products/tsan_libdispatch.py index 3278a95e7e538..aea66fd89eb53 100644 --- a/utils/swift_build_support/swift_build_support/products/tsan_libdispatch.py +++ b/utils/swift_build_support/swift_build_support/products/tsan_libdispatch.py @@ -16,6 +16,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llbuild from . import llvm from . import product @@ -99,6 +100,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation, diff --git a/utils/swift_build_support/swift_build_support/products/xctest.py b/utils/swift_build_support/swift_build_support/products/xctest.py index 70964723b6dcf..97278cbeceee8 100644 --- a/utils/swift_build_support/swift_build_support/products/xctest.py +++ b/utils/swift_build_support/swift_build_support/products/xctest.py @@ -14,6 +14,7 @@ from . import foundation from . import libcxx from . import libdispatch +from . import libicu from . import llvm from . import product from . import swift @@ -45,6 +46,7 @@ def get_dependencies(cls): return [cmark.CMark, llvm.LLVM, libcxx.LibCXX, + libicu.LibICU, swift.Swift, libdispatch.LibDispatch, foundation.Foundation] diff --git a/utils/update_checkout/update-checkout-config.json b/utils/update_checkout/update-checkout-config.json index 2a2d9da126bbc..173feb7118544 100644 --- a/utils/update_checkout/update-checkout-config.json +++ b/utils/update_checkout/update-checkout-config.json @@ -101,6 +101,9 @@ "curl": { "remote": { "id": "curl/curl" } }, + "icu": { + "remote": { "id": "unicode-org/icu" } + }, "libxml2": { "remote": { "id": "gnome/libxml2" } }, @@ -158,6 +161,7 @@ "wasi-libc": "wasi-sdk-20", "wasmkit": "0.0.3", "curl": "curl-8_5_0", + "icu": "maint/maint-69", "libxml2": "v2.11.5", "zlib": "v1.3.1" }