From 0fc8978b8f056647a88f7b18de8840fead97d16e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 25 Apr 2023 20:46:56 +0200 Subject: [PATCH] [mono][NativeAOT] System.Globalization.Native build improvements (#82393) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fixes #82389 - Fixes build of System.Globalization.Native for iOS-like, browser, and wasi platforms - Removes ICU shim from static builds of Mono runtime and builds it as part of libs.native subset - Switches browser/wasi to use the static libraries Co-authored-by: Alexander Köplinger --- eng/liveBuilds.targets | 1 + .../Microsoft.NETCore.Native.Unix.targets | 3 +-- src/coreclr/runtime.proj | 9 +++++++ .../Microsoft.NETCore.App/Directory.Build.props | 1 + src/libraries/native-binplace.proj | 1 + src/mono/mono.proj | 12 --------- src/mono/mono/mini/CMakeLists.txt | 17 ++++++++++-- src/mono/wasi/runtime/CMakeLists.txt | 1 + src/mono/wasm/runtime/CMakeLists.txt | 1 + src/native/libs/CMakeLists.txt | 2 +- src/native/libs/Common/pal_atomic.h | 4 +-- .../System.Globalization.Native/CMakeLists.txt | 30 +++++++++++++++------- .../libs/System.Globalization.Native/config.h.in | 3 ++- .../System.Globalization.Native/configure.cmake | 3 ++- .../System.Globalization.Native/pal_calendarData.c | 2 +- .../libs/System.Globalization.Native/pal_icushim.c | 1 + .../pal_icushim_internal.h | 2 +- .../pal_icushim_static.c | 6 +++-- src/native/libs/build-native.cmd | 11 ++++++++ src/native/libs/build-native.proj | 23 +++++++++++++++++ src/native/libs/build-native.sh | 18 ++++++++++++- 21 files changed, 116 insertions(+), 35 deletions(-) diff --git a/eng/liveBuilds.targets b/eng/liveBuilds.targets index ba99b07..5f7dcb8 100644 --- a/eng/liveBuilds.targets +++ b/eng/liveBuilds.targets @@ -177,6 +177,7 @@ - - + diff --git a/src/coreclr/runtime.proj b/src/coreclr/runtime.proj index 7f8edcc..8d5410c 100644 --- a/src/coreclr/runtime.proj +++ b/src/coreclr/runtime.proj @@ -2,12 +2,17 @@ ClrFullNativeBuild;ClrRuntimeSubset;ClrJitSubset;ClrPalTestsSubset;ClrAllJitsSubset;ClrILToolsSubset;ClrNativeAotSubset;ClrSpmiSubset;ClrCrossComponentsSubset;HostArchitecture;PgoInstrument;NativeOptimizationDataSupported;CMakeArgs + <_IcuDir Condition="'$(PkgMicrosoft_NETCore_Runtime_ICU_Transport)' != ''">$(PkgMicrosoft_NETCore_Runtime_ICU_Transport)/runtimes/$(TargetOS)-$(TargetArchitecture)$(_RuntimeVariant)/native + + + + + + <_CoreClrBuildArg Include="-cmakeargs -DCMAKE_ICU_DIR="$(_IcuDir)"" /> + + <_CoreClrBuildScript Condition="$([MSBuild]::IsOsPlatform(Windows))">build-runtime.cmd <_CoreClrBuildScript Condition="!$([MSBuild]::IsOsPlatform(Windows))">build-runtime.sh diff --git a/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props b/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props index b60635b..bac17f2 100644 --- a/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props +++ b/src/installer/pkg/sfx/Microsoft.NETCore.App/Directory.Build.props @@ -77,6 +77,7 @@ + diff --git a/src/libraries/native-binplace.proj b/src/libraries/native-binplace.proj index 867fadd3..b6d10ef 100644 --- a/src/libraries/native-binplace.proj +++ b/src/libraries/native-binplace.proj @@ -24,6 +24,7 @@ + diff --git a/src/mono/mono.proj b/src/mono/mono.proj index 310ee34..802958d 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -916,7 +916,6 @@ <_MonoRuntimeFilePath>$(MonoObjDir)out\lib\$(MonoFileName) <_MonoRuntimeStaticFilePath Condition="'$(TargetsMacCatalyst)' == 'true' or '$(TargetsiOS)' == 'true' or '$(TargetstvOS)' == 'true' or '$(TargetsAndroid)' == 'true' or '$(TargetsLinuxBionic)' == 'true'">$(MonoObjDir)out\lib\$(MonoStaticLibFileName) <_MonoIncludeInterpStaticFiles Condition="'$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true'">true - <_MonoIncludeIcuFiles Condition="'$(TargetsiOS)' == 'true' or '$(TargetstvOS)' == 'true' or '$(TargetsMacCatalyst)' == 'true'">true <_MonoAotCrossFilePath>$(MonoObjCrossDir)out\bin\$(MonoAotCrossFileName) @@ -1039,19 +1038,8 @@ <_MonoICorDebugArtifacts Condition="'$(MonoMsCorDbi)' == 'true'" Include="$(MonoObjDir)out\lib\$(LibPrefix)mscordbi$(LibSuffix)"> $(RuntimeBinDir)$(LibPrefix)mscordbi$(LibSuffix) - - <_IcuArtifacts Condition="'$(_MonoIncludeIcuFiles)' == 'true'" - Include="$(_IcuLibdir)\libicuuc.a; - $(_IcuLibdir)\libicui18n.a; - $(_IcuLibdir)\libicudata.a; - $(_IcuLibdir)\*.dat" /> - - ) target_compile_definitions(${frameworkconfig} PRIVATE -DMONO_DLL_EXPORT) target_link_libraries(${frameworkconfig} PRIVATE monoapi eglib_objects utils_objects sgen_objects metadata_objects) + if(HAVE_ICU_SHIM) + target_link_libraries(${frameworkconfig} PRIVATE icu_shim_objects) + endif() target_link_libraries(${frameworkconfig} PRIVATE ${OS_LIBS} ${LLVM_LIBS} ${ICU_LIBS} ${Z_LIBS}) if(ICU_LDFLAGS) @@ -538,7 +547,11 @@ if(NOT DISABLE_EXECUTABLES) if(MONO_CROSS_COMPILE_EXECUTABLE_NAME) set_target_properties(mono-sgen PROPERTIES OUTPUT_NAME mono-aot-cross) endif() - target_link_libraries(mono-sgen PRIVATE monoapi eglib_api monosgen-static ${OS_LIBS} ${LLVM_LIBS} ${ICU_LIBS} ${Z_LIBS}) + target_link_libraries(mono-sgen PRIVATE monoapi eglib_api monosgen-static) + if(HAVE_ICU_SHIM) + target_link_libraries(mono-sgen PRIVATE icu_shim_objects) + endif() + target_link_libraries(mono-sgen PRIVATE ${OS_LIBS} ${LLVM_LIBS} ${ICU_LIBS} ${Z_LIBS}) # Alpine Linux implements ucontext in a different library if(CLR_CMAKE_HOST_ALPINE_LINUX AND TARGET_S390X) target_link_libraries(mono-sgen PRIVATE ucontext) diff --git a/src/mono/wasi/runtime/CMakeLists.txt b/src/mono/wasi/runtime/CMakeLists.txt index 8f1bc66..2ae7cb2 100644 --- a/src/mono/wasi/runtime/CMakeLists.txt +++ b/src/mono/wasi/runtime/CMakeLists.txt @@ -29,6 +29,7 @@ target_link_libraries(dotnet ${MONO_ARTIFACTS_DIR}/libmono-icall-table.a ${NATIVE_BIN_DIR}/wasm-bundled-timezones.a ${NATIVE_BIN_DIR}/libSystem.Native.a + ${NATIVE_BIN_DIR}/libSystem.Globalization.Native.a ${NATIVE_BIN_DIR}/libSystem.IO.Compression.Native.a ) diff --git a/src/mono/wasm/runtime/CMakeLists.txt b/src/mono/wasm/runtime/CMakeLists.txt index 4fcf868..81b17cf 100644 --- a/src/mono/wasm/runtime/CMakeLists.txt +++ b/src/mono/wasm/runtime/CMakeLists.txt @@ -30,6 +30,7 @@ target_link_libraries(dotnet ${MONO_ARTIFACTS_DIR}/libmono-profiler-browser.a ${NATIVE_BIN_DIR}/wasm-bundled-timezones.a ${NATIVE_BIN_DIR}/libSystem.Native.a + ${NATIVE_BIN_DIR}/libSystem.Globalization.Native.a ${NATIVE_BIN_DIR}/libSystem.IO.Compression.Native.a) set_target_properties(dotnet PROPERTIES diff --git a/src/native/libs/CMakeLists.txt b/src/native/libs/CMakeLists.txt index 12ba766..8a81b64 100644 --- a/src/native/libs/CMakeLists.txt +++ b/src/native/libs/CMakeLists.txt @@ -163,6 +163,7 @@ if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) endif () add_subdirectory(System.Native) + add_subdirectory(System.Globalization.Native) if (CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) # skip for now @@ -183,7 +184,6 @@ if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) elseif (FORCE_ANDROID_OPENSSL) add_subdirectory(System.Security.Cryptography.Native) else () - add_subdirectory(System.Globalization.Native) add_subdirectory(System.Net.Security.Native) add_subdirectory(System.Security.Cryptography.Native) endif () diff --git a/src/native/libs/Common/pal_atomic.h b/src/native/libs/Common/pal_atomic.h index 8cf75c6..90cb312 100644 --- a/src/native/libs/Common/pal_atomic.h +++ b/src/native/libs/Common/pal_atomic.h @@ -4,7 +4,7 @@ #pragma once -#if defined(TARGET_UNIX) +#if defined(TARGET_UNIX) || defined(TARGET_WASI) #include #elif defined(TARGET_WINDOWS) #include "windows.h" @@ -13,7 +13,7 @@ // The args passed in should match InterlockedCompareExchangePointer Windows API static int pal_atomic_cas_ptr(void* volatile* dest, void* exchange, void* comparand) { -#if defined(TARGET_UNIX) +#if defined(TARGET_UNIX) || defined(TARGET_WASI) return __atomic_compare_exchange_n(dest, &comparand, exchange, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); #elif defined(TARGET_WINDOWS) return InterlockedCompareExchangePointer(dest, exchange, comparand) == comparand; diff --git a/src/native/libs/System.Globalization.Native/CMakeLists.txt b/src/native/libs/System.Globalization.Native/CMakeLists.txt index 1614fa6..37191a7 100644 --- a/src/native/libs/System.Globalization.Native/CMakeLists.txt +++ b/src/native/libs/System.Globalization.Native/CMakeLists.txt @@ -1,6 +1,6 @@ project(System.Globalization.Native C) -if(CLR_CMAKE_TARGET_UNIX) +if(CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_WASI) add_compile_options(-Wno-switch-enum) add_compile_options(-Wno-covered-switch-default) @@ -8,13 +8,14 @@ if(CLR_CMAKE_TARGET_UNIX) add_compile_options(-Wno-reserved-id-macro) add_compile_options(-Wno-documentation) add_compile_options(-Wno-documentation-unknown-command) + add_compile_options(-Wno-reserved-identifier) # Workaround for https://unicode-org.atlassian.net/browse/ICU-20601 add_compile_options(-Wno-extra-semi-stmt) add_compile_options(-Wno-unknown-warning-option) - if (NOT CLR_CMAKE_TARGET_ANDROID) - if (CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST) + if (NOT CLR_CMAKE_TARGET_ANDROID AND NOT DEFINED CMAKE_ICU_DIR) + if (CLR_CMAKE_TARGET_OSX) execute_process(COMMAND brew --prefix OUTPUT_VARIABLE brew_prefix OUTPUT_STRIP_TRAILING_WHITESPACE) set(ICU_HOMEBREW_INC_PATH "${brew_prefix}/opt/icu4c/include") endif() @@ -25,7 +26,7 @@ if(CLR_CMAKE_TARGET_UNIX) return() endif() - if(CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST) + if(CLR_CMAKE_TARGET_OSX) add_definitions(-DOSX_ICU_LIBRARY_PATH="/usr/lib/libicucore.dylib") add_definitions(-DU_DISABLE_RENAMING) else() @@ -59,6 +60,17 @@ set(NATIVEGLOBALIZATION_SOURCES pal_normalization.c ) +if (DEFINED CMAKE_ICU_DIR) + include_directories(${CMAKE_ICU_DIR}/include) + link_libraries(${CMAKE_ICU_DIR}/lib/libicuuc.a ${CMAKE_ICU_DIR}/lib/libicui18n.a ${CMAKE_ICU_DIR}/lib/libicudata.a) + link_libraries(stdc++) +endif() + +if (CMAKE_USE_PTHREADS) + add_compile_options(-pthread) + add_linker_flag(-pthread) +endif() + if (LOCAL_BUILD) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(NATIVEGLOBALIZATION_SOURCES ${NATIVEGLOBALIZATION_SOURCES} pal_icushim_static.c) @@ -69,6 +81,9 @@ if (LOCAL_BUILD) # For minipal files include_directories(../../) include_directories(${CMAKE_CURRENT_BINARY_DIR}) +elseif (CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) + add_definitions(-DSTATIC_ICU) + set(NATIVEGLOBALIZATION_SOURCES ${NATIVEGLOBALIZATION_SOURCES} pal_icushim_static.c) else() set(NATIVEGLOBALIZATION_SOURCES ${NATIVEGLOBALIZATION_SOURCES} pal_icushim.c) endif() @@ -82,10 +97,6 @@ if (NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI) set(NATIVEGLOBALIZATION_SOURCES ${NATIVEGLOBALIZATION_SOURCES} pal_timeZoneInfo.c) endif() -if (NOT GEN_SHARED_LIB AND NOT CLR_CMAKE_TARGET_MACCATALYST AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS AND NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI) - set(NATIVEGLOBALIZATION_SOURCES ${NATIVEGLOBALIZATION_SOURCES} entrypoints.c) -endif() - if (MSVC) set_source_files_properties(${NATIVEGLOBALIZATION_SOURCES} PROPERTIES LANGUAGE CXX) endif() @@ -116,9 +127,10 @@ endif() add_library(System.Globalization.Native-Static STATIC ${NATIVEGLOBALIZATION_SOURCES} + entrypoints.c ) -if(CLR_CMAKE_TARGET_UNIX) +if(CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_WASI) set_target_properties(System.Globalization.Native-Static PROPERTIES OUTPUT_NAME System.Globalization.Native CLEAN_DIRECT_OUTPUT 1) endif() diff --git a/src/native/libs/System.Globalization.Native/config.h.in b/src/native/libs/System.Globalization.Native/config.h.in index 8939990..933a3d0 100644 --- a/src/native/libs/System.Globalization.Native/config.h.in +++ b/src/native/libs/System.Globalization.Native/config.h.in @@ -1,4 +1,5 @@ #pragma once #cmakedefine01 HAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS -#cmakedefine01 HAVE_SET_MAX_VARIABLE \ No newline at end of file +#cmakedefine01 HAVE_SET_MAX_VARIABLE +#cmakedefine01 HAVE_UCOL_CLONE \ No newline at end of file diff --git a/src/native/libs/System.Globalization.Native/configure.cmake b/src/native/libs/System.Globalization.Native/configure.cmake index adf3f49..8163745 100644 --- a/src/native/libs/System.Globalization.Native/configure.cmake +++ b/src/native/libs/System.Globalization.Native/configure.cmake @@ -1,6 +1,7 @@ -if(CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST) +if(CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_APPLE OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) set(HAVE_SET_MAX_VARIABLE 1) set(HAVE_UDAT_STANDALONE_SHORTER_WEEKDAYS 1) + set(HAVE_UCOL_CLONE 0) else() include(CheckCSourceCompiles) include(CheckSymbolExists) diff --git a/src/native/libs/System.Globalization.Native/pal_calendarData.c b/src/native/libs/System.Globalization.Native/pal_calendarData.c index bc47e33..ba40702 100644 --- a/src/native/libs/System.Globalization.Native/pal_calendarData.c +++ b/src/native/libs/System.Globalization.Native/pal_calendarData.c @@ -9,7 +9,7 @@ #include "pal_errors_internal.h" #include "pal_calendarData.h" -#if defined(TARGET_UNIX) +#if defined(TARGET_UNIX) || defined(TARGET_WASI) #include #define STRING_COPY(destination, numberOfElements, source) \ diff --git a/src/native/libs/System.Globalization.Native/pal_icushim.c b/src/native/libs/System.Globalization.Native/pal_icushim.c index a938878..e8e6382 100644 --- a/src/native/libs/System.Globalization.Native/pal_icushim.c +++ b/src/native/libs/System.Globalization.Native/pal_icushim.c @@ -436,6 +436,7 @@ static void InitializeVariableMaxAndTopPointers(char* symbolVersion) #if defined(TARGET_OSX) || defined(TARGET_ANDROID) // OSX and Android always run against ICU version which has ucol_setMaxVariable. // We shouldn't come here. + (void)symbolVersion; assert(false); #elif defined(TARGET_WINDOWS) char symbolName[SYMBOL_NAME_SIZE]; diff --git a/src/native/libs/System.Globalization.Native/pal_icushim_internal.h b/src/native/libs/System.Globalization.Native/pal_icushim_internal.h index 77f7a82..9c98154 100644 --- a/src/native/libs/System.Globalization.Native/pal_icushim_internal.h +++ b/src/native/libs/System.Globalization.Native/pal_icushim_internal.h @@ -7,7 +7,7 @@ #pragma once -#if defined(TARGET_UNIX) +#if defined(TARGET_UNIX) || defined(TARGET_WASI) #include "config.h" diff --git a/src/native/libs/System.Globalization.Native/pal_icushim_static.c b/src/native/libs/System.Globalization.Native/pal_icushim_static.c index 34d49a0..6d2f5ce 100644 --- a/src/native/libs/System.Globalization.Native/pal_icushim_static.c +++ b/src/native/libs/System.Globalization.Native/pal_icushim_static.c @@ -38,12 +38,14 @@ static void log_icu_error(const char* name, UErrorCode status) log_shim_error("ICU call %s failed with error #%d '%s'.", name, status, statusText); } +#if defined(ICU_TRACING) static void U_CALLCONV icu_trace_data(const void* context, int32_t fnNumber, int32_t level, const char* fmt, va_list args) { char buf[1000]; utrace_vformat(buf, sizeof(buf), 0, fmt, args); printf("[ICUDT] %s: %s\n", utrace_functionName(fnNumber), buf); } +#endif static int32_t load_icu_data(const void* pData); @@ -127,7 +129,7 @@ cstdlib_load_icu_data(const char *path) goto error; } - file_buf = malloc(sizeof(char) * (file_buf_size + 1)); + file_buf = malloc(sizeof(char) * (unsigned long)(file_buf_size + 1)); if (file_buf == NULL) { @@ -141,7 +143,7 @@ cstdlib_load_icu_data(const char *path) goto error; } - fread(file_buf, sizeof(char), file_buf_size, fp); + fread(file_buf, sizeof(char), (unsigned long)file_buf_size, fp); if (ferror( fp ) != 0) { log_shim_error("Unable to read ICU dat file"); diff --git a/src/native/libs/build-native.cmd b/src/native/libs/build-native.cmd index af8a417..9f81985 100644 --- a/src/native/libs/build-native.cmd +++ b/src/native/libs/build-native.cmd @@ -18,6 +18,8 @@ set __BuildTarget="build" set __TargetOS=windows set CMAKE_BUILD_TYPE=Debug set __Ninja=1 +set __icuDir="" +set __usePThreads=0 :Arg_Loop :: Since the native build requires some configuration information before msbuild is called, we have to do some manual args parsing @@ -42,6 +44,9 @@ if /i [%1] == [rebuild] ( set __BuildTarget=rebuild&&shift&goto Arg_Loop) if /i [%1] == [msbuild] ( set __Ninja=0&&shift&goto Arg_Loop) +if /i [%1] == [icudir] ( set __icuDir=%2&&shift&&shift&goto Arg_Loop) +if /i [%1] == [usepthreads] ( set __usePThreads=1&&shift&goto Arg_Loop) + shift goto :Arg_Loop @@ -60,6 +65,12 @@ set __cmakeRepoRoot=%__repoRoot:\=/% set __ExtraCmakeParams="-DCMAKE_REPO_ROOT=%__cmakeRepoRoot%" set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE%" +if NOT %__icuDir% == "" ( + set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_ICU_DIR=%__icuDir%" +) +set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_USE_PTHREADS=%__usePThreads%" + + if [%__outConfig%] == [] set __outConfig=%__TargetOS%-%__BuildArch%-%CMAKE_BUILD_TYPE% if %__CMakeBinDir% == "" ( diff --git a/src/native/libs/build-native.proj b/src/native/libs/build-native.proj index c909e30..92fa2ee 100644 --- a/src/native/libs/build-native.proj +++ b/src/native/libs/build-native.proj @@ -9,12 +9,26 @@ <_BuildNativeOutConfig>$(NetCoreAppCurrent)-$(TargetOS)-$(Configuration)-$(TargetArchitecture) <_BuildNativeArgs>$(TargetArchitecture) $(Configuration) outconfig $(_BuildNativeOutConfig) -os $(_BuildNativeTargetOS) <_BuildNativeArgs Condition="'$(OfficialBuildId)' != ''">$(_BuildNativeArgs) /p:OfficialBuildId="$(OfficialBuildId)" + + <_RuntimeVariant /> + <_RuntimeVariant Condition="'$(MonoWasmBuildVariant)' == 'multithread' or '$(MonoWasmBuildVariant)' == 'perftrace'">-threads + <_UsePThreads /> + <_UsePThreads Condition="'$(MonoWasmBuildVariant)' == 'multithread' or '$(MonoWasmBuildVariant)' == 'perftrace'"> usepthreads + + <_IcuDir Condition="'$(PkgMicrosoft_NETCore_Runtime_ICU_Transport)' != ''">$(PkgMicrosoft_NETCore_Runtime_ICU_Transport)/runtimes/$(TargetOS)-$(TargetArchitecture)$(_RuntimeVariant)/native + <_IcuDirArg Condition="'$(_IcuDir)' != ''"> icudir "$(_IcuDir)" + + <_BuildNativeArgs>$(_BuildNativeArgs)$(_IcuDirArg)$(_UsePThreads) + + + + $(_BuildNativeArgs)$(_ProcessorCountArg)$(_PortableBuildArg)$(_CrossBuildArg)$(_BuildNativeCompilerArg)$(_KeepNativeSymbolsBuildArg)$(_CMakeArgs) $(Compiler) + + <_IcuArtifacts Condition="'$(_IcuDir)' != ''" + Include="$(_IcuDir)/lib/libicuuc.a; + $(_IcuDir)/lib/libicui18n.a; + $(_IcuDir)/lib/libicudata.a; + $(_IcuDir)/lib/*.dat" /> + + + diff --git a/src/native/libs/build-native.sh b/src/native/libs/build-native.sh index 934070b..3672276 100755 --- a/src/native/libs/build-native.sh +++ b/src/native/libs/build-native.sh @@ -16,6 +16,15 @@ handle_arguments() { __ShiftArgs=1 ;; + icudir|-icudir) + __icuDir="$2" + __ShiftArgs=1 + ;; + + usepthreads|-usepthreads) + __usePThreads=1 + ;; + staticliblink|-staticliblink) __StaticLibLink=1 ;; @@ -38,6 +47,8 @@ __SkipConfigure=0 __StaticLibLink=0 __UnprocessedBuildArgs= __VerboseBuild=false +__icuDir="" +__usePThreads=0 source "$__RepoRootDir"/eng/native/build-commons.sh @@ -65,7 +76,7 @@ elif [[ "$__TargetOS" == wasi ]]; then export WASI_SDK_PATH="${WASI_SDK_PATH%/}/" export CLR_CC="$WASI_SDK_PATH"bin/clang export TARGET_BUILD_ARCH=wasm - __CMakeArgs="-DCLR_CMAKE_TARGET_OS=wasi -DCLR_CMAKE_TARGET_ARCH=wasm -DWASI_SDK_PREFIX=$WASI_SDK_PATH -DCMAKE_TOOLCHAIN_FILE=$WASI_SDK_PATH/share/cmake/wasi-sdk.cmake" + __CMakeArgs="-DCLR_CMAKE_TARGET_OS=wasi -DCLR_CMAKE_TARGET_ARCH=wasm -DWASI_SDK_PREFIX=$WASI_SDK_PATH -DCMAKE_TOOLCHAIN_FILE=$WASI_SDK_PATH/share/cmake/wasi-sdk.cmake $__CMakeArgs" elif [[ "$__TargetOS" == ios || "$__TargetOS" == iossimulator ]]; then # nothing to do here true @@ -141,6 +152,11 @@ elif [[ "$__TargetOS" == tvos ]]; then fi fi +if [[ -n "$__icuDir" ]]; then + __CMakeArgs="-DCMAKE_ICU_DIR=\"$__icuDir\" $__CMakeArgs" +fi +__CMakeArgs="-DCMAKE_USE_PTHREADS=$__usePThreads $__CMakeArgs" + # Set the remaining variables based upon the determined build configuration __outConfig="${__outConfig:-"$__TargetOS-$__TargetArch-$__BuildType"}" __IntermediatesDir="$__RootBinDir/obj/native/$__outConfig" -- 2.7.4