Use `RustBuilder`
diff --git a/pkgs/intl4x/hook/build.dart b/pkgs/intl4x/hook/build.dart
index 04f378a..591f16e 100644
--- a/pkgs/intl4x/hook/build.dart
+++ b/pkgs/intl4x/hook/build.dart
@@ -6,8 +6,8 @@
 
 import 'package:crypto/crypto.dart' show sha256;
 import 'package:native_assets_cli/native_assets_cli.dart';
-import 'package:path/path.dart' as path;
-
+import 'package:native_toolchain_rust/native_toolchain_rust.dart';
+import 'package:logging/logging.dart';
 import 'hashes.dart';
 import 'version.dart';
 
@@ -22,7 +22,7 @@
     final environmentBuildMode = Platform.environment[env];
     final buildMode = switch (environmentBuildMode) {
       'local' => LocalMode(config),
-      'checkout' => CheckoutMode(config),
+      'checkout' => CheckoutMode(config, output),
       'fetch' || null => FetchMode(config),
       String() => throw ArgumentError('''
 
@@ -39,14 +39,16 @@
     // For debugging purposes
     output.addMetadatum(env, environmentBuildMode ?? 'fetch');
 
-    output.addAsset(NativeCodeAsset(
-      package: package,
-      name: assetId,
-      linkMode: DynamicLoadingBundled(),
-      architecture: config.targetArchitecture,
-      os: config.targetOS,
-      file: builtLibrary,
-    ));
+    if (builtLibrary != null) {
+      output.addAsset(NativeCodeAsset(
+        package: package,
+        name: assetId,
+        linkMode: DynamicLoadingBundled(),
+        architecture: config.targetArchitecture,
+        os: config.targetOS,
+        file: builtLibrary,
+      ));
+    }
 
     output.addDependencies(
       [
@@ -64,7 +66,7 @@
 
   List<Uri> get dependencies;
 
-  Future<Uri> build();
+  Future<Uri?> build();
 }
 
 final class FetchMode extends BuildMode {
@@ -136,12 +138,13 @@
 }
 
 final class CheckoutMode extends BuildMode {
-  CheckoutMode(super.config);
+  final BuildOutput output;
+  CheckoutMode(super.config, this.output);
 
   String? get workingDirectory => Platform.environment['LOCAL_ICU4X_CHECKOUT'];
 
   @override
-  Future<Uri> build() async {
+  Future<Uri?> build() async {
     if (workingDirectory == null) {
       throw ArgumentError('Specify the ICU4X checkout folder'
           'with the LOCAL_ICU4X_CHECKOUT variable');
@@ -154,10 +157,7 @@
         Uri.directory(workingDirectory!).resolve('Cargo.lock'),
       ];
 
-  Future<Uri> buildLib(BuildConfig config, String workingDirectory) async {
-    final dylibFileName =
-        config.targetOS.dylibFileName(crateName.replaceAll('-', '_'));
-    final dylibFileUri = config.outputDirectory.resolve(dylibFileName);
+  Future<Uri?> buildLib(BuildConfig config, String workingDirectory) async {
     if (!config.dryRun) {
       final rustTarget = _asRustTarget(
         config.targetOS,
@@ -170,87 +170,49 @@
 
       if (!isNoStd) {
         final rustArguments = ['target', 'add', rustTarget];
-        final rustup = await Process.run(
-          'rustup',
+        await Rustup.systemRustup()?.runCommand(
           rustArguments,
-          workingDirectory: workingDirectory,
+          logger: Logger(''),
         );
-
-        if (rustup.exitCode != 0) {
-          throw ProcessException(
-            'rustup',
-            rustArguments,
-            rustup.stderr.toString(),
-            rustup.exitCode,
-          );
-        }
       }
-      final tempDir = await Directory.systemTemp.createTemp();
-
-      final stdFeatures = [
-        'icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals',
-        'compiled_data',
+      final features = [
+        'icu_collator',
+        'icu_datetime',
+        'icu_list',
+        'icu_decimal',
+        'icu_plurals',
+        if (config.linkingEnabled) 'compiled_data',
         'buffer_provider',
-        'logging',
-        'simple_logger',
+        if (!isNoStd) ...['logging', 'simple_logger'],
+        if (isNoStd) ...['libc-alloc', 'panic-handler'],
         'experimental_components',
       ];
-      final noStdFeatures = [
-        'icu_collator,icu_datetime,icu_list,icu_decimal,icu_plurals',
-        'compiled_data',
-        'buffer_provider',
-        'libc-alloc',
-        'panic-handler',
-        'experimental_components',
-      ];
-      final linkModeType =
-          config.linkModePreference == LinkModePreference.static
-              ? 'staticlib'
-              : 'cdylib';
       final arguments = [
         if (isNoStd) '+nightly',
-        'rustc',
-        '-p=$crateName',
-        '--crate-type=$linkModeType',
-        '--release',
         '--config=profile.release.panic="abort"',
         '--config=profile.release.codegen-units=1',
         '--no-default-features',
-        if (!isNoStd) '--features=${stdFeatures.join(',')}',
-        if (isNoStd) '--features=${noStdFeatures.join(',')}',
-        if (isNoStd) '-Zbuild-std=core,alloc',
-        if (isNoStd) '-Zbuild-std-features=panic_immediate_abort',
-        '--target=$rustTarget',
-        '--target-dir=${tempDir.path}'
+        '--features=${features.join(',')}',
+        if (isNoStd) ...[
+          '-Zbuild-std=core,alloc',
+          '-Zbuild-std-features=panic_immediate_abort'
+        ],
       ];
-      final cargo = await Process.run(
-        'cargo',
-        arguments,
-        workingDirectory: workingDirectory,
-      );
 
-      if (cargo.exitCode != 0) {
-        throw ProcessException(
-          'cargo',
-          arguments,
-          cargo.stderr.toString(),
-          cargo.exitCode,
-        );
-      }
-
-      final builtPath = path.join(
-        tempDir.path,
-        rustTarget,
-        'release',
-        dylibFileName,
+      final rustBuilder = RustBuilder(
+        package: config.packageName,
+        assetName: assetId,
+        cratePath: crateName,
+        buildConfig: config,
+        extraCargoArgs: arguments,
+        buildMode: CargoBuildMode.rustc,
+        crateType:
+            config.linkingEnabled ? CrateType.staticlib : CrateType.cdylib,
+        release: true,
       );
-      final file = File(builtPath);
-      if (!(await file.exists())) {
-        throw FileSystemException('Building the dylib failed', builtPath);
-      }
-      await file.copy(dylibFileUri.toFilePath(windows: Platform.isWindows));
+      await rustBuilder.run(output: output);
     }
-    return dylibFileUri;
+    return null;
   }
 }
 
diff --git a/pkgs/intl4x/pubspec.yaml b/pkgs/intl4x/pubspec.yaml
index a1a444c..1d557b1 100644
--- a/pkgs/intl4x/pubspec.yaml
+++ b/pkgs/intl4x/pubspec.yaml
@@ -20,9 +20,10 @@
   crypto: ^3.0.3
   ffi: ^2.1.0
   js: ^0.7.1
+  logging: ^1.2.0
   meta: ^1.12.0
-  native_assets_cli: ^0.6.0
-  path: ^1.9.0
+  native_assets_cli: ^0.7.2
+  native_toolchain_rust: ^0.1.0-dev.7
 
 dev_dependencies:
   args: ^2.4.2