Skip to content

Commit 9caeb35

Browse files
authored
Revert "Remove ICU from the toolchain (#75262)"
This reverts commit f3acbb0.
1 parent e2a0be8 commit 9caeb35

27 files changed

+328
-1
lines changed

docs/HowToGuides/GettingStarted.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ toolchain as a one-off, there are a couple of differences:
135135
- Before running `update-checkout`, double-check that `swift` is the only
136136
repository inside the `swift-project` directory. Otherwise,
137137
`update-checkout` may not clone the necessary dependencies.
138+
- Running `update-checkout` may fail if the `git-lfs` dependency is not
139+
installed. This may report as an error related to `icu`. A workaround is
140+
passing `--skip-repository icu` to `update-checkout`.
138141
139142
## Installing dependencies
140143

utils/build-presets.ini

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ llbuild
840840
swiftpm
841841
swift-driver
842842
xctest
843+
libicu
843844
swiftdocc
844845
swiftformat
845846

@@ -853,6 +854,7 @@ install-swiftpm
853854
install-swift-driver
854855
install-swiftsyntax
855856
install-xctest
857+
install-libicu
856858
install-prefix=/usr
857859
install-sourcekit-lsp
858860
install-swiftformat
@@ -949,6 +951,7 @@ skip-test-xctest
949951
skip-test-foundation
950952
skip-test-libdispatch
951953
skip-test-playgroundsupport
954+
skip-test-libicu
952955
skip-test-indexstore-db
953956
skip-test-sourcekit-lsp
954957
skip-test-swiftdocc
@@ -1176,6 +1179,7 @@ mixin-preset=
11761179
mixin_linux_install_components_with_clang
11771180
build-subdir=buildbot_incremental
11781181

1182+
libicu
11791183
llbuild
11801184
swiftpm
11811185
swift-driver
@@ -1190,6 +1194,7 @@ install-llvm
11901194
install-static-linux-config
11911195
install-swift
11921196
install-llbuild
1197+
install-libicu
11931198
install-swiftpm
11941199
install-swift-driver
11951200
install-swiftsyntax
@@ -1783,6 +1788,7 @@ skip-test-osx
17831788
llvm-cmake-options=-DCLANG_DEFAULT_LINKER=gold
17841789

17851790
foundation
1791+
libicu
17861792
libdispatch
17871793
test
17881794

@@ -1826,14 +1832,17 @@ mixin-preset=
18261832
mixin_linux_install_components_with_clang
18271833

18281834
libdispatch
1835+
libicu
18291836
foundation
18301837
xctest
18311838
libcxx=false
18321839

1840+
install-libicu
18331841
install-foundation
18341842
install-libdispatch
18351843
install-xctest
18361844

1845+
skip-test-libicu
18371846
skip-test-foundation
18381847
skip-test-libdispatch
18391848
skip-test-xctest
@@ -2104,6 +2113,7 @@ mixin-preset=buildbot_indexstoredb_linux,sanitize
21042113
mixin-preset=
21052114
mixin_linux_install_components_with_clang
21062115

2116+
libicu
21072117
llbuild
21082118
swiftpm
21092119
xctest
@@ -2119,6 +2129,7 @@ reconfigure
21192129

21202130
install-foundation
21212131
install-libdispatch
2132+
install-libicu
21222133
install-libcxx
21232134
install-llvm
21242135
install-static-linux-config
@@ -3045,6 +3056,7 @@ mixin-preset=
30453056
[preset: linux_lldb]
30463057
lldb
30473058
foundation
3059+
libicu
30483060
libdispatch
30493061
build-ninja
30503062

