From b156f8129ddd4497ef686f886c902eea5c2dd0fb Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 13:19:43 +0100
Subject: [PATCH 01/12] Remove ios arm target

---
 .github/workflows/intl4x_artifacts.yml | 1 -
 pkgs/intl4x/hook/README.md             | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 786b666d..730648ea 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -105,7 +105,6 @@ jobs:
         cd ffi/dart
         dart pub get
         cd ../..
-        dart run ffi/dart/tool/build_libs.dart --file bin/ios_arm_${{ matrix.compiletype }} --os ios --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart run ffi/dart/tool/build_libs.dart --file bin/ios_arm64_${{ matrix.compiletype }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart run ffi/dart/tool/build_libs.dart --file bin/ios_x64_${{ matrix.compiletype }} --os ios --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart run ffi/dart/tool/build_libs.dart --file bin/macos_arm64_${{ matrix.compiletype }} --os macos --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
diff --git a/pkgs/intl4x/hook/README.md b/pkgs/intl4x/hook/README.md
index d9e5dfe0..34ab8928 100644
--- a/pkgs/intl4x/hook/README.md
+++ b/pkgs/intl4x/hook/README.md
@@ -10,5 +10,5 @@
 1. Create PR.
 2. Run `bash tools/regenerate_bindings.sh`, and fix resulting errors.
 3. Update `const version` in `version.dart` to tag.
-4. Regenerate hashes using `cd pkgs/intl4x/; dart --enable-experiment=native-assets tool/regenerate_hashes.dart`.
+4. Regenerate hashes using `cd pkgs/intl4x/; dart tool/regenerate_hashes.dart`.
 5. Land PR.

From e19e38af125bbc0b8754465c67fd87423ffb079a Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 13:23:30 +0100
Subject: [PATCH 02/12] install nightly

---
 .github/workflows/intl4x_artifacts.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 730648ea..03b3804b 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -35,6 +35,7 @@ jobs:
     - name: Install Rust toolchains
       run: |
         rustup toolchain install stable
+        rustup toolchain install nightly
     
     - name: Show the selected Rust toolchain
       run: rustup show

From a4c6e9d828c1f46566cde8d779f6a182ccc08901 Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 14:41:13 +0100
Subject: [PATCH 03/12] fix build libs

---
 .github/workflows/intl4x_artifacts.yml |  58 +++----
 pkgs/intl4x/tool/build_libs.g.dart     | 202 +++++++++++++++++++++++++
 tools/regenerate_bindings.sh           |   4 +-
 3 files changed, 229 insertions(+), 35 deletions(-)
 create mode 100644 pkgs/intl4x/tool/build_libs.g.dart

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 03b3804b..3f3603c3 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -8,6 +8,7 @@ on:
     branches: [ main ]
     paths:
       - pkgs/intl4x/src/hook_helpers/hashes.dart
+      - .github/workflows/intl4x_artifacts.yaml
   push:
     tags:
       - 'intl4x-icu*'
@@ -62,21 +63,18 @@ jobs:
     - name: Build Linux
       if: matrix.os == 'ubuntu-latest'
       run: |
-        cd submodules/icu4x
-
-        mkdir bin
-
-        cd ffi/dart
-        dart pub get
-        cd ../..
-        dart run ffi/dart/tool/build_libs.dart --file bin/android_arm_${{ matrix.compiletype }} --os android --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/android_arm64_${{ matrix.compiletype }} --os android --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/android_ia32_${{ matrix.compiletype }} --os android --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/android_x64_${{ matrix.compiletype }} --os android --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/linux_arm_${{ matrix.compiletype }} --os linux --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/linux_arm64_${{ matrix.compiletype }} --os linux --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/linux_riscv64_${{ matrix.compiletype }} --os linux --architecture riscv64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/linux_x64_${{ matrix.compiletype }} --os linux --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
+        (cd submodules/icu4x/ffi/dart && dart pub get)
+        
+        mkdir submodules/icu4x/bin
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm_${{ matrix.compiletype }} --os android --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm64_${{ matrix.compiletype }} --os android --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_ia32_${{ matrix.compiletype }} --os android --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_x64_${{ matrix.compiletype }} --os android --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_arm_${{ matrix.compiletype }} --os linux --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_arm64_${{ matrix.compiletype }} --os linux --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_riscv64_${{ matrix.compiletype }} --os linux --architecture riscv64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_x64_${{ matrix.compiletype }} --os linux --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
 
     - name: Build Linux data
       if: matrix.os == 'ubuntu-latest' && matrix.compiletype == 'static'
@@ -99,17 +97,13 @@ jobs:
     - name: Build Mac
       if: matrix.os == 'macos-latest'
       run: |
-        cd submodules/icu4x
+        (cd submodules/icu4x/ffi/dart && dart pub get)
 
-        mkdir bin
-
-        cd ffi/dart
-        dart pub get
-        cd ../..
-        dart run ffi/dart/tool/build_libs.dart --file bin/ios_arm64_${{ matrix.compiletype }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/ios_x64_${{ matrix.compiletype }} --os ios --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/macos_arm64_${{ matrix.compiletype }} --os macos --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/macos_x64_${{ matrix.compiletype }} --os macos --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        mkdir submodules/icu4x/bin
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_arm64_${{ matrix.compiletype }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_x64_${{ matrix.compiletype }} --os ios --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_arm64_${{ matrix.compiletype }} --os macos --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_x64_${{ matrix.compiletype }} --os macos --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
 
     - name: Build Mac data
       if: matrix.os == 'macos-latest' && matrix.compiletype == 'static'
@@ -127,16 +121,12 @@ jobs:
     - name: Build Windows
       if: matrix.os == 'windows-latest'
       run: |
-        cd submodules/icu4x
-      
-        mkdir bin
+        (cd submodules/icu4x/ffi/dart && dart pub get)
 
-        cd ffi/dart
-        dart pub get
-        cd ../..
-        dart run ffi/dart/tool/build_libs.dart --file bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart run ffi/dart/tool/build_libs.dart --file bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        mkdir submodules/icu4x/bin
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
 
     - name: Build Windows data
       if: matrix.os == 'windows-latest' && matrix.compiletype == 'static'
diff --git a/pkgs/intl4x/tool/build_libs.g.dart b/pkgs/intl4x/tool/build_libs.g.dart
new file mode 100644
index 00000000..79b1e874
--- /dev/null
+++ b/pkgs/intl4x/tool/build_libs.g.dart
@@ -0,0 +1,202 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:native_assets_cli/code_assets.dart';
+import 'package:path/path.dart' as path;
+
+const crateName = 'icu_capi';
+
+Future<void> main(List<String> args) async {
+  const fileKey = 'file';
+  const osKey = 'os';
+  const architectureKey = 'architecture';
+  const workingDirectoryKey = 'working_directory';
+  const simulatorKey = 'simulator';
+  const compileTypeKey = 'compile_type';
+  const cargoFeaturesKey = 'cargo_features';
+  final argParser =
+      ArgParser()
+        ..addOption(fileKey, mandatory: true)
+        ..addOption(
+          compileTypeKey,
+          allowed: ['static', 'dynamic'],
+          mandatory: true,
+        )
+        ..addFlag(simulatorKey, defaultsTo: false)
+        ..addOption(osKey, mandatory: true)
+        ..addOption(architectureKey, mandatory: true)
+        ..addOption(workingDirectoryKey, mandatory: true)
+        ..addMultiOption(
+          cargoFeaturesKey,
+          defaultsTo: ['default_components', 'compiled_data'],
+        );
+
+  ArgResults parsed;
+  String os;
+  String architecture;
+  String compileType;
+  try {
+    parsed = argParser.parse(args);
+  } catch (e) {
+    print('Error parsing $args');
+    print(argParser.usage);
+    exit(1);
+  }
+  os = parsed.option(osKey)!;
+  architecture = parsed.option(architectureKey)!;
+  compileType = parsed.option(compileTypeKey)!;
+
+  final lib = await buildLib(
+    OS.values.firstWhere((o) {
+      return o.name == os;
+    }),
+    Architecture.values.firstWhere((o) {
+      return o.name == architecture;
+    }),
+    compileType == 'static',
+    parsed.flag(simulatorKey),
+    Directory(parsed.option(workingDirectoryKey)!),
+    parsed.multiOption(cargoFeaturesKey),
+  );
+  await lib.copy(
+    Uri.file(parsed.option(fileKey)!).toFilePath(windows: Platform.isWindows),
+  );
+}
+
+// Copied from Dart's package:intl4x build.dart, see
+// https://github.com/dart-lang/i18n/blob/main/pkgs/intl4x/hook/build.dart
+Future<File> buildLib(
+  OS targetOS,
+  Architecture targetArchitecture,
+  bool buildStatic,
+  bool isSimulator,
+  Directory workingDirectory,
+  List<String> cargoFeatures,
+) async {
+  // We assume that the first folder to contain a cargo.toml above the
+  // output directory is the directory containing the ICU4X code.
+  if (!File.fromUri(workingDirectory.uri.resolve('Cargo.toml')).existsSync()) {
+    throw ArgumentError('No Cargo.toml found in $workingDirectory');
+  }
+
+  final isNoStd = _isNoStdTarget((targetOS, targetArchitecture));
+  final target = _asRustTarget(targetOS, targetArchitecture, isSimulator);
+  if (!isNoStd) {
+    final rustArguments = ['target', 'add', target];
+    await runProcess(
+      'rustup',
+      rustArguments,
+      workingDirectory: workingDirectory,
+    );
+  }
+
+  final features = {
+    ...cargoFeatures,
+    ...(isNoStd
+        ? ['libc_alloc', 'looping_panic_handler']
+        : ['logging', 'simple_logger']),
+  };
+  await runProcess('cargo', [
+    if (buildStatic || isNoStd) '+nightly',
+    'rustc',
+    '--manifest-path=ffi/capi/Cargo.toml',
+    '--crate-type=${buildStatic ? 'staticlib' : 'cdylib'}',
+    '--release',
+    '--config=profile.release.panic="abort"',
+    '--config=profile.release.codegen-units=1',
+    '--no-default-features',
+    '--features=${features.join(',')}',
+    if (isNoStd) '-Zbuild-std=core,alloc',
+    if (buildStatic || isNoStd) ...[
+      '-Zbuild-std=std,panic_abort',
+      '-Zbuild-std-features=panic_immediate_abort',
+    ],
+    '--target=$target',
+  ], workingDirectory: workingDirectory);
+
+  final file = File(
+    path.join(
+      workingDirectory.path,
+      'target',
+      target,
+      'release',
+      (buildStatic ? targetOS.staticlibFileName : targetOS.dylibFileName)(
+        crateName.replaceAll('-', '_'),
+      ),
+    ),
+  );
+  if (!(await file.exists())) {
+    throw FileSystemException('Building the dylib failed', file.path);
+  }
+  return file;
+}
+
+String _asRustTarget(OS os, Architecture? architecture, bool isSimulator) {
+  if (os == OS.iOS && architecture == Architecture.arm64 && isSimulator) {
+    return 'aarch64-apple-ios-sim';
+  }
+  return switch ((os, architecture)) {
+    (OS.android, Architecture.arm) => 'armv7-linux-androideabi',
+    (OS.android, Architecture.arm64) => 'aarch64-linux-android',
+    (OS.android, Architecture.ia32) => 'i686-linux-android',
+    (OS.android, Architecture.riscv64) => 'riscv64-linux-android',
+    (OS.android, Architecture.x64) => 'x86_64-linux-android',
+    (OS.fuchsia, Architecture.arm64) => 'aarch64-unknown-fuchsia',
+    (OS.fuchsia, Architecture.x64) => 'x86_64-unknown-fuchsia',
+    (OS.iOS, Architecture.arm64) => 'aarch64-apple-ios',
+    (OS.iOS, Architecture.x64) => 'x86_64-apple-ios',
+    (OS.linux, Architecture.arm) => 'armv7-unknown-linux-gnueabihf',
+    (OS.linux, Architecture.arm64) => 'aarch64-unknown-linux-gnu',
+    (OS.linux, Architecture.ia32) => 'i686-unknown-linux-gnu',
+    (OS.linux, Architecture.riscv32) => 'riscv32gc-unknown-linux-gnu',
+    (OS.linux, Architecture.riscv64) => 'riscv64gc-unknown-linux-gnu',
+    (OS.linux, Architecture.x64) => 'x86_64-unknown-linux-gnu',
+    (OS.macOS, Architecture.arm64) => 'aarch64-apple-darwin',
+    (OS.macOS, Architecture.x64) => 'x86_64-apple-darwin',
+    (OS.windows, Architecture.arm64) => 'aarch64-pc-windows-msvc',
+    (OS.windows, Architecture.ia32) => 'i686-pc-windows-msvc',
+    (OS.windows, Architecture.x64) => 'x86_64-pc-windows-msvc',
+    (_, _) =>
+      throw UnimplementedError(
+        'Target ${(os, architecture)} not available for rust',
+      ),
+  };
+}
+
+bool _isNoStdTarget((OS os, Architecture? architecture) arg) => [
+  (OS.android, Architecture.riscv64),
+  (OS.linux, Architecture.riscv64),
+].contains(arg);
+
+Future<void> runProcess(
+  String executable,
+  List<String> arguments, {
+  Directory? workingDirectory,
+  bool dryRun = false,
+}) async {
+  print('----------');
+  print('Running `$executable $arguments` in $workingDirectory');
+  if (!dryRun) {
+    final processResult = await Process.run(
+      executable,
+      arguments,
+      workingDirectory: workingDirectory?.path,
+    );
+    print('stdout:');
+    print(processResult.stdout);
+    if ((processResult.stderr as String).isNotEmpty) {
+      print('stderr:');
+      print(processResult.stderr);
+    }
+    if (processResult.exitCode != 0) {
+      throw ProcessException(executable, arguments, '', processResult.exitCode);
+    }
+  } else {
+    print('Not running, as --dry-run is set.');
+  }
+  print('==========');
+}
diff --git a/tools/regenerate_bindings.sh b/tools/regenerate_bindings.sh
index d9645131..21cc69cb 100644
--- a/tools/regenerate_bindings.sh
+++ b/tools/regenerate_bindings.sh
@@ -1,4 +1,6 @@
 rm pkgs/intl4x/lib/src/bindings/*
 cd pkgs/intl4x/lib/src/bindings/
 cp -a ../../../../../submodules/icu4x/ffi/capi/bindings/dart/*.dart .
-dart format .
\ No newline at end of file
+
+cp submodules/icu4x/ffi/dart/tool/build_libs.dart pkgs/intl4x/tool/build_libs.g.dart
+dart format .

From 5c0b80536751209f0514f40794d5c46a6f5241ef Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 14:42:32 +0100
Subject: [PATCH 04/12] Fix name

---
 .github/workflows/intl4x_artifacts.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 3f3603c3..41d19684 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -8,7 +8,7 @@ on:
     branches: [ main ]
     paths:
       - pkgs/intl4x/src/hook_helpers/hashes.dart
-      - .github/workflows/intl4x_artifacts.yaml
+      - .github/workflows/intl4x_artifacts.yml
   push:
     tags:
       - 'intl4x-icu*'

From 153cb9302a6ab11e2b1290eea4dc59d145b32fd8 Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 14:44:29 +0100
Subject: [PATCH 05/12] fix pub get location

---
 .github/workflows/intl4x_artifacts.yml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 41d19684..9c0b7c70 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -64,7 +64,7 @@ jobs:
       if: matrix.os == 'ubuntu-latest'
       run: |
         rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
-        (cd submodules/icu4x/ffi/dart && dart pub get)
+        (cd pkgs/intl4x && dart pub get)
         
         mkdir submodules/icu4x/bin
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm_${{ matrix.compiletype }} --os android --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
@@ -97,7 +97,7 @@ jobs:
     - name: Build Mac
       if: matrix.os == 'macos-latest'
       run: |
-        (cd submodules/icu4x/ffi/dart && dart pub get)
+        (cd pkgs/intl4x && dart pub get)
 
         mkdir submodules/icu4x/bin
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_arm64_${{ matrix.compiletype }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
@@ -121,7 +121,7 @@ jobs:
     - name: Build Windows
       if: matrix.os == 'windows-latest'
       run: |
-        (cd submodules/icu4x/ffi/dart && dart pub get)
+        (cd pkgs/intl4x && dart pub get)
 
         mkdir submodules/icu4x/bin
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}

From 921090eae54287995a17e984e3e10ab202bacff0 Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 14:49:00 +0100
Subject: [PATCH 06/12] Add mac toolchain src

---
 .github/workflows/intl4x_artifacts.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 9c0b7c70..c2de04b4 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -97,6 +97,7 @@ jobs:
     - name: Build Mac
       if: matrix.os == 'macos-latest'
       run: |
+        rustup component add rust-src --toolchain nightly-aarch64-apple-darwin
         (cd pkgs/intl4x && dart pub get)
 
         mkdir submodules/icu4x/bin

From 21f271d6e43390018b14445467666ae8cc0b0ebc Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 14:50:49 +0100
Subject: [PATCH 07/12] adapt windows

---
 .github/workflows/intl4x_artifacts.yml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index c2de04b4..80dc9c26 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -122,12 +122,12 @@ jobs:
     - name: Build Windows
       if: matrix.os == 'windows-latest'
       run: |
-        (cd pkgs/intl4x && dart pub get)
+        (cd pkgs\intl4x && dart pub get)
 
         mkdir submodules/icu4x/bin
-        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs\intl4x\tool\build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs\intl4x\tool\build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs\intl4x\tool\build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
 
     - name: Build Windows data
       if: matrix.os == 'windows-latest' && matrix.compiletype == 'static'

From 515c44ff2b5b5a5fee80a5ad2d68c1ff700e23f9 Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 15:27:54 +0100
Subject: [PATCH 08/12] fixes

---
 .github/workflows/intl4x_artifacts.yml | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 80dc9c26..2d989861 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -79,6 +79,8 @@ jobs:
     - name: Build Linux data
       if: matrix.os == 'ubuntu-latest' && matrix.compiletype == 'static'
       run: |
+        cd submodules/icu4x
+
         cargo run -p icu_datagen -- --locales full --keys all --format blob --out bin/full.postcard
 
         cd provider/datagen # avoid global feature resolution
@@ -109,7 +111,7 @@ jobs:
     - name: Build Mac data
       if: matrix.os == 'macos-latest' && matrix.compiletype == 'static'
       run: |
-        cd provider/datagen # avoid global feature resolution
+        cd submodules/icu4x/provider/datagen # avoid global feature resolution
         rustup target add aarch64-apple-darwin
         cargo build --release --bin icu4x-datagen --no-default-features --features bin,blob_exporter,blob_input,rayon,experimental_components --target aarch64-apple-darwin
         rustup target add x86_64-apple-darwin
@@ -122,17 +124,17 @@ jobs:
     - name: Build Windows
       if: matrix.os == 'windows-latest'
       run: |
-        (cd pkgs\intl4x && dart pub get)
-
+        (cd pkgs/intl4x && dart pub get)
+        dir
         mkdir submodules/icu4x/bin
-        dart pkgs\intl4x\tool\build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart pkgs\intl4x\tool\build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
-        dart pkgs\intl4x\tool\build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
+        dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
 
     - name: Build Windows data
       if: matrix.os == 'windows-latest' && matrix.compiletype == 'static'
       run: |
-        cd provider/datagen # avoid global feature resolution
+        cd submodules/icu4x/provider/datagen # avoid global feature resolution
         rustup target add aarch64-pc-windows-msvc
         cargo build --release --bin icu4x-datagen --no-default-features --features bin,blob_exporter,blob_input,rayon,experimental_components --target aarch64-pc-windows-msvc
         rustup target add x86_64-pc-windows-msvc

From 6f8ddc7c74bd33c73f2ac259e93e4becd2b177db Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 15:34:10 +0100
Subject: [PATCH 09/12] use pushd

---
 .github/workflows/intl4x_artifacts.yml | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index 2d989861..a59ab76a 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -124,8 +124,10 @@ jobs:
     - name: Build Windows
       if: matrix.os == 'windows-latest'
       run: |
-        (cd pkgs/intl4x && dart pub get)
-        dir
+        pushd pkgs/intl4x
+        dart pub get
+        popd
+        
         mkdir submodules/icu4x/bin
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}

From 663d01d3fcd900c1736d734cf365317a91242bc3 Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 15:42:54 +0100
Subject: [PATCH 10/12] Add windows toolchain

---
 .github/workflows/intl4x_artifacts.yml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/.github/workflows/intl4x_artifacts.yml b/.github/workflows/intl4x_artifacts.yml
index a59ab76a..2d703cfa 100644
--- a/.github/workflows/intl4x_artifacts.yml
+++ b/.github/workflows/intl4x_artifacts.yml
@@ -67,6 +67,7 @@ jobs:
         (cd pkgs/intl4x && dart pub get)
         
         mkdir submodules/icu4x/bin
+        
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm_${{ matrix.compiletype }} --os android --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm64_${{ matrix.compiletype }} --os android --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_ia32_${{ matrix.compiletype }} --os android --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
@@ -100,9 +101,11 @@ jobs:
       if: matrix.os == 'macos-latest'
       run: |
         rustup component add rust-src --toolchain nightly-aarch64-apple-darwin
+        
         (cd pkgs/intl4x && dart pub get)
 
         mkdir submodules/icu4x/bin
+        
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_arm64_${{ matrix.compiletype }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_x64_${{ matrix.compiletype }} --os ios --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_arm64_${{ matrix.compiletype }} --os macos --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
@@ -124,11 +127,14 @@ jobs:
     - name: Build Windows
       if: matrix.os == 'windows-latest'
       run: |
+        rustup component add rust-src --toolchain nightly-x86_64-pc-windows-msvc
+        
         pushd pkgs/intl4x
         dart pub get
         popd
         
         mkdir submodules/icu4x/bin
+        
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}
         dart pkgs/intl4x/tool/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals,experimental_components${{ env.DATA }}

From 45b90f3c945008ba8f6416b534165c4d03b48023 Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 15:50:39 +0100
Subject: [PATCH 11/12] Bump version

---
 pkgs/intl4x/CHANGELOG.md | 4 ++++
 pkgs/intl4x/pubspec.yaml | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/pkgs/intl4x/CHANGELOG.md b/pkgs/intl4x/CHANGELOG.md
index 1b1e6501..7c824faf 100644
--- a/pkgs/intl4x/CHANGELOG.md
+++ b/pkgs/intl4x/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.2
+
+- Use locally modified build_tools.dart for building icu4x libs.
+
 ## 0.11.1
 
 - Fix fraction digits parsing and allow no hook options key in the pubspec.
diff --git a/pkgs/intl4x/pubspec.yaml b/pkgs/intl4x/pubspec.yaml
index 36e0ae79..0048f485 100644
--- a/pkgs/intl4x/pubspec.yaml
+++ b/pkgs/intl4x/pubspec.yaml
@@ -1,7 +1,7 @@
 name: intl4x
 description: >-
   A lightweight modular library for internationalization (i18n) functionality.
-version: 0.11.1
+version: 0.11.2
 repository: https://github.com/dart-lang/i18n/tree/main/pkgs/intl4x
 issue_tracker: https://github.com/dart-lang/i18n/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Aintl4x
 

From 736e7affe8df5d28cc69aafd02dc170a123ac96f Mon Sep 17 00:00:00 2001
From: Moritz <mosum@google.com>
Date: Wed, 12 Mar 2025 15:58:54 +0100
Subject: [PATCH 12/12] Small fixes

---
 pkgs/intl4x/tool/build_libs.g.dart | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/pkgs/intl4x/tool/build_libs.g.dart b/pkgs/intl4x/tool/build_libs.g.dart
index 79b1e874..0ed43cd6 100644
--- a/pkgs/intl4x/tool/build_libs.g.dart
+++ b/pkgs/intl4x/tool/build_libs.g.dart
@@ -36,9 +36,6 @@ Future<void> main(List<String> args) async {
         );
 
   ArgResults parsed;
-  String os;
-  String architecture;
-  String compileType;
   try {
     parsed = argParser.parse(args);
   } catch (e) {
@@ -46,18 +43,15 @@ Future<void> main(List<String> args) async {
     print(argParser.usage);
     exit(1);
   }
-  os = parsed.option(osKey)!;
-  architecture = parsed.option(architectureKey)!;
-  compileType = parsed.option(compileTypeKey)!;
 
   final lib = await buildLib(
     OS.values.firstWhere((o) {
-      return o.name == os;
+      return o.name == parsed.option(osKey)!;
     }),
     Architecture.values.firstWhere((o) {
-      return o.name == architecture;
+      return o.name == parsed.option(architectureKey)!;
     }),
-    compileType == 'static',
+    parsed.option(compileTypeKey)! == 'static',
     parsed.flag(simulatorKey),
     Directory(parsed.option(workingDirectoryKey)!),
     parsed.multiOption(cargoFeaturesKey),