Skip to content

Commit 4d2593f

Browse files
committed
build: support having more than one ICU in use
This allows us to cross-compile the standard library to foreign targets on a single host. The ICU dependencies can be specified on the command line on a per-target basis. If one is not specified, we fall back to the default search path and use that for the other targets. Special thanks to Dimitri Gribenko for the various hints in getting this wired up.
1 parent ea3914d commit 4d2593f

File tree

4 files changed

+41
-19
lines changed

4 files changed

+41
-19
lines changed

CMakeLists.txt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,20 @@ set(SWIFT_ANDROID_NDK_GCC_VERSION "" CACHE STRING
154154
"The GCC version to use when building for Android. Currently only 4.9 is supported.")
155155
set(SWIFT_ANDROID_SDK_PATH "" CACHE STRING
156156
"Path to the directory that contains the Android SDK tools that will be passed to the swiftc frontend")
157-
set(SWIFT_ANDROID_ICU_UC "" CACHE STRING
158-
"Path to a directory containing libicuuc.so")
159-
set(SWIFT_ANDROID_ICU_UC_INCLUDE "" CACHE STRING
160-
"Path to a directory containing headers for libicuuc")
161-
set(SWIFT_ANDROID_ICU_I18N "" CACHE STRING
162-
"Path to a directory containing libicui18n.so")
163-
set(SWIFT_ANDROID_ICU_I18N_INCLUDE "" CACHE STRING
164-
"Path to a directory containing headers libicui18n")
165157
set(SWIFT_ANDROID_DEPLOY_DEVICE_PATH "" CACHE STRING
166158
"Path on an Android device where build products will be pushed. These are used when running the test suite against the device")
167159

160+
foreach(sdk ANDROID;FREEBSD;LINUX)
161+
set(SWIFT_${sdk}_ICU_UC "" CACHE STRING
162+
"Path to a directory containing the icuuc library for ${sdk}")
163+
set(SWIFT_${sdk}_ICU_UC_INCLUDE "" CACHE STRING
164+
"Path to a directory containing headers for icuuc for ${sdk}")
165+
set(SWIFT_${sdk}_ICU_I18N "" CACHE STRING
166+
"Path to a directory containing the icui18n library for ${sdk}")
167+
set(SWIFT_${sdk}_ICU_I18N_INCLUDE "" CACHE STRING
168+
"Path to a directory containing headers icui18n for ${sdk}")
169+
endforeach()
170+
168171
#
169172
# User-configurable Darwin-specific options.
170173
#

cmake/modules/AddSwift.cmake

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,18 @@ function(_add_variant_link_flags)
291291
list(APPEND result
292292
"-ldl"
293293
"-L${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/${SWIFT_ANDROID_NDK_GCC_VERSION}.x"
294-
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so"
295-
"-L${SWIFT_ANDROID_ICU_UC}" "-L${SWIFT_ANDROID_ICU_I18N}")
294+
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so")
296295
else()
297296
list(APPEND result "-lobjc")
298297
endif()
299298

299+
if(NOT "${SWIFT_${LFLAGS_SDK}_ICU_UC}" STREQUAL "")
300+
list(APPEND result "-L${SWIFT_${sdk}_ICU_UC}")
301+
endif()
302+
if(NOT "${SWIFT_${LFLAGS_SDK}_ICU_I18N}" STREQUAL "")
303+
list(APPEND result "-L${SWIFT_${sdk}_ICU_I18N}")
304+
endif()
305+
300306
set("${LFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE)
301307
endfunction()
302308

@@ -513,7 +519,7 @@ function(_add_swift_library_single target name)
513519
message(FATAL_ERROR
514520
"Either SHARED, STATIC, or OBJECT_LIBRARY must be specified")
515521
endif()
516-
522+
517523
# Determine the subdirectory where this library will be installed.
518524
set(SWIFTLIB_SINGLE_SUBDIR
519525
"${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}/${SWIFTLIB_SINGLE_ARCHITECTURE}")
@@ -651,6 +657,17 @@ function(_add_swift_library_single target name)
651657
${SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES}
652658
${SWIFT_SECTIONS_OBJECT_END})
653659

660+
if(SWIFTLIB_SINGLE_TARGET_LIBRARY)
661+
if(NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_ICU_UC_INCLUDE}" STREQUAL "")
662+
set_property(TARGET "${target}" APPEND_STRING
663+
PROPERTY INCLUDE_DIRECTORIES "${SWIFT_${SWIFTLIB_SINGLE_SDK}_ICU_UC_INCLUDE}")
664+
endif()
665+
if(NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_ICU_I18N_INCLUDE}" STREQUAL "")
666+
set_property(TARGET "${target}" APPEND_STRING
667+
PROPERTY INCLUDE_DIRECTORIES "${SWIFT_${SWIFTLIB_SINGLE_SDK}_ICU_I18N_INCLUDE}")
668+
endif()
669+
endif()
670+
654671
# The section metadata objects are generated sources, and we need to tell CMake
655672
# not to expect to find them prior to their generation.
656673
if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX" OR

cmake/modules/FindICU.cmake

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@ foreach(MODULE ${ICU_FIND_COMPONENTS})
2525
endif()
2626
endforeach()
2727

28-
if(NOT "${SWIFT_ANDROID_ICU_UC_INCLUDE}" STREQUAL "")
29-
set(ICU_UC_INCLUDE_DIR "${SWIFT_ANDROID_ICU_UC_INCLUDE}")
30-
endif()
31-
if(NOT "${SWIFT_ANDROID_ICU_I18N_INCLUDE}" STREQUAL "")
32-
set(ICU_I18N_INCLUDE_DIR "${SWIFT_ANDROID_ICU_I18N_INCLUDE}")
33-
endif()
28+
foreach(sdk ANDROID;FREEBSD;LINUX)
29+
foreach(MODULE ${ICU_FIND_COMPONENTS})
30+
if("${SWIFT_${sdk}_ICU_${MODULE}_INCLUDE}" STREQUAL "")
31+
set(SWIFT_${sdk}_ICU_${MODULE}_INCLUDE ${ICU_${MODULE}_INCLUDE_DIRS})
32+
endif()
33+
if("${SWIFT_${sdk}_ICU_${MODULE}}" STREQUAL "")
34+
set(SWIFT_${sdk}_ICU_${MODULE} ${ICU_${MODULE}_LIBRARY})
35+
endif()
36+
endforeach()
37+
endforeach()
3438

3539
find_package_handle_standard_args(ICU DEFAULT_MSG ${ICU_REQUIRED})
3640
mark_as_advanced(${ICU_REQUIRED})

stdlib/public/stubs/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ else()
1212
find_package(ICU REQUIRED COMPONENTS uc i18n)
1313
set(swift_stubs_unicode_normalization_sources
1414
UnicodeNormalization.cpp)
15-
include_directories(
16-
${ICU_UC_INCLUDE_DIR} ${ICU_I18N_INCLUDE_DIR})
1715
endif()
1816

1917
add_swift_library(swiftStdlibStubs OBJECT_LIBRARY TARGET_LIBRARY

0 commit comments

Comments
 (0)