utils/build-script-impl

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ components=(
298298
foundation
299299
libcxx
300300
libdispatch
301+
libicu
301302
libxml2
302303
zlib
303304
curl
@@ -1248,13 +1249,15 @@ FOUNDATION_SWIFTFOUNDATION_SOURCE_DIR="${WORKSPACE}/swift-foundation"
12481249
FOUNDATION_SWIFTFOUNDATIONICU_SOURCE_DIR="${WORKSPACE}/swift-foundation-icu"
12491250
LIBDISPATCH_SOURCE_DIR="${WORKSPACE}/swift-corelibs-libdispatch"
12501251
LIBDISPATCH_STATIC_SOURCE_DIR="${WORKSPACE}/swift-corelibs-libdispatch"
1252+
LIBICU_SOURCE_DIR="${WORKSPACE}/icu"
12511253
LIBCXX_SOURCE_DIR="${WORKSPACE}/llvm-project/runtimes"
12521254
SWIFT_COLLECTIONS_SOURCE_DIR="${WORKSPACE}/swift-collections"
12531255
SWIFT_PATH_TO_STRING_PROCESSING_SOURCE="${WORKSPACE}/swift-experimental-string-processing"
12541256
SWIFTSYNTAX_SOURCE_DIR="${WORKSPACE}/swift-syntax"
12551257
SWIFT_SYNTAX_SOURCE_DIR="${WORKSPACE}/swift-syntax"
12561258

12571259
[[ "${SKIP_BUILD_LIBCXX}" ]] || PRODUCTS+=(libcxx)
1260+
[[ "${SKIP_BUILD_LIBICU}" ]] || PRODUCTS+=(libicu)
12581261
[[ "${SKIP_BUILD_SWIFT}" ]] || PRODUCTS+=(swift)
12591262
[[ "${SKIP_BUILD_LLDB}" ]] || PRODUCTS+=(lldb)
12601263
[[ "${SKIP_BUILD_LIBDISPATCH}" ]] || PRODUCTS+=(libdispatch)
@@ -1342,6 +1345,8 @@ function build_directory_bin() {
13421345
libdispatch|libdispatch_static)
13431346
echo "${root}/${LIBDISPATCH_BUILD_TYPE}/bin"
13441347
;;
1348+
libicu)
1349+
;;
13451350
*)
13461351
echo "error: unknown product: ${product}"
13471352
exit 1
@@ -1480,6 +1485,8 @@ function cmake_config_opt() {
14801485
libdispatch|libdispatch_static)
14811486
echo "--config ${LIBDISPATCH_BUILD_TYPE}"
14821487
;;
1488+
libicu)
1489+
;;
14831490
*)
14841491
echo "error: unknown product: ${product}"
14851492
exit 1
@@ -2413,6 +2420,29 @@ for host in "${ALL_HOSTS[@]}"; do
24132420
continue
24142421
fi
24152422

2423+
if [[ ! "${SKIP_BUILD_LIBICU}" ]] ; then
2424+
ICU_ROOT=$(build_directory ${host} libicu)/tmp_install
2425+
ICU_LIBDIR="$(build_directory ${host} swift)/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}"
2426+
LIBICU_BUILD_ARGS=(
2427+
-DICU_ROOT:PATH=${ICU_ROOT}
2428+
-DICU_INCLUDE_DIR:PATH=${ICU_ROOT}/include
2429+
-DICU_DATA_LIBRARIES:FILEPATH=${ICU_LIBDIR}/libicudataswift.so
2430+
-DICU_DATA_LIBRARY:FILEPATH=${ICU_LIBDIR}/libicudataswift.so
2431+
-DICU_DATA_LIBRARY_DEBUG:FILEPATH=${ICU_LIBDIR}/libicudataswift.so
2432+
-DICU_DATA_LIBRARY_RELEASE:FILEPATH=${ICU_LIBDIR}/libicudataswift.so
2433+
-DICU_UC_LIBRARIES:FILEPATH=${ICU_LIBDIR}/libicuucswift.so
2434+
-DICU_UC_LIBRARY:FILEPATH=${ICU_LIBDIR}/libicuucswift.so
2435+
-DICU_UC_LIBRARY_DEBUG:FILEPATH=${ICU_LIBDIR}/libicuucswift.so
2436+
-DICU_UC_LIBRARY_RELEASE:FILEPATH=${ICU_LIBDIR}/libicuucswift.so
2437+
-DICU_I18N_LIBRARIES:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so
2438+
-DICU_I18N_LIBRARY:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so
2439+
-DICU_I18N_LIBRARY_DEBUG:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so
2440+
-DICU_I18N_LIBRARY_RELEASE:FILEPATH=${ICU_LIBDIR}/libicui18nswift.so
2441+
)
2442+
else
2443+
LIBICU_BUILD_ARGS=()
2444+
fi
2445+
24162446
if [[ ! "${SKIP_BUILD_LIBXML2}" ]]; then
24172447
BASE_INSTALL_DIR="$(get_host_install_destdir ${host})"
24182448
LIBXML2_HEADERS="${BASE_INSTALL_DIR}/usr/include/libxml2"
@@ -2476,6 +2506,12 @@ for host in "${ALL_HOSTS[@]}"; do
24762506
call rm -rf "${build_dir}"
24772507
fi
24782508

2509+
# Set the PKG_CONFIG_PATH so that core-foundation can find the libraries and
2510+
# header files
2511+
LIBICU_BUILD_DIR="$(build_directory ${host} libicu)"
2512+
export PKG_CONFIG_PATH="${LIBICU_BUILD_DIR}/config:${PKG_CONFIG_PATH}"
2513+
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":"${LIBICU_BUILD_DIR}/lib"
2514+
24792515
cmake_options=(
24802516
${cmake_options[@]}
24812517
-DCMAKE_BUILD_TYPE:STRING=${FOUNDATION_BUILD_TYPE}
@@ -2486,6 +2522,8 @@ for host in "${ALL_HOSTS[@]}"; do
24862522
-DCMAKE_Swift_FLAGS:STRING="$(common_swift_flags)"
24872523
-DCMAKE_INSTALL_PREFIX:PATH=$(get_host_install_prefix ${host})
24882524

2525+
${LIBICU_BUILD_ARGS[@]}
2526+
24892527
${LIBXML2_BUILD_ARGS[@]}
24902528

24912529
${ZLIB_BUILD_ARGS[@]}
@@ -2513,7 +2551,7 @@ for host in "${ALL_HOSTS[@]}"; do
25132551
if [[ $(is_cross_tools_host ${host}) ]] ; then
25142552
cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}")
25152553

2516-
# Foundation looks for the libXML2 and libcurl libraries
2554+
# Foundation looks for the ICU, libXML2 and libcurl libraries
25172555
# using find_package(), so search for them in
25182556
# CROSS_COMPILE_DEPS_PATH using the CMake process for doing
25192557
# so, see the linked CMake docs for more info:
@@ -2573,6 +2611,62 @@ for host in "${ALL_HOSTS[@]}"; do
25732611
;;
25742612
esac
25752613

2614+
;;
2615+
libicu)
2616+
SWIFT_BUILD_PATH=$(build_directory ${host} swift)
2617+
LIBICU_BUILD_DIR=$(build_directory ${host} ${product})
2618+
ICU_TMPINSTALL=$LIBICU_BUILD_DIR/tmp_install
2619+
ICU_TMPLIBDIR="${SWIFT_BUILD_PATH}/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}"
2620+
if [[ "${RECONFIGURE}" || ! -f "${LIBICU_BUILD_DIR}"/config.status ]]; then
2621+
echo "Reconfiguring libicu"
2622+
if [[ "$LIBICU_BUILD_TYPE" != "Release" ]] ; then
2623+
libicu_enable_debug="--enable-debug"
2624+
else
2625+
libicu_enable_debug=""
2626+
fi
2627+
call mkdir -p "${LIBICU_BUILD_DIR}"
2628+
2629+
if [ $(true_false "${BUILD_SWIFT_STATIC_STDLIB}") == "TRUE" ]; then
2630+
libicu_enable_static="--enable-static"
2631+
else
2632+
libicu_enable_static=""
2633+
fi
2634+
2635+
with_pushd "${LIBICU_BUILD_DIR}" \
2636+
call env CXXFLAGS=-fPIC LDFLAGS='-Wl,-rpath=\$$ORIGIN' \
2637+
"${LIBICU_SOURCE_DIR}"/icu4c/source/runConfigureICU Linux \
2638+
${icu_build_variant_arg} --prefix=${ICU_TMPINSTALL} \
2639+
${libicu_enable_debug} \
2640+
--enable-renaming --with-library-suffix=swift \
2641+
--libdir=${ICU_TMPLIBDIR} \
2642+
--enable-shared --enable-static \
2643+
--enable-strict --disable-icuio \
2644+
--disable-plugins --disable-dyload --disable-extras \
2645+
--disable-samples --disable-layoutex --with-data-packaging=auto
2646+
else
2647+
echo "Skipping reconfiguration of libicu"
2648+
fi
2649+
with_pushd "${LIBICU_BUILD_DIR}" \
2650+
call make -j ${BUILD_JOBS} install
2651+
ICU_LIBDIR="$(build_directory ${host} swift)/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}"
2652+
ICU_LIBDIR_STATIC="$(build_directory ${host} swift)/lib/swift_static/${SWIFT_HOST_VARIANT}"
2653+
ICU_LIBDIR_STATIC_ARCH="$(build_directory ${host} swift)/lib/swift_static/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}"
2654+
# Add in the ICU renaming config into uconfig.h
2655+
call sed -e "/^#define __UCONFIG_H__/ r ${LIBICU_BUILD_DIR}/uconfig.h.prepend" -i ${ICU_TMPINSTALL}/include/unicode/uconfig.h
2656+
2657+
if [ $(true_false "${BUILD_SWIFT_STATIC_STDLIB}") == "TRUE" ]; then
2658+
# Copy the static libs into the swift_static directory
2659+
call mkdir -p "${ICU_LIBDIR_STATIC_ARCH}"
2660+
for l in uc i18n data
2661+
do
2662+
lib="${ICU_LIBDIR}/libicu${l}swift.a"
2663+
call cp "${lib}" "${ICU_LIBDIR_STATIC}"
2664+
call cp "${lib}" "${ICU_LIBDIR_STATIC_ARCH}"
2665+
done
2666+
fi
2667+
2668+
# libicu builds itself and doesn't use cmake
2669+
continue
25762670
;;
25772671
*)
25782672
echo "error: unknown product: ${product}"
@@ -2853,6 +2947,17 @@ for host in "${ALL_HOSTS[@]}"; do
28532947
# libdispatch_static
28542948
continue
28552949
;;
2950+
libicu)
2951+
if [[ "${SKIP_TEST_LIBICU}" ]]; then
2952+
continue
2953+
fi
2954+
LIBICU_BUILD_DIR=$(build_directory ${host} ${product})
2955+
echo "--- Running tests for ${product} ---"
2956+
with_pushd "${LIBICU_BUILD_DIR}/test" \
2957+
call make -j ${BUILD_JOBS}
2958+
echo "--- Finished tests for ${product} ---"
2959+
continue
2960+
;;
28562961
*)
28572962
echo "error: unknown product: ${product}"
28582963
exit 1
@@ -3031,6 +3136,42 @@ for host in "${ALL_HOSTS[@]}"; do
30313136
;;
30323137
esac
30333138
;;
3139+
libicu)
3140+
if [[ -z "${INSTALL_LIBICU}" ]]; then
3141+
continue
3142+
fi
3143+
echo "--- Installing ${product} ---"
3144+
ICU_BUILD_DIR=$(build_directory ${host} ${product})
3145+
ICU_INSTALL_DIR="$(get_host_install_destdir ${host})$(get_host_install_prefix ${host})"
3146+
ICU_LIBDIR="$(build_directory ${host} swift)/lib/swift/${SWIFT_HOST_VARIANT}/${SWIFT_HOST_VARIANT_ARCH}"
3147+
LIBICU_DEST_DIR="${ICU_INSTALL_DIR}lib/swift/${SWIFT_HOST_VARIANT}"
3148+
call mkdir -p ${LIBICU_DEST_DIR}
3149+
3150+
for l in uc i18n data
3151+
do
3152+
lib=${ICU_LIBDIR}/libicu${l}swift
3153+
echo "${lib} => ${LIBICU_DEST_DIR}"
3154+
call cp -d ${lib}.so ${lib}.so.* ${LIBICU_DEST_DIR}
3155+
done
3156+
3157+
if [ $(true_false "${BUILD_SWIFT_STATIC_STDLIB}") == "TRUE" ]; then
3158+
LIBICU_DEST_DIR_STATIC="${ICU_INSTALL_DIR}lib/swift_static/${SWIFT_HOST_VARIANT}"
3159+
call mkdir -p ${LIBICU_DEST_DIR_STATIC}
3160+
for l in uc i18n data
3161+
do
3162+
lib=${ICU_LIBDIR}/libicu${l}swift
3163+
echo "${lib} => ${LIBICU_DEST_DIR_STATIC}"
3164+
call cp -d ${lib}.a ${LIBICU_DEST_DIR_STATIC}
3165+
done
3166+
fi
3167+
3168+
ICU_TMP_INSTALL_DIR="${ICU_BUILD_DIR}/tmp_install"
3169+
call mkdir -p "${ICU_INSTALL_DIR}include"
3170+
call cp -a "${ICU_TMP_INSTALL_DIR}/include/unicode" "${ICU_INSTALL_DIR}include"
3171+
call mkdir -p "${ICU_INSTALL_DIR}share/icuswift"
3172+
call cp -a "${ICU_TMP_INSTALL_DIR}/share/icuswift" "${ICU_INSTALL_DIR}share"
3173+
continue
3174+
;;
30343175
*)
30353176
echo "error: unknown product: ${product}"
30363177
exit 1

0 commit comments

Comments
 (0)