[llvm] [Support] Add option to use Windows vendored ICU (PR #186371)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 13 18:17:30 PDT 2026
https://github.com/paperchalice updated https://github.com/llvm/llvm-project/pull/186371
>From 373f2e2b36e93ef3b52058cd6314efaedb8f66ed Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Fri, 13 Mar 2026 19:02:47 +0800
Subject: [PATCH] [Support] Add option to use Windows vendored ICU
---
llvm/CMakeLists.txt | 9 +++++++++
llvm/cmake/config-ix.cmake | 21 +++++++++++++++------
llvm/include/llvm/Config/config.h.cmake | 3 +++
llvm/lib/Support/CMakeLists.txt | 18 ++++++++++++++----
llvm/lib/Support/TextEncoding.cpp | 4 ++++
5 files changed, 45 insertions(+), 10 deletions(-)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 420774b629b8b..23c4601bdeea4 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -614,6 +614,15 @@ option(LLVM_ENABLE_THREADS "Use threads if available." ON)
set(LLVM_ENABLE_ICU "OFF" CACHE STRING "Use ICU for text encoding conversion support if available. Can be ON, OFF, or FORCE_ON")
+# After Windows 10 1903, icu.lib is available.
+if(WIN32 AND CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL "10.0.18362")
+ cmake_dependent_option(LLVM_ENABLE_WINDOWS_ICU "Use Windows vendored ICU if possible" OFF LLVM_ENABLE_ICU OFF)
+
+ # test
+ set(LLVM_ENABLE_ICU ON)
+ set(LLVM_ENABLE_WINDOWS_ICU ON)
+endif()
+
set(LLVM_ENABLE_ICONV "OFF" CACHE STRING "Use iconv for text encoding conversion support if available. Can be ON, OFF, or FORCE_ON")
set(LLVM_ENABLE_ZLIB "ON" CACHE STRING "Use zlib for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
diff --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake
index a12eaf76d15df..7a5631b1ae3b5 100644
--- a/llvm/cmake/config-ix.cmake
+++ b/llvm/cmake/config-ix.cmake
@@ -313,15 +313,24 @@ endif()
if(LLVM_ENABLE_ICU AND NOT(LLVM_ENABLE_ICONV STREQUAL FORCE_ON))
set(LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_SHARED_LIBRARY_SUFFIX}")
- if (LLVM_ENABLE_ICU STREQUAL FORCE_ON)
- find_package(ICU REQUIRED COMPONENTS uc i18n)
- if (NOT ICU_FOUND)
- message(FATAL_ERROR "Failed to configure ICU, but LLVM_ENABLE_ICU is FORCE_ON")
+ set(HAVE_WINDOWS_ICU OFF)
+ if(LLVM_ENABLE_WINDOWS_ICU AND WIN32 AND CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL "10.0.18362")
+ message(STATUS "Use Windows vendored ICU")
+ set(HAVE_WINDOWS_ICU ON)
+ endif()
+ if(NOT HAVE_WINDOWS_ICU)
+ if (LLVM_ENABLE_ICU STREQUAL FORCE_ON)
+ find_package(ICU REQUIRED COMPONENTS uc i18n)
+ if (NOT ICU_FOUND)
+ message(FATAL_ERROR "Failed to configure ICU, but LLVM_ENABLE_ICU is FORCE_ON")
+ endif()
+ else()
+ find_package(ICU COMPONENTS uc i18n)
endif()
+ set(HAVE_ICU ${ICU_FOUND})
else()
- find_package(ICU COMPONENTS uc i18n)
+ set(HAVE_ICU ON)
endif()
- set(HAVE_ICU ${ICU_FOUND})
set(CMAKE_FIND_LIBRARY_SUFFIXES ${LIBRARY_SUFFIXES})
endif()
diff --git a/llvm/include/llvm/Config/config.h.cmake b/llvm/include/llvm/Config/config.h.cmake
index ce83de8e4cba9..94fde52de11b3 100644
--- a/llvm/include/llvm/Config/config.h.cmake
+++ b/llvm/include/llvm/Config/config.h.cmake
@@ -242,6 +242,9 @@
/* Define if ICU library is available */
#cmakedefine01 HAVE_ICU
+/* Define if Windows vendored ICU is available */
+#cmakedefine01 HAVE_WINDOWS_ICU
+
/* Define if iconv library is available */
#cmakedefine01 HAVE_ICONV
diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
index 380be042df69d..392502b0d6dd0 100644
--- a/llvm/lib/Support/CMakeLists.txt
+++ b/llvm/lib/Support/CMakeLists.txt
@@ -42,6 +42,9 @@ if( WIN32 )
# advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
# ntdll required for RtlGetLastNtStatus in lib/Support/ErrorHandling.cpp.
set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32 ws2_32 ntdll)
+ if( HAVE_WINDOWS_ICU )
+ list(APPEND system_libs icu)
+ endif()
elseif( CMAKE_HOST_UNIX )
if( HAVE_LIBRT )
set(system_libs ${system_libs} rt)
@@ -334,10 +337,17 @@ add_llvm_component_library(LLVMSupport
# Link ICU library if it is an external library.
if(ICU_FOUND)
- target_link_libraries(LLVMSupport
- PRIVATE
- ${ICU_LIBRARIES}
- )
+ if(HAVE_WINDOWS_ICU)
+ target_link_libraries(LLVMSupport
+ PRIVATE
+ icu
+ )
+ else()
+ target_link_libraries(LLVMSupport
+ PRIVATE
+ ${ICU_LIBRARIES}
+ )
+ endif()
endif()
set(llvm_system_libs ${system_libs})
diff --git a/llvm/lib/Support/TextEncoding.cpp b/llvm/lib/Support/TextEncoding.cpp
index 453af6f7287bc..d36f02c1300b9 100644
--- a/llvm/lib/Support/TextEncoding.cpp
+++ b/llvm/lib/Support/TextEncoding.cpp
@@ -20,7 +20,11 @@
#include <system_error>
#if HAVE_ICU
+#if HAVE_WINDOWS_ICU
+#include <icu.h>
+#else
#include <unicode/ucnv.h>
+#endif
#elif HAVE_ICONV
#include <iconv.h>
#endif
More information about the llvm-commits
mailing list