DO NOT MERGE - Merge Android 13

Bug: 242648940
Merged-In: Ic6ea998d188c92d4a4806fbe2f3d9fa749011b1a
Change-Id: I8cc327ee112be90e6a19d6c1f385a0d6a0c68579
diff --git a/icu4c/source/common/CMakeLists.txt b/icu4c/source/common/CMakeLists.txt
new file mode 100644
index 0000000..8ff8bce
--- /dev/null
+++ b/icu4c/source/common/CMakeLists.txt
@@ -0,0 +1,52 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(icuuc C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+add_definitions("-DU_COMMON_IMPLEMENTATION")
+add_definitions("-D_REENTRANT")
+
+# To suppress deprecated declarations for 'uidna_toASCII_68'
+add_definitions("-Wno-deprecated-declarations")
+
+# Compile icuuc_stubdata
+set(ICUUC_STUB_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../stubdata")
+set(ICUUC_STUB_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/libicuuc_stubdata-target")
+add_subdirectory(${ICUUC_STUB_SOURCE_DIR} ${ICUUC_STUB_TARGET_BINARY_DIR})
+
+# Compile androidicuinit
+set(ANDROIDICUINIT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../libandroidicuinit")
+set(ANDROIDICUINIT_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/androidicu_init-target")
+add_subdirectory(${ANDROIDICUINIT_SOURCE_DIR} ${ANDROIDICUINIT_TARGET_BINARY_DIR})
+
+# Add android_icu4c headers
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../android_icu4c/include")
+
+# Glob icu common source files
+file(
+   GLOB_RECURSE
+   ICU_COMMON_CC_SOURCES
+   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+   "*.h" "*.cpp"
+)
+message(STATUS "ICU_COMMON_CC_SOURCES=${ICU_COMMON_CC_SOURCES}")
+
+add_library(
+   # name
+   icuuc
+
+   # SHARED or STATIC
+   STATIC
+
+   # Provides a relative path to your source file(s).
+   ${ICU_COMMON_CC_SOURCES}
+)
+target_include_directories(icuuc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icuuc PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+target_include_directories(icuuc PRIVATE "${ANDROIDICUINIT_SOURCE_DIR}/include")
+target_link_libraries(icuuc icuuc_stubdata androidicuinit)
+
+set_target_properties(icuuc PROPERTIES LINKER_LANGUAGE CXX)
+
diff --git a/icu4c/source/i18n/CMakeLists.txt b/icu4c/source/i18n/CMakeLists.txt
new file mode 100644
index 0000000..8e7a2b3
--- /dev/null
+++ b/icu4c/source/i18n/CMakeLists.txt
@@ -0,0 +1,42 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(icui18n C CXX)
+
+add_definitions("-DU_I18N_IMPLEMENTATION")
+add_definitions("-D_REENTRANT")
+
+# Add other source dirs that icuuc uses
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../android_icu4c/include")
+
+# Compile icuuc
+set(ICUUC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../common")
+set(ICUUC_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/libicuuc-target")
+add_subdirectory(${ICUUC_SOURCE_DIR} ${ICUUC_TARGET_BINARY_DIR})
+
+# Glob icu common source files
+file(
+   GLOB_RECURSE
+   ICU_I18N_CC_SOURCES
+   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+   "*.h" "*.cpp"
+)
+message(STATUS "ICU_I18N_CC_SOURCES=${ICU_I18N_CC_SOURCES}")
+
+add_library(
+   # name
+   icui18n
+
+   # SHARED or STATIC
+   STATIC
+
+   # Provides a relative path to your source file(s).
+   ${ICU_I18N_CC_SOURCES}
+)
+target_include_directories(icui18n PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icui18n PRIVATE ${ICUUC_SOURCE_DIR})
+target_include_directories(icui18n PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+target_link_libraries(icui18n icuuc)
+
+set_target_properties(icui18n PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/icu4c/source/stubdata/CMakeLists.txt b/icu4c/source/stubdata/CMakeLists.txt
new file mode 100644
index 0000000..9ffaa50
--- /dev/null
+++ b/icu4c/source/stubdata/CMakeLists.txt
@@ -0,0 +1,36 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(icuuc_stubdata C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+
+# Glob icu stub source files
+file(
+   GLOB_RECURSE
+   ICU_STUB_CC_SOURCES
+   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+   "*.h" "*.cpp"
+)
+message(STATUS "ICU_STUB_CC_SOURCES=${ICU_STUB_CC_SOURCES}")
+
+# Add icuuc, android_icu4c headers
+set(ICU_COMMON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../common")
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../android_icu4c/include")
+
+add_library(
+   # name
+   icuuc_stubdata
+
+   # SHARED or STATIC
+   STATIC
+
+   # Provides a relative path to your source file(s).
+   ${ICU_STUB_CC_SOURCES}
+)
+target_include_directories(icuuc_stubdata PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icuuc_stubdata PRIVATE ${ICU_COMMON_SOURCE_DIR})
+target_include_directories(icuuc_stubdata PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+
+set_target_properties(icuuc_stubdata PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/libandroidicu/CMakeLists.txt b/libandroidicu/CMakeLists.txt
deleted file mode 100644
index 60d2d07..0000000
--- a/libandroidicu/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# Minimum CMake required
-cmake_minimum_required(VERSION 3.1.3)
-
-# Project
-project(libandroidicu C CXX)
-
-set(ICU_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
-set(ICU_SHIM_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/static_shim")
-
-# Glob icu source files
-file(
-   GLOB_RECURSE
-   ICU_CC_SOURCES
-   "${ICU_SOURCE_DIR}/*.cpp"
-   "${ICU_SOURCE_DIR}/*.h"
-)
-message(STATUS "ICU_CC_SOURCES=${ICU_CC_SOURCES}")
-
-file(
-   GLOB_RECURSE
-   ICU_CC_SHIM_SOURCES
-   "${ICU_SHIM_SOURCE_DIR}/*.cpp"
-   "${ICU_SHIM_SOURCE_DIR}/*.h"
-)
-message(STATUS "ICU_CC_SHIM_SOURCES=${ICU_CC_SHIM_SOURCES}")
-
-add_library(
-   # name
-   libandroidicu
-
-   # SHARED or STATIC
-   STATIC
-
-   # Provides a relative path to your source file(s).
-   ${ICU_CC_SOURCES}
-   ${ICU_CC_SHIM_SOURCES}
-)
-target_include_directories(libandroidicu PRIVATE ${ICU_SOURCE_DIR})
-target_include_directories(libandroidicu PRIVATE ${ICU_SHIM_SOURCE_DIR})
-
-set_target_properties(libandroidicu PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/libandroidicu/static_shim/CMakeLists.txt b/libandroidicu/static_shim/CMakeLists.txt
new file mode 100644
index 0000000..472f3d8
--- /dev/null
+++ b/libandroidicu/static_shim/CMakeLists.txt
@@ -0,0 +1,48 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(libandroidicu C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+
+# Add other source dirs that icuuc uses
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../android_icu4c/include")
+
+# Compile icuuc
+set(ICUUC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../icu4c/source/common")
+
+# Compile icui18n
+set(ICU_I18N_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../icu4c/source/i18n")
+set(ICU_I18N_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/libicui18n-target")
+add_subdirectory(${ICU_I18N_SOURCE_DIR} ${ICU_I18N_TARGET_BINARY_DIR})
+
+# Glob shim sources
+set(ICU_SHIM_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+file(
+   GLOB_RECURSE
+   ICU_STATIC_SHIM_CC_SOURCES
+   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+   "${ICU_SHIM_SOURCE_DIR}/*.cpp"
+   "${ICU_SHIM_SOURCE_DIR}/*.h"
+)
+message(STATUS "ICU_STATIC_SHIM_CC_SOURCES=${ICU_STATIC_SHIM_CC_SOURCES}")
+
+add_library(
+   # name
+   libandroidicu
+
+   # SHARED or STATIC
+   STATIC
+
+   # Provides a relative path to your source file(s).
+   ${ICU_STATIC_SHIM_CC_SOURCES}
+)
+target_include_directories(libandroidicu PRIVATE ${ICUUC_SOURCE_DIR})
+target_include_directories(libandroidicu PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+target_include_directories(libandroidicu PRIVATE ${ICU_I18N_SOURCE_DIR})
+target_include_directories(libandroidicu PRIVATE ${ICU_STATIC_SHIM_CC_SOURCES})
+target_link_libraries(libandroidicu icui18n)
+
+set_target_properties(libandroidicu PROPERTIES LINKER_LANGUAGE CXX)
+
diff --git a/libandroidicuinit/CMakeLists.txt b/libandroidicuinit/CMakeLists.txt
new file mode 100644
index 0000000..53bce3a
--- /dev/null
+++ b/libandroidicuinit/CMakeLists.txt
@@ -0,0 +1,40 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(androidicuinit C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+add_definitions("-DANDROID_ICU_NO_DAT")
+add_definitions("-DNO_ANDROID_LIBLOG")
+
+# Glob libandroidicuinit source files
+file(
+   GLOB_RECURSE
+   ANDROIDICU_INIT_CC_SOURCES
+   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+   "${CMAKE_CURRENT_SOURCE_DIR}/*.h"
+   "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
+)
+message(STATUS "ANDROIDICU_INIT_CC_SOURCES=${ANDROIDICU_INIT_CC_SOURCES}")
+
+# Add icuuc, android_icu4c headers
+set(ICU_COMMON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../icu4c/source/common")
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../android_icu4c/include")
+
+add_library(
+   # name
+   androidicuinit
+
+   # SHARED or STATIC
+   STATIC
+
+   # Provides a relative path to your source file(s).
+   ${ANDROIDICU_INIT_CC_SOURCES}
+)
+target_include_directories(androidicuinit PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(androidicuinit PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include")
+target_include_directories(androidicuinit PRIVATE ${ICU_COMMON_SOURCE_DIR})
+target_include_directories(androidicuinit PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+
+set_target_properties(androidicuinit PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/libandroidicuinit/IcuRegistration.cpp b/libandroidicuinit/IcuRegistration.cpp
index f3394ae..ed076a4 100644
--- a/libandroidicuinit/IcuRegistration.cpp
+++ b/libandroidicuinit/IcuRegistration.cpp
@@ -27,7 +27,7 @@
 #include <unicode/udata.h>
 #include <unicode/utypes.h>
 
-#ifndef __ANDROID__
+#if !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
 static int PriorityToLevel(char priority) {
   // Priority is just the array index of priority in kPriorities.
   static const char* kPriorities = "VDIWEF";
@@ -57,12 +57,12 @@
   static int g_LogLevel = GetHostLogLevel();
   return PriorityToLevel(priority) >= g_LogLevel;
 }
-#endif  // __ANDROID__
+#endif  // !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
 
 namespace androidicuinit {
 namespace impl {
 
-#ifndef __ANDROID__
+#if !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
 // http://b/171371690 Avoid dependency on liblog and libbase on host
 // Simplified version of android::base::unique_fd for host.
 class simple_unique_fd final {
@@ -103,10 +103,10 @@
         _rc;                                   \
       })
   #endif
-#endif // #ifndef __ANDROID__
+#endif // !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
 
 // http://b/171371690 Avoid dependency on liblog and libbase on host
-#ifdef __ANDROID__
+#if defined(__ANDROID__) && !defined(NO_ANDROID_LIBLOG)
   typedef android::base::unique_fd aicu_unique_fd;
 #else
   typedef simple_unique_fd aicu_unique_fd;
diff --git a/libandroidicuinit/IcuRegistration.h b/libandroidicuinit/IcuRegistration.h
index 7eb774c..e968dbd 100644
--- a/libandroidicuinit/IcuRegistration.h
+++ b/libandroidicuinit/IcuRegistration.h
@@ -21,7 +21,14 @@
 #include <string>
 #include <cstdio>
 
-#ifdef __ANDROID__
+
+/**
+ * def NO_ANDROID_LOGGING
+ *   This flag turns off the usage of liblog, and logs into stderr instead.
+ *   This is not expected to be used in Android platform build, but is useful
+ *   when building this ICU4C for unbundled library or app.
+ */
+#if defined(__ANDROID__) && !defined(NO_ANDROID_LIBLOG)
   #include <android-base/logging.h>
   #include <android-base/unique_fd.h>
   #include <log/log.h>
diff --git a/libandroidicuinit/android_icu_init.cpp b/libandroidicuinit/android_icu_init.cpp
index 5753703..71fcec6 100644
--- a/libandroidicuinit/android_icu_init.cpp
+++ b/libandroidicuinit/android_icu_init.cpp
@@ -24,7 +24,13 @@
 
     // We know that the environment variables are exported early in init.environ.rc on Android.
     #ifdef __ANDROID__
-    runAndroidInit = true;
+      #ifdef ANDROID_ICU_NO_DAT
+        // If we're intentionally building ICU on Android without the .dat file, no
+        // need to run init.
+        runAndroidInit = false;
+      #else  // !ANDROID_ICU_NO_DAT
+        runAndroidInit = true;
+      #endif
     #else // ART host testing environment has these env variables set.
     runAndroidInit = getenv("ANDROID_DATA") != NULL &&
                      getenv("ANDROID_TZDATA_ROOT") != NULL &&
@@ -47,4 +53,4 @@
         AICU_LOGW("libicuuc is not initialized and possibly never used, "
               "but android_icu_cleanup() is called.");
     }
-}
\ No newline at end of file
+}