From c56fdeb4b67dfbf69dc6cd3fc0518130ede27992 Mon Sep 17 00:00:00 2001 From: fzyzcjy Date: Fri, 5 Jun 2026 23:28:42 +0800 Subject: [PATCH 1/3] Update CargoKit for Android 16KB pages Point the integration template CargoKit submodules at the refreshed 16KB page size CargoKit PR commit and sync the checked-in CargoKit copies used by examples. --- .../app/rust_builder/cargokit | 2 +- .../integration_template/plugin/cargokit | 2 +- .../lib/src/android_environment.dart | 16 ++- .../lib/src/android_environment.dart | 16 ++- .../lib/src/android_environment.dart | 16 ++- .../lib/src/android_environment.dart | 71 +++++++----- .../lib/src/artifacts_provider.dart | 75 +++++++------ .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 +-- .../cargokit/build_tool/lib/src/builder.dart | 75 ++++++------- .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 ++--- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- .../lib/src/android_environment.dart | 71 +++++++----- .../lib/src/artifacts_provider.dart | 75 +++++++------ .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 +-- .../cargokit/build_tool/lib/src/builder.dart | 75 ++++++------- .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 ++--- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- .../lib/src/android_environment.dart | 71 +++++++----- .../lib/src/artifacts_provider.dart | 75 +++++++------ .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 +-- .../cargokit/build_tool/lib/src/builder.dart | 75 ++++++------- .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 ++--- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- .../lib/src/android_environment.dart | 71 +++++++----- .../lib/src/artifacts_provider.dart | 75 +++++++------ .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 +-- .../cargokit/build_tool/lib/src/builder.dart | 75 ++++++------- .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 ++--- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- 65 files changed, 1115 insertions(+), 1077 deletions(-) diff --git a/frb_codegen/assets/integration_template/app/rust_builder/cargokit b/frb_codegen/assets/integration_template/app/rust_builder/cargokit index 516d6e1752b..a623a9f11b3 160000 --- a/frb_codegen/assets/integration_template/app/rust_builder/cargokit +++ b/frb_codegen/assets/integration_template/app/rust_builder/cargokit @@ -1 +1 @@ -Subproject commit 516d6e1752b369bacb8e78d76ed2838adaf5397e +Subproject commit a623a9f11b374733b53b721420c34ab1fead136f diff --git a/frb_codegen/assets/integration_template/plugin/cargokit b/frb_codegen/assets/integration_template/plugin/cargokit index 516d6e1752b..a623a9f11b3 160000 --- a/frb_codegen/assets/integration_template/plugin/cargokit +++ b/frb_codegen/assets/integration_template/plugin/cargokit @@ -1 +1 @@ -Subproject commit 516d6e1752b369bacb8e78d76ed2838adaf5397e +Subproject commit a623a9f11b374733b53b721420c34ab1fead136f diff --git a/frb_example/flutter_package/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/flutter_package/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..37dec5708b3 100644 --- a/frb_example/flutter_package/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/flutter_package/cargokit/build_tool/lib/src/android_environment.dart @@ -189,7 +189,21 @@ class AndroidEnvironment { if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384" + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/flutter_via_create/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/flutter_via_create/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..37dec5708b3 100644 --- a/frb_example/flutter_via_create/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/flutter_via_create/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -189,7 +189,21 @@ class AndroidEnvironment { if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384" + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/flutter_via_integrate/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/flutter_via_integrate/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..37dec5708b3 100644 --- a/frb_example/flutter_via_integrate/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/flutter_via_integrate/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -189,7 +189,21 @@ class AndroidEnvironment { if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384" + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..7f3011dcf07 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,18 +25,17 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", + ); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", + ); } - runCommand(clang, [ - target, - ...args, - ]); + runCommand(clang, [target, ...args]); } /// Full path to Android SDK. @@ -60,9 +59,7 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({ - required String javaHome, - }) { + void installNdk({required String javaHome}) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -73,12 +70,11 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand(sdkManager, [ - '--install', - 'ndk;$ndkVersion', - ], environment: { - 'JAVA_HOME': javaHome, - }); + runCommand( + sdkManager, + ['--install', 'ndk;$ndkVersion'], + environment: {'JAVA_HOME': javaHome}, + ); } Future> buildEnvironment() async { @@ -96,8 +92,10 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = - math.max(target.androidMinSdkVersion!, this.minSdkVersion); + final minSdkVersion = math.max( + target.androidMinSdkVersion!, + this.minSdkVersion, + ); final exe = Platform.isWindows ? '.exe' : ''; @@ -135,15 +133,12 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart')))! + Uri.parse('package:build_tool/buildtool.dart'), + ))! .toFilePath(); - final selfPath = path.canonicalize(path.join( - packagePath, - '..', - '..', - '..', - runRustTool, - )); + final selfPath = path.canonicalize( + path.join(packagePath, '..', '..', '..', runRustTool), + ); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -176,20 +171,36 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File(path.join(workaroundDir, 'libgcc.a')) - .writeAsStringSync('INPUT(-lunwind)'); + File( + path.join(workaroundDir, 'libgcc.a'), + ).writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File(path.join(workaroundDir, 'libunwind.a')) - .writeAsStringSync('INPUT(-lgcc)'); + File( + path.join(workaroundDir, 'libunwind.a'), + ).writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384", + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index e608cece734..735bb85e8a8 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,19 +36,13 @@ class Artifact { } } - Artifact({ - required this.path, - required this.finalFileName, - }); + Artifact({required this.path, required this.finalFileName}); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({ - required this.environment, - required this.userOptions, - }); + ArtifactProvider({required this.environment, required this.userOptions}); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -82,13 +76,15 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ) + ), }; final artifacts = artifactNames - .map((artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - )) + .map( + (artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + ), + ) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -97,7 +93,8 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets) async { + List targets, + ) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -108,13 +105,19 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute(environment.manifestDir, - tempStorage: environment.targetTempDir); + final crateHash = CrateHash.compute( + environment.manifestDir, + tempStorage: environment.targetTempDir, + ); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', + ); - final downloadedArtifactsDir = - path.join(environment.targetTempDir, 'precompiled', crateHash); + final downloadedArtifactsDir = path.join( + environment.targetTempDir, + 'precompiled', + crateHash, + ); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -131,8 +134,10 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -141,10 +146,9 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add(Artifact( - path: downloadedPath, - finalFileName: artifact, - )); + artifactsForTarget.add( + Artifact(path: downloadedPath, finalFileName: artifact), + ); } else { break; } @@ -171,7 +175,8 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', + ); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -195,12 +200,14 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)', + ); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}', + ); return; } _log.fine('Downloading binary from $url'); @@ -210,7 +217,10 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { + precompiledBinaries.publicKey, + res.bodyBytes, + signature.bodyBytes, + )) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -218,10 +228,7 @@ class ArtifactProvider { } } -enum AritifactType { - staticlib, - dylib, -} +enum AritifactType { staticlib, dylib } AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -251,7 +258,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb' + if (!remote) '$libraryName.pdb', ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 6f3b2a4ec11..560a52ef51b 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,16 +24,19 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File(lib.path) - .copySync(path.join(Environment.outputDir, lib.finalFileName)); + File( + lib.path, + ).copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 9956eb364d6..8d74d91e2cf 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,7 +25,8 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }) @@ -33,8 +34,10 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 8a9c0db5def..3034e18b9b5 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, darwinAarch: arch); + platformName: Environment.darwinPlatformName, + darwinAarch: arch, + ); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", [ - '-create', - ...sourceFiles, - '-output', - targetFile, - ]); + runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); } final outputDir = Environment.outputDir; diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 70dfe0eb1af..159cb779a43 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,10 +110,12 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption('target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.') + ..addMultiOption( + 'target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.', + ) ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -181,7 +183,8 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString', + ); } } final targetStrigns = argResults!['target'] as List; @@ -229,9 +232,7 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries( - manifestDir: manifestDir, - ); + final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); await verifyBinaries.run(); } } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart index 3ed949f2c24..ccd9610483f 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,11 +17,7 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { - debug, - release, - profile, -} +enum BuildConfiguration { debug, release, profile } extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -87,15 +83,12 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({ - required bool isAndroid, - }) { - final buildConfiguration = - parseBuildConfiguration(Environment.configuration); - final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, + static BuildEnvironment fromEnvironment({required bool isAndroid}) { + final buildConfiguration = parseBuildConfiguration( + Environment.configuration, ); + final manifestDir = Environment.manifestDir; + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -118,14 +111,9 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({ - required this.target, - required this.environment, - }); + RustBuilder({required this.target, required this.environment}); - void prepare( - Rustup rustup, - ) { + void prepare(Rustup rustup) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -151,30 +139,29 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment(), - ); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment()); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 0c4d88d16b7..8dbfb74ffe9 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,10 +24,7 @@ class CrateHash { )._compute(); } - CrateHash._({ - required this.manifestDir, - required this.tempStorage, - }); + CrateHash._({required this.manifestDir, required this.tempStorage}); String _compute() { final files = getFiles(); diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart index 5edd4fd1848..da1e36342b7 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,11 +37,7 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord( - rec.level, - line, - rec.loggerName, - )); + _log(LogRecord(rec.level, line, rec.loggerName)); } } }); diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart index 22aef1d371c..291683b9dfe 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,32 +47,27 @@ class SourceSpanException implements Exception { } } -enum Toolchain { - stable, - beta, - nightly, -} +enum Toolchain { stable, beta, nightly } class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({ - required this.toolchain, - required this.flags, - }); + CargoBuildOptions({required this.toolchain, required this.flags}); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = - Toolchain.values.firstWhereOrNull((element) => element.name == name); + final toolchain = Toolchain.values.firstWhereOrNull( + (element) => element.name == name, + ); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span, + ); } static CargoBuildOptions parse(YamlNode node) { @@ -97,11 +92,14 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', value.span); + 'Extra flags must be a list of strings', + value.span, + ); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span, + ); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -118,16 +116,15 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({ - required this.uriPrefix, - required this.publicKey, - }); + PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', span); + 'Invalid public key. Must be 32 bytes long.', + span, + ); } return PublicKey(bytes); } @@ -142,33 +139,34 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', urlPrefixNode.span), + 'Invalid URL prefix value.', + urlPrefixNode.span, + ), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => - _publicKeyFromHex(publicKey, publicKeyNode.span), + YamlScalar(value: String publicKey) => _publicKeyFromHex( + publicKey, + publicKeyNode.span, + ), _ => throw SourceSpanException( - 'Invalid public key value.', publicKeyNode.span), + 'Invalid public key value.', + publicKeyNode.span, + ), }; - return PrecompiledBinaries( - uriPrefix: urlPrefix, - publicKey: publicKey, - ); + return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span, + ); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({ - this.cargo = const {}, - this.precompiledBinaries, - }); + CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -191,23 +189,26 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values - .firstWhereOrNull((element) => element.name == name); + final configuration = BuildConfiguration.values.firstWhereOrNull( + (element) => element.name == name, + ); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span, + ); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span, + ); } } return CargokitCrateOptions( @@ -216,9 +217,7 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({ - required String manifestDir, - }) { + static CargokitCrateOptions load({required String manifestDir}) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -260,20 +259,23 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span, + ); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span, + ); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span, + ); } } return CargokitUserOptions( diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 019859c33ad..805af376a05 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,9 +84,7 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, - ); + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -120,8 +118,10 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = - RustBuilder(target: target, environment: buildEnvironment); + final builder = RustBuilder( + target: target, + environment: buildEnvironment, + ); builder.prepare(rustup); final res = await builder.build(); @@ -165,7 +165,8 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', + ); await Future.delayed(Duration(seconds: 2)); } } @@ -189,16 +190,17 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - )); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + ), + ); } return release; } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart index e46722be493..ee48dab6c77 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,10 +9,7 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain( - this.name, - this.targets, - ); + _Toolchain(this.name, this.targets); final String name; final List targets; @@ -27,14 +24,12 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains - .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); + _installedToolchains.add( + _Toolchain(toolchain, _getInstalledTargets(toolchain)), + ); } - void installTarget( - String target, { - required String toolchain, - }) { + void installTarget(String target, {required String toolchain}) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -65,7 +60,8 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), + ) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -88,12 +84,7 @@ class Rustup { .toList(growable: true); return lines - .map( - (name) => _Toolchain( - name, - _getInstalledTargets(name), - ), - ) + .map((name) => _Toolchain(name, _getInstalledTargets(name))) .toList(growable: true); } @@ -120,10 +111,13 @@ class Rustup { return; } // Useful for -Z build-std - runCommand( - "rustup", - ['component', 'add', 'rust-src', '--toolchain', 'nightly'], - ); + runCommand("rustup", [ + 'component', + 'add', + 'rust-src', + '--toolchain', + 'nightly', + ]); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart index 7e9bb250360..5091560468b 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,22 +43,10 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target( - rust: 'x86_64-pc-windows-msvc', - flutter: 'windows-x64', - ), - Target( - rust: 'aarch64-pc-windows-msvc', - flutter: 'windows-arm64', - ), - Target( - rust: 'x86_64-unknown-linux-gnu', - flutter: 'linux-x64', - ), - Target( - rust: 'aarch64-unknown-linux-gnu', - flutter: 'linux-arm64', - ), + Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), + Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), + Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), + Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -110,9 +98,11 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull((element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch); + return all.firstWhereOrNull( + (element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch, + ); } static Target? forRustTriple(String triple) { diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart index 8bb6a8724fb..10ec2a3dba3 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,16 +89,18 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!(TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - )); + final result = testRunCommandOverride!( + TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + ), + ); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 2366b57bfd8..4c4b2879ffb 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,9 +14,7 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({ - required this.manifestDir, - }); + VerifyBinaries({required this.manifestDir}); final String manifestDir; @@ -48,12 +46,15 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = - Uri.parse('$prefix$crateHash/$signatureFileName'); + final signatureUrl = Uri.parse( + '$prefix$crateHash/$signatureFileName', + ); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -68,8 +69,11 @@ class VerifyBinaries { break; } - if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, - signature.bodyBytes)) { + if (!verify( + precompiledBinaries.publicKey, + asset.bodyBytes, + signature.bodyBytes, + )) { stdout.writeln('INVALID SIGNATURE'); ok = false; } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..7f3011dcf07 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,18 +25,17 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", + ); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", + ); } - runCommand(clang, [ - target, - ...args, - ]); + runCommand(clang, [target, ...args]); } /// Full path to Android SDK. @@ -60,9 +59,7 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({ - required String javaHome, - }) { + void installNdk({required String javaHome}) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -73,12 +70,11 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand(sdkManager, [ - '--install', - 'ndk;$ndkVersion', - ], environment: { - 'JAVA_HOME': javaHome, - }); + runCommand( + sdkManager, + ['--install', 'ndk;$ndkVersion'], + environment: {'JAVA_HOME': javaHome}, + ); } Future> buildEnvironment() async { @@ -96,8 +92,10 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = - math.max(target.androidMinSdkVersion!, this.minSdkVersion); + final minSdkVersion = math.max( + target.androidMinSdkVersion!, + this.minSdkVersion, + ); final exe = Platform.isWindows ? '.exe' : ''; @@ -135,15 +133,12 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart')))! + Uri.parse('package:build_tool/buildtool.dart'), + ))! .toFilePath(); - final selfPath = path.canonicalize(path.join( - packagePath, - '..', - '..', - '..', - runRustTool, - )); + final selfPath = path.canonicalize( + path.join(packagePath, '..', '..', '..', runRustTool), + ); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -176,20 +171,36 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File(path.join(workaroundDir, 'libgcc.a')) - .writeAsStringSync('INPUT(-lunwind)'); + File( + path.join(workaroundDir, 'libgcc.a'), + ).writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File(path.join(workaroundDir, 'libunwind.a')) - .writeAsStringSync('INPUT(-lgcc)'); + File( + path.join(workaroundDir, 'libunwind.a'), + ).writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384", + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index e608cece734..735bb85e8a8 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,19 +36,13 @@ class Artifact { } } - Artifact({ - required this.path, - required this.finalFileName, - }); + Artifact({required this.path, required this.finalFileName}); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({ - required this.environment, - required this.userOptions, - }); + ArtifactProvider({required this.environment, required this.userOptions}); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -82,13 +76,15 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ) + ), }; final artifacts = artifactNames - .map((artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - )) + .map( + (artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + ), + ) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -97,7 +93,8 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets) async { + List targets, + ) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -108,13 +105,19 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute(environment.manifestDir, - tempStorage: environment.targetTempDir); + final crateHash = CrateHash.compute( + environment.manifestDir, + tempStorage: environment.targetTempDir, + ); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', + ); - final downloadedArtifactsDir = - path.join(environment.targetTempDir, 'precompiled', crateHash); + final downloadedArtifactsDir = path.join( + environment.targetTempDir, + 'precompiled', + crateHash, + ); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -131,8 +134,10 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -141,10 +146,9 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add(Artifact( - path: downloadedPath, - finalFileName: artifact, - )); + artifactsForTarget.add( + Artifact(path: downloadedPath, finalFileName: artifact), + ); } else { break; } @@ -171,7 +175,8 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', + ); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -195,12 +200,14 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)', + ); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}', + ); return; } _log.fine('Downloading binary from $url'); @@ -210,7 +217,10 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { + precompiledBinaries.publicKey, + res.bodyBytes, + signature.bodyBytes, + )) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -218,10 +228,7 @@ class ArtifactProvider { } } -enum AritifactType { - staticlib, - dylib, -} +enum AritifactType { staticlib, dylib } AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -251,7 +258,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb' + if (!remote) '$libraryName.pdb', ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 6f3b2a4ec11..560a52ef51b 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,16 +24,19 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File(lib.path) - .copySync(path.join(Environment.outputDir, lib.finalFileName)); + File( + lib.path, + ).copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 9956eb364d6..8d74d91e2cf 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,7 +25,8 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }) @@ -33,8 +34,10 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 8a9c0db5def..3034e18b9b5 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, darwinAarch: arch); + platformName: Environment.darwinPlatformName, + darwinAarch: arch, + ); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", [ - '-create', - ...sourceFiles, - '-output', - targetFile, - ]); + runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); } final outputDir = Environment.outputDir; diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 70dfe0eb1af..159cb779a43 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,10 +110,12 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption('target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.') + ..addMultiOption( + 'target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.', + ) ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -181,7 +183,8 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString', + ); } } final targetStrigns = argResults!['target'] as List; @@ -229,9 +232,7 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries( - manifestDir: manifestDir, - ); + final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); await verifyBinaries.run(); } } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart index 3ed949f2c24..ccd9610483f 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,11 +17,7 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { - debug, - release, - profile, -} +enum BuildConfiguration { debug, release, profile } extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -87,15 +83,12 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({ - required bool isAndroid, - }) { - final buildConfiguration = - parseBuildConfiguration(Environment.configuration); - final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, + static BuildEnvironment fromEnvironment({required bool isAndroid}) { + final buildConfiguration = parseBuildConfiguration( + Environment.configuration, ); + final manifestDir = Environment.manifestDir; + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -118,14 +111,9 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({ - required this.target, - required this.environment, - }); + RustBuilder({required this.target, required this.environment}); - void prepare( - Rustup rustup, - ) { + void prepare(Rustup rustup) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -151,30 +139,29 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment(), - ); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment()); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 0c4d88d16b7..8dbfb74ffe9 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,10 +24,7 @@ class CrateHash { )._compute(); } - CrateHash._({ - required this.manifestDir, - required this.tempStorage, - }); + CrateHash._({required this.manifestDir, required this.tempStorage}); String _compute() { final files = getFiles(); diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart index 5edd4fd1848..da1e36342b7 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,11 +37,7 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord( - rec.level, - line, - rec.loggerName, - )); + _log(LogRecord(rec.level, line, rec.loggerName)); } } }); diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart index 22aef1d371c..291683b9dfe 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,32 +47,27 @@ class SourceSpanException implements Exception { } } -enum Toolchain { - stable, - beta, - nightly, -} +enum Toolchain { stable, beta, nightly } class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({ - required this.toolchain, - required this.flags, - }); + CargoBuildOptions({required this.toolchain, required this.flags}); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = - Toolchain.values.firstWhereOrNull((element) => element.name == name); + final toolchain = Toolchain.values.firstWhereOrNull( + (element) => element.name == name, + ); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span, + ); } static CargoBuildOptions parse(YamlNode node) { @@ -97,11 +92,14 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', value.span); + 'Extra flags must be a list of strings', + value.span, + ); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span, + ); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -118,16 +116,15 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({ - required this.uriPrefix, - required this.publicKey, - }); + PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', span); + 'Invalid public key. Must be 32 bytes long.', + span, + ); } return PublicKey(bytes); } @@ -142,33 +139,34 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', urlPrefixNode.span), + 'Invalid URL prefix value.', + urlPrefixNode.span, + ), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => - _publicKeyFromHex(publicKey, publicKeyNode.span), + YamlScalar(value: String publicKey) => _publicKeyFromHex( + publicKey, + publicKeyNode.span, + ), _ => throw SourceSpanException( - 'Invalid public key value.', publicKeyNode.span), + 'Invalid public key value.', + publicKeyNode.span, + ), }; - return PrecompiledBinaries( - uriPrefix: urlPrefix, - publicKey: publicKey, - ); + return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span, + ); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({ - this.cargo = const {}, - this.precompiledBinaries, - }); + CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -191,23 +189,26 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values - .firstWhereOrNull((element) => element.name == name); + final configuration = BuildConfiguration.values.firstWhereOrNull( + (element) => element.name == name, + ); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span, + ); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span, + ); } } return CargokitCrateOptions( @@ -216,9 +217,7 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({ - required String manifestDir, - }) { + static CargokitCrateOptions load({required String manifestDir}) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -260,20 +259,23 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span, + ); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span, + ); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span, + ); } } return CargokitUserOptions( diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 019859c33ad..805af376a05 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,9 +84,7 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, - ); + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -120,8 +118,10 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = - RustBuilder(target: target, environment: buildEnvironment); + final builder = RustBuilder( + target: target, + environment: buildEnvironment, + ); builder.prepare(rustup); final res = await builder.build(); @@ -165,7 +165,8 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', + ); await Future.delayed(Duration(seconds: 2)); } } @@ -189,16 +190,17 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - )); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + ), + ); } return release; } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart index e46722be493..ee48dab6c77 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,10 +9,7 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain( - this.name, - this.targets, - ); + _Toolchain(this.name, this.targets); final String name; final List targets; @@ -27,14 +24,12 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains - .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); + _installedToolchains.add( + _Toolchain(toolchain, _getInstalledTargets(toolchain)), + ); } - void installTarget( - String target, { - required String toolchain, - }) { + void installTarget(String target, {required String toolchain}) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -65,7 +60,8 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), + ) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -88,12 +84,7 @@ class Rustup { .toList(growable: true); return lines - .map( - (name) => _Toolchain( - name, - _getInstalledTargets(name), - ), - ) + .map((name) => _Toolchain(name, _getInstalledTargets(name))) .toList(growable: true); } @@ -120,10 +111,13 @@ class Rustup { return; } // Useful for -Z build-std - runCommand( - "rustup", - ['component', 'add', 'rust-src', '--toolchain', 'nightly'], - ); + runCommand("rustup", [ + 'component', + 'add', + 'rust-src', + '--toolchain', + 'nightly', + ]); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart index 7e9bb250360..5091560468b 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,22 +43,10 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target( - rust: 'x86_64-pc-windows-msvc', - flutter: 'windows-x64', - ), - Target( - rust: 'aarch64-pc-windows-msvc', - flutter: 'windows-arm64', - ), - Target( - rust: 'x86_64-unknown-linux-gnu', - flutter: 'linux-x64', - ), - Target( - rust: 'aarch64-unknown-linux-gnu', - flutter: 'linux-arm64', - ), + Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), + Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), + Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), + Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -110,9 +98,11 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull((element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch); + return all.firstWhereOrNull( + (element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch, + ); } static Target? forRustTriple(String triple) { diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart index 8bb6a8724fb..10ec2a3dba3 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,16 +89,18 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!(TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - )); + final result = testRunCommandOverride!( + TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + ), + ); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 2366b57bfd8..4c4b2879ffb 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,9 +14,7 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({ - required this.manifestDir, - }); + VerifyBinaries({required this.manifestDir}); final String manifestDir; @@ -48,12 +46,15 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = - Uri.parse('$prefix$crateHash/$signatureFileName'); + final signatureUrl = Uri.parse( + '$prefix$crateHash/$signatureFileName', + ); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -68,8 +69,11 @@ class VerifyBinaries { break; } - if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, - signature.bodyBytes)) { + if (!verify( + precompiledBinaries.publicKey, + asset.bodyBytes, + signature.bodyBytes, + )) { stdout.writeln('INVALID SIGNATURE'); ok = false; } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..7f3011dcf07 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,18 +25,17 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", + ); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", + ); } - runCommand(clang, [ - target, - ...args, - ]); + runCommand(clang, [target, ...args]); } /// Full path to Android SDK. @@ -60,9 +59,7 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({ - required String javaHome, - }) { + void installNdk({required String javaHome}) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -73,12 +70,11 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand(sdkManager, [ - '--install', - 'ndk;$ndkVersion', - ], environment: { - 'JAVA_HOME': javaHome, - }); + runCommand( + sdkManager, + ['--install', 'ndk;$ndkVersion'], + environment: {'JAVA_HOME': javaHome}, + ); } Future> buildEnvironment() async { @@ -96,8 +92,10 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = - math.max(target.androidMinSdkVersion!, this.minSdkVersion); + final minSdkVersion = math.max( + target.androidMinSdkVersion!, + this.minSdkVersion, + ); final exe = Platform.isWindows ? '.exe' : ''; @@ -135,15 +133,12 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart')))! + Uri.parse('package:build_tool/buildtool.dart'), + ))! .toFilePath(); - final selfPath = path.canonicalize(path.join( - packagePath, - '..', - '..', - '..', - runRustTool, - )); + final selfPath = path.canonicalize( + path.join(packagePath, '..', '..', '..', runRustTool), + ); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -176,20 +171,36 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File(path.join(workaroundDir, 'libgcc.a')) - .writeAsStringSync('INPUT(-lunwind)'); + File( + path.join(workaroundDir, 'libgcc.a'), + ).writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File(path.join(workaroundDir, 'libunwind.a')) - .writeAsStringSync('INPUT(-lgcc)'); + File( + path.join(workaroundDir, 'libunwind.a'), + ).writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384", + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index e608cece734..735bb85e8a8 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,19 +36,13 @@ class Artifact { } } - Artifact({ - required this.path, - required this.finalFileName, - }); + Artifact({required this.path, required this.finalFileName}); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({ - required this.environment, - required this.userOptions, - }); + ArtifactProvider({required this.environment, required this.userOptions}); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -82,13 +76,15 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ) + ), }; final artifacts = artifactNames - .map((artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - )) + .map( + (artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + ), + ) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -97,7 +93,8 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets) async { + List targets, + ) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -108,13 +105,19 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute(environment.manifestDir, - tempStorage: environment.targetTempDir); + final crateHash = CrateHash.compute( + environment.manifestDir, + tempStorage: environment.targetTempDir, + ); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', + ); - final downloadedArtifactsDir = - path.join(environment.targetTempDir, 'precompiled', crateHash); + final downloadedArtifactsDir = path.join( + environment.targetTempDir, + 'precompiled', + crateHash, + ); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -131,8 +134,10 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -141,10 +146,9 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add(Artifact( - path: downloadedPath, - finalFileName: artifact, - )); + artifactsForTarget.add( + Artifact(path: downloadedPath, finalFileName: artifact), + ); } else { break; } @@ -171,7 +175,8 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', + ); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -195,12 +200,14 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)', + ); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}', + ); return; } _log.fine('Downloading binary from $url'); @@ -210,7 +217,10 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { + precompiledBinaries.publicKey, + res.bodyBytes, + signature.bodyBytes, + )) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -218,10 +228,7 @@ class ArtifactProvider { } } -enum AritifactType { - staticlib, - dylib, -} +enum AritifactType { staticlib, dylib } AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -251,7 +258,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb' + if (!remote) '$libraryName.pdb', ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 6f3b2a4ec11..560a52ef51b 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,16 +24,19 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File(lib.path) - .copySync(path.join(Environment.outputDir, lib.finalFileName)); + File( + lib.path, + ).copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 9956eb364d6..8d74d91e2cf 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,7 +25,8 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }) @@ -33,8 +34,10 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 8a9c0db5def..3034e18b9b5 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, darwinAarch: arch); + platformName: Environment.darwinPlatformName, + darwinAarch: arch, + ); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", [ - '-create', - ...sourceFiles, - '-output', - targetFile, - ]); + runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); } final outputDir = Environment.outputDir; diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 70dfe0eb1af..159cb779a43 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,10 +110,12 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption('target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.') + ..addMultiOption( + 'target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.', + ) ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -181,7 +183,8 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString', + ); } } final targetStrigns = argResults!['target'] as List; @@ -229,9 +232,7 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries( - manifestDir: manifestDir, - ); + final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); await verifyBinaries.run(); } } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart index 3ed949f2c24..ccd9610483f 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,11 +17,7 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { - debug, - release, - profile, -} +enum BuildConfiguration { debug, release, profile } extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -87,15 +83,12 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({ - required bool isAndroid, - }) { - final buildConfiguration = - parseBuildConfiguration(Environment.configuration); - final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, + static BuildEnvironment fromEnvironment({required bool isAndroid}) { + final buildConfiguration = parseBuildConfiguration( + Environment.configuration, ); + final manifestDir = Environment.manifestDir; + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -118,14 +111,9 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({ - required this.target, - required this.environment, - }); + RustBuilder({required this.target, required this.environment}); - void prepare( - Rustup rustup, - ) { + void prepare(Rustup rustup) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -151,30 +139,29 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment(), - ); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment()); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 0c4d88d16b7..8dbfb74ffe9 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,10 +24,7 @@ class CrateHash { )._compute(); } - CrateHash._({ - required this.manifestDir, - required this.tempStorage, - }); + CrateHash._({required this.manifestDir, required this.tempStorage}); String _compute() { final files = getFiles(); diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart index 5edd4fd1848..da1e36342b7 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,11 +37,7 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord( - rec.level, - line, - rec.loggerName, - )); + _log(LogRecord(rec.level, line, rec.loggerName)); } } }); diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart index 22aef1d371c..291683b9dfe 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,32 +47,27 @@ class SourceSpanException implements Exception { } } -enum Toolchain { - stable, - beta, - nightly, -} +enum Toolchain { stable, beta, nightly } class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({ - required this.toolchain, - required this.flags, - }); + CargoBuildOptions({required this.toolchain, required this.flags}); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = - Toolchain.values.firstWhereOrNull((element) => element.name == name); + final toolchain = Toolchain.values.firstWhereOrNull( + (element) => element.name == name, + ); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span, + ); } static CargoBuildOptions parse(YamlNode node) { @@ -97,11 +92,14 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', value.span); + 'Extra flags must be a list of strings', + value.span, + ); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span, + ); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -118,16 +116,15 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({ - required this.uriPrefix, - required this.publicKey, - }); + PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', span); + 'Invalid public key. Must be 32 bytes long.', + span, + ); } return PublicKey(bytes); } @@ -142,33 +139,34 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', urlPrefixNode.span), + 'Invalid URL prefix value.', + urlPrefixNode.span, + ), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => - _publicKeyFromHex(publicKey, publicKeyNode.span), + YamlScalar(value: String publicKey) => _publicKeyFromHex( + publicKey, + publicKeyNode.span, + ), _ => throw SourceSpanException( - 'Invalid public key value.', publicKeyNode.span), + 'Invalid public key value.', + publicKeyNode.span, + ), }; - return PrecompiledBinaries( - uriPrefix: urlPrefix, - publicKey: publicKey, - ); + return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span, + ); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({ - this.cargo = const {}, - this.precompiledBinaries, - }); + CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -191,23 +189,26 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values - .firstWhereOrNull((element) => element.name == name); + final configuration = BuildConfiguration.values.firstWhereOrNull( + (element) => element.name == name, + ); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span, + ); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span, + ); } } return CargokitCrateOptions( @@ -216,9 +217,7 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({ - required String manifestDir, - }) { + static CargokitCrateOptions load({required String manifestDir}) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -260,20 +259,23 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span, + ); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span, + ); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span, + ); } } return CargokitUserOptions( diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 019859c33ad..805af376a05 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,9 +84,7 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, - ); + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -120,8 +118,10 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = - RustBuilder(target: target, environment: buildEnvironment); + final builder = RustBuilder( + target: target, + environment: buildEnvironment, + ); builder.prepare(rustup); final res = await builder.build(); @@ -165,7 +165,8 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', + ); await Future.delayed(Duration(seconds: 2)); } } @@ -189,16 +190,17 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - )); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + ), + ); } return release; } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart index e46722be493..ee48dab6c77 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,10 +9,7 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain( - this.name, - this.targets, - ); + _Toolchain(this.name, this.targets); final String name; final List targets; @@ -27,14 +24,12 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains - .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); + _installedToolchains.add( + _Toolchain(toolchain, _getInstalledTargets(toolchain)), + ); } - void installTarget( - String target, { - required String toolchain, - }) { + void installTarget(String target, {required String toolchain}) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -65,7 +60,8 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), + ) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -88,12 +84,7 @@ class Rustup { .toList(growable: true); return lines - .map( - (name) => _Toolchain( - name, - _getInstalledTargets(name), - ), - ) + .map((name) => _Toolchain(name, _getInstalledTargets(name))) .toList(growable: true); } @@ -120,10 +111,13 @@ class Rustup { return; } // Useful for -Z build-std - runCommand( - "rustup", - ['component', 'add', 'rust-src', '--toolchain', 'nightly'], - ); + runCommand("rustup", [ + 'component', + 'add', + 'rust-src', + '--toolchain', + 'nightly', + ]); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart index 7e9bb250360..5091560468b 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,22 +43,10 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target( - rust: 'x86_64-pc-windows-msvc', - flutter: 'windows-x64', - ), - Target( - rust: 'aarch64-pc-windows-msvc', - flutter: 'windows-arm64', - ), - Target( - rust: 'x86_64-unknown-linux-gnu', - flutter: 'linux-x64', - ), - Target( - rust: 'aarch64-unknown-linux-gnu', - flutter: 'linux-arm64', - ), + Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), + Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), + Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), + Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -110,9 +98,11 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull((element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch); + return all.firstWhereOrNull( + (element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch, + ); } static Target? forRustTriple(String triple) { diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart index 8bb6a8724fb..10ec2a3dba3 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,16 +89,18 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!(TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - )); + final result = testRunCommandOverride!( + TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + ), + ); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 2366b57bfd8..4c4b2879ffb 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,9 +14,7 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({ - required this.manifestDir, - }); + VerifyBinaries({required this.manifestDir}); final String manifestDir; @@ -48,12 +46,15 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = - Uri.parse('$prefix$crateHash/$signatureFileName'); + final signatureUrl = Uri.parse( + '$prefix$crateHash/$signatureFileName', + ); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -68,8 +69,11 @@ class VerifyBinaries { break; } - if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, - signature.bodyBytes)) { + if (!verify( + precompiledBinaries.publicKey, + asset.bodyBytes, + signature.bodyBytes, + )) { stdout.writeln('INVALID SIGNATURE'); ok = false; } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 15fc9eedacc..7f3011dcf07 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,18 +25,17 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", + ); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", + ); } - runCommand(clang, [ - target, - ...args, - ]); + runCommand(clang, [target, ...args]); } /// Full path to Android SDK. @@ -60,9 +59,7 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({ - required String javaHome, - }) { + void installNdk({required String javaHome}) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -73,12 +70,11 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand(sdkManager, [ - '--install', - 'ndk;$ndkVersion', - ], environment: { - 'JAVA_HOME': javaHome, - }); + runCommand( + sdkManager, + ['--install', 'ndk;$ndkVersion'], + environment: {'JAVA_HOME': javaHome}, + ); } Future> buildEnvironment() async { @@ -96,8 +92,10 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = - math.max(target.androidMinSdkVersion!, this.minSdkVersion); + final minSdkVersion = math.max( + target.androidMinSdkVersion!, + this.minSdkVersion, + ); final exe = Platform.isWindows ? '.exe' : ''; @@ -135,15 +133,12 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart')))! + Uri.parse('package:build_tool/buildtool.dart'), + ))! .toFilePath(); - final selfPath = path.canonicalize(path.join( - packagePath, - '..', - '..', - '..', - runRustTool, - )); + final selfPath = path.canonicalize( + path.join(packagePath, '..', '..', '..', runRustTool), + ); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -176,20 +171,36 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File(path.join(workaroundDir, 'libgcc.a')) - .writeAsStringSync('INPUT(-lunwind)'); + File( + path.join(workaroundDir, 'libgcc.a'), + ).writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File(path.join(workaroundDir, 'libunwind.a')) - .writeAsStringSync('INPUT(-lgcc)'); + File( + path.join(workaroundDir, 'libunwind.a'), + ).writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; if (rustFlags.isNotEmpty) { rustFlags = '$rustFlags\x1f'; } - rustFlags = '$rustFlags-L\x1f$workaroundDir'; + if (["arm64-v8a", "x86_64"].contains(target.android)) { + rustFlags = '$rustFlags-L\x1f$workaroundDir\x1f'; + + const pageSizeArgs = [ + "-C", + "link-arg=-Wl,--hash-style=both", + "-C", + "link-arg=-Wl,-z,max-page-size=16384", + ]; + final pageSizeArgsString = pageSizeArgs.join("\x1f"); + + rustFlags = '$rustFlags$pageSizeArgsString'; + } else { + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + } return rustFlags; } } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index e608cece734..735bb85e8a8 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,19 +36,13 @@ class Artifact { } } - Artifact({ - required this.path, - required this.finalFileName, - }); + Artifact({required this.path, required this.finalFileName}); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({ - required this.environment, - required this.userOptions, - }); + ArtifactProvider({required this.environment, required this.userOptions}); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -82,13 +76,15 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ) + ), }; final artifacts = artifactNames - .map((artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - )) + .map( + (artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + ), + ) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -97,7 +93,8 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets) async { + List targets, + ) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -108,13 +105,19 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute(environment.manifestDir, - tempStorage: environment.targetTempDir); + final crateHash = CrateHash.compute( + environment.manifestDir, + tempStorage: environment.targetTempDir, + ); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', + ); - final downloadedArtifactsDir = - path.join(environment.targetTempDir, 'precompiled', crateHash); + final downloadedArtifactsDir = path.join( + environment.targetTempDir, + 'precompiled', + crateHash, + ); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -131,8 +134,10 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -141,10 +146,9 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add(Artifact( - path: downloadedPath, - finalFileName: artifact, - )); + artifactsForTarget.add( + Artifact(path: downloadedPath, finalFileName: artifact), + ); } else { break; } @@ -171,7 +175,8 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', + ); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -195,12 +200,14 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)', + ); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}', + ); return; } _log.fine('Downloading binary from $url'); @@ -210,7 +217,10 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { + precompiledBinaries.publicKey, + res.bodyBytes, + signature.bodyBytes, + )) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -218,10 +228,7 @@ class ArtifactProvider { } } -enum AritifactType { - staticlib, - dylib, -} +enum AritifactType { staticlib, dylib } AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -251,7 +258,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb' + if (!remote) '$libraryName.pdb', ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 6f3b2a4ec11..560a52ef51b 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,16 +24,19 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File(lib.path) - .copySync(path.join(Environment.outputDir, lib.finalFileName)); + File( + lib.path, + ).copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 9956eb364d6..8d74d91e2cf 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,7 +25,8 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }) @@ -33,8 +34,10 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 8a9c0db5def..3034e18b9b5 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, darwinAarch: arch); + platformName: Environment.darwinPlatformName, + darwinAarch: arch, + ); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", + ); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = - ArtifactProvider(environment: environment, userOptions: userOptions); + final provider = ArtifactProvider( + environment: environment, + userOptions: userOptions, + ); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", [ - '-create', - ...sourceFiles, - '-output', - targetFile, - ]); + runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); } final outputDir = Environment.outputDir; diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 70dfe0eb1af..159cb779a43 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,10 +110,12 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption('target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.') + ..addMultiOption( + 'target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.', + ) ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -181,7 +183,8 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString', + ); } } final targetStrigns = argResults!['target'] as List; @@ -229,9 +232,7 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries( - manifestDir: manifestDir, - ); + final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); await verifyBinaries.run(); } } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart index 3ed949f2c24..ccd9610483f 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,11 +17,7 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { - debug, - release, - profile, -} +enum BuildConfiguration { debug, release, profile } extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -87,15 +83,12 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({ - required bool isAndroid, - }) { - final buildConfiguration = - parseBuildConfiguration(Environment.configuration); - final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, + static BuildEnvironment fromEnvironment({required bool isAndroid}) { + final buildConfiguration = parseBuildConfiguration( + Environment.configuration, ); + final manifestDir = Environment.manifestDir; + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -118,14 +111,9 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({ - required this.target, - required this.environment, - }); + RustBuilder({required this.target, required this.environment}); - void prepare( - Rustup rustup, - ) { + void prepare(Rustup rustup) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -151,30 +139,29 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment(), - ); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment()); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 0c4d88d16b7..8dbfb74ffe9 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,10 +24,7 @@ class CrateHash { )._compute(); } - CrateHash._({ - required this.manifestDir, - required this.tempStorage, - }); + CrateHash._({required this.manifestDir, required this.tempStorage}); String _compute() { final files = getFiles(); diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart index 5edd4fd1848..da1e36342b7 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,11 +37,7 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord( - rec.level, - line, - rec.loggerName, - )); + _log(LogRecord(rec.level, line, rec.loggerName)); } } }); diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart index 22aef1d371c..291683b9dfe 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,32 +47,27 @@ class SourceSpanException implements Exception { } } -enum Toolchain { - stable, - beta, - nightly, -} +enum Toolchain { stable, beta, nightly } class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({ - required this.toolchain, - required this.flags, - }); + CargoBuildOptions({required this.toolchain, required this.flags}); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = - Toolchain.values.firstWhereOrNull((element) => element.name == name); + final toolchain = Toolchain.values.firstWhereOrNull( + (element) => element.name == name, + ); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span, + ); } static CargoBuildOptions parse(YamlNode node) { @@ -97,11 +92,14 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', value.span); + 'Extra flags must be a list of strings', + value.span, + ); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span, + ); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -118,16 +116,15 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({ - required this.uriPrefix, - required this.publicKey, - }); + PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', span); + 'Invalid public key. Must be 32 bytes long.', + span, + ); } return PublicKey(bytes); } @@ -142,33 +139,34 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', urlPrefixNode.span), + 'Invalid URL prefix value.', + urlPrefixNode.span, + ), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => - _publicKeyFromHex(publicKey, publicKeyNode.span), + YamlScalar(value: String publicKey) => _publicKeyFromHex( + publicKey, + publicKeyNode.span, + ), _ => throw SourceSpanException( - 'Invalid public key value.', publicKeyNode.span), + 'Invalid public key value.', + publicKeyNode.span, + ), }; - return PrecompiledBinaries( - uriPrefix: urlPrefix, - publicKey: publicKey, - ); + return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span, + ); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({ - this.cargo = const {}, - this.precompiledBinaries, - }); + CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -191,23 +189,26 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values - .firstWhereOrNull((element) => element.name == name); + final configuration = BuildConfiguration.values.firstWhereOrNull( + (element) => element.name == name, + ); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span, + ); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span, + ); } } return CargokitCrateOptions( @@ -216,9 +217,7 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({ - required String manifestDir, - }) { + static CargokitCrateOptions load({required String manifestDir}) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -260,20 +259,23 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span, + ); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span, + ); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span, + ); } } return CargokitUserOptions( diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 019859c33ad..805af376a05 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,9 +84,7 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load( - manifestDir: manifestDir, - ); + final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -120,8 +118,10 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = - RustBuilder(target: target, environment: buildEnvironment); + final builder = RustBuilder( + target: target, + environment: buildEnvironment, + ); builder.prepare(rustup); final res = await builder.build(); @@ -165,7 +165,8 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', + ); await Future.delayed(Duration(seconds: 2)); } } @@ -189,16 +190,17 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - )); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + ), + ); } return release; } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart index e46722be493..ee48dab6c77 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,10 +9,7 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain( - this.name, - this.targets, - ); + _Toolchain(this.name, this.targets); final String name; final List targets; @@ -27,14 +24,12 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains - .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); + _installedToolchains.add( + _Toolchain(toolchain, _getInstalledTargets(toolchain)), + ); } - void installTarget( - String target, { - required String toolchain, - }) { + void installTarget(String target, {required String toolchain}) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -65,7 +60,8 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), + ) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -88,12 +84,7 @@ class Rustup { .toList(growable: true); return lines - .map( - (name) => _Toolchain( - name, - _getInstalledTargets(name), - ), - ) + .map((name) => _Toolchain(name, _getInstalledTargets(name))) .toList(growable: true); } @@ -120,10 +111,13 @@ class Rustup { return; } // Useful for -Z build-std - runCommand( - "rustup", - ['component', 'add', 'rust-src', '--toolchain', 'nightly'], - ); + runCommand("rustup", [ + 'component', + 'add', + 'rust-src', + '--toolchain', + 'nightly', + ]); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart index 7e9bb250360..5091560468b 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,22 +43,10 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target( - rust: 'x86_64-pc-windows-msvc', - flutter: 'windows-x64', - ), - Target( - rust: 'aarch64-pc-windows-msvc', - flutter: 'windows-arm64', - ), - Target( - rust: 'x86_64-unknown-linux-gnu', - flutter: 'linux-x64', - ), - Target( - rust: 'aarch64-unknown-linux-gnu', - flutter: 'linux-arm64', - ), + Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), + Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), + Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), + Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -110,9 +98,11 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull((element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch); + return all.firstWhereOrNull( + (element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch, + ); } static Target? forRustTriple(String triple) { diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart index 8bb6a8724fb..10ec2a3dba3 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,16 +89,18 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!(TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - )); + final result = testRunCommandOverride!( + TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + ), + ); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 2366b57bfd8..4c4b2879ffb 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,9 +14,7 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({ - required this.manifestDir, - }); + VerifyBinaries({required this.manifestDir}); final String manifestDir; @@ -48,12 +46,15 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = - PrecompileBinaries.signatureFileName(target, artifact); + final signatureFileName = PrecompileBinaries.signatureFileName( + target, + artifact, + ); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = - Uri.parse('$prefix$crateHash/$signatureFileName'); + final signatureUrl = Uri.parse( + '$prefix$crateHash/$signatureFileName', + ); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -68,8 +69,11 @@ class VerifyBinaries { break; } - if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, - signature.bodyBytes)) { + if (!verify( + precompiledBinaries.publicKey, + asset.bodyBytes, + signature.bodyBytes, + )) { stdout.writeln('INVALID SIGNATURE'); ok = false; } From 669d1e356be1b6496d0829faba731bf362025e8e Mon Sep 17 00:00:00 2001 From: fzyzcjy Date: Sat, 6 Jun 2026 01:28:27 +0800 Subject: [PATCH 2/3] Sync CargoKit example copies --- .../lib/src/android_environment.dart | 57 +++++----- .../lib/src/artifacts_provider.dart | 75 ++++++------- .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 ++- .../cargokit/build_tool/lib/src/builder.dart | 75 +++++++------ .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 +++-- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- .../lib/src/android_environment.dart | 57 +++++----- .../lib/src/artifacts_provider.dart | 75 ++++++------- .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 ++- .../cargokit/build_tool/lib/src/builder.dart | 75 +++++++------ .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 +++-- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- .../lib/src/android_environment.dart | 57 +++++----- .../lib/src/artifacts_provider.dart | 75 ++++++------- .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 ++- .../cargokit/build_tool/lib/src/builder.dart | 75 +++++++------ .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 +++-- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- .../lib/src/android_environment.dart | 57 +++++----- .../lib/src/artifacts_provider.dart | 75 ++++++------- .../build_tool/lib/src/build_cmake.dart | 11 +- .../build_tool/lib/src/build_gradle.dart | 9 +- .../build_tool/lib/src/build_pod.dart | 20 ++-- .../build_tool/lib/src/build_tool.dart | 17 ++- .../cargokit/build_tool/lib/src/builder.dart | 75 +++++++------ .../build_tool/lib/src/crate_hash.dart | 5 +- .../cargokit/build_tool/lib/src/logging.dart | 6 +- .../cargokit/build_tool/lib/src/options.dart | 104 +++++++++--------- .../lib/src/precompile_binaries.dart | 34 +++--- .../cargokit/build_tool/lib/src/rustup.dart | 36 +++--- .../cargokit/build_tool/lib/src/target.dart | 28 +++-- .../cargokit/build_tool/lib/src/util.dart | 22 ++-- .../build_tool/lib/src/verify_binaries.dart | 22 ++-- 60 files changed, 1072 insertions(+), 1012 deletions(-) diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 7f3011dcf07..37dec5708b3 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,17 +25,18 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); } - runCommand(clang, [target, ...args]); + runCommand(clang, [ + target, + ...args, + ]); } /// Full path to Android SDK. @@ -59,7 +60,9 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({required String javaHome}) { + void installNdk({ + required String javaHome, + }) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -70,11 +73,12 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand( - sdkManager, - ['--install', 'ndk;$ndkVersion'], - environment: {'JAVA_HOME': javaHome}, - ); + runCommand(sdkManager, [ + '--install', + 'ndk;$ndkVersion', + ], environment: { + 'JAVA_HOME': javaHome, + }); } Future> buildEnvironment() async { @@ -92,10 +96,8 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = math.max( - target.androidMinSdkVersion!, - this.minSdkVersion, - ); + final minSdkVersion = + math.max(target.androidMinSdkVersion!, this.minSdkVersion); final exe = Platform.isWindows ? '.exe' : ''; @@ -133,12 +135,15 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart'), - ))! + Uri.parse('package:build_tool/buildtool.dart')))! .toFilePath(); - final selfPath = path.canonicalize( - path.join(packagePath, '..', '..', '..', runRustTool), - ); + final selfPath = path.canonicalize(path.join( + packagePath, + '..', + '..', + '..', + runRustTool, + )); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -171,15 +176,13 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File( - path.join(workaroundDir, 'libgcc.a'), - ).writeAsStringSync('INPUT(-lunwind)'); + File(path.join(workaroundDir, 'libgcc.a')) + .writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File( - path.join(workaroundDir, 'libunwind.a'), - ).writeAsStringSync('INPUT(-lgcc)'); + File(path.join(workaroundDir, 'libunwind.a')) + .writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; @@ -193,7 +196,7 @@ class AndroidEnvironment { "-C", "link-arg=-Wl,--hash-style=both", "-C", - "link-arg=-Wl,-z,max-page-size=16384", + "link-arg=-Wl,-z,max-page-size=16384" ]; final pageSizeArgsString = pageSizeArgs.join("\x1f"); diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index 735bb85e8a8..e608cece734 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,13 +36,19 @@ class Artifact { } } - Artifact({required this.path, required this.finalFileName}); + Artifact({ + required this.path, + required this.finalFileName, + }); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({required this.environment, required this.userOptions}); + ArtifactProvider({ + required this.environment, + required this.userOptions, + }); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -76,15 +82,13 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ), + ) }; final artifacts = artifactNames - .map( - (artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - ), - ) + .map((artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + )) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -93,8 +97,7 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets, - ) async { + List targets) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -105,19 +108,13 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute( - environment.manifestDir, - tempStorage: environment.targetTempDir, - ); + final crateHash = CrateHash.compute(environment.manifestDir, + tempStorage: environment.targetTempDir); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', - ); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); - final downloadedArtifactsDir = path.join( - environment.targetTempDir, - 'precompiled', - crateHash, - ); + final downloadedArtifactsDir = + path.join(environment.targetTempDir, 'precompiled', crateHash); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -134,10 +131,8 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -146,9 +141,10 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add( - Artifact(path: downloadedPath, finalFileName: artifact), - ); + artifactsForTarget.add(Artifact( + path: downloadedPath, + finalFileName: artifact, + )); } else { break; } @@ -175,8 +171,7 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', - ); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -200,14 +195,12 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)', - ); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}', - ); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); return; } _log.fine('Downloading binary from $url'); @@ -217,10 +210,7 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, - res.bodyBytes, - signature.bodyBytes, - )) { + precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -228,7 +218,10 @@ class ArtifactProvider { } } -enum AritifactType { staticlib, dylib } +enum AritifactType { + staticlib, + dylib, +} AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -258,7 +251,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb', + if (!remote) '$libraryName.pdb' ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 560a52ef51b..6f3b2a4ec11 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,19 +24,16 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File( - lib.path, - ).copySync(path.join(Environment.outputDir, lib.finalFileName)); + File(lib.path) + .copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 8d74d91e2cf..9956eb364d6 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,8 +25,7 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }) @@ -34,10 +33,8 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 3034e18b9b5..8a9c0db5def 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, - darwinAarch: arch, - ); + platformName: Environment.darwinPlatformName, darwinAarch: arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); + runCommand("lipo", [ + '-create', + ...sourceFiles, + '-output', + targetFile, + ]); } final outputDir = Environment.outputDir; diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 159cb779a43..70dfe0eb1af 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,12 +110,10 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption( - 'target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.', - ) + ..addMultiOption('target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.') ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -183,8 +181,7 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString', - ); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); } } final targetStrigns = argResults!['target'] as List; @@ -232,7 +229,9 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); + final verifyBinaries = VerifyBinaries( + manifestDir: manifestDir, + ); await verifyBinaries.run(); } } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart index ccd9610483f..3ed949f2c24 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,7 +17,11 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { debug, release, profile } +enum BuildConfiguration { + debug, + release, + profile, +} extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -83,12 +87,15 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({required bool isAndroid}) { - final buildConfiguration = parseBuildConfiguration( - Environment.configuration, - ); + static BuildEnvironment fromEnvironment({ + required bool isAndroid, + }) { + final buildConfiguration = + parseBuildConfiguration(Environment.configuration); final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -111,9 +118,14 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({required this.target, required this.environment}); + RustBuilder({ + required this.target, + required this.environment, + }); - void prepare(Rustup rustup) { + void prepare( + Rustup rustup, + ) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -139,29 +151,30 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment()); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment(), + ); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 8dbfb74ffe9..0c4d88d16b7 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,7 +24,10 @@ class CrateHash { )._compute(); } - CrateHash._({required this.manifestDir, required this.tempStorage}); + CrateHash._({ + required this.manifestDir, + required this.tempStorage, + }); String _compute() { final files = getFiles(); diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart index da1e36342b7..5edd4fd1848 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,7 +37,11 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord(rec.level, line, rec.loggerName)); + _log(LogRecord( + rec.level, + line, + rec.loggerName, + )); } } }); diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart index 291683b9dfe..22aef1d371c 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,27 +47,32 @@ class SourceSpanException implements Exception { } } -enum Toolchain { stable, beta, nightly } +enum Toolchain { + stable, + beta, + nightly, +} class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({required this.toolchain, required this.flags}); + CargoBuildOptions({ + required this.toolchain, + required this.flags, + }); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = Toolchain.values.firstWhereOrNull( - (element) => element.name == name, - ); + final toolchain = + Toolchain.values.firstWhereOrNull((element) => element.name == name); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span, - ); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span); } static CargoBuildOptions parse(YamlNode node) { @@ -92,14 +97,11 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', - value.span, - ); + 'Extra flags must be a list of strings', value.span); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span, - ); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -116,15 +118,16 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); + PrecompiledBinaries({ + required this.uriPrefix, + required this.publicKey, + }); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', - span, - ); + 'Invalid public key. Must be 32 bytes long.', span); } return PublicKey(bytes); } @@ -139,34 +142,33 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', - urlPrefixNode.span, - ), + 'Invalid URL prefix value.', urlPrefixNode.span), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => _publicKeyFromHex( - publicKey, - publicKeyNode.span, - ), + YamlScalar(value: String publicKey) => + _publicKeyFromHex(publicKey, publicKeyNode.span), _ => throw SourceSpanException( - 'Invalid public key value.', - publicKeyNode.span, - ), + 'Invalid public key value.', publicKeyNode.span), }; - return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); + return PrecompiledBinaries( + uriPrefix: urlPrefix, + publicKey: publicKey, + ); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span, - ); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); + CargokitCrateOptions({ + this.cargo = const {}, + this.precompiledBinaries, + }); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -189,26 +191,23 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values.firstWhereOrNull( - (element) => element.name == name, - ); + final configuration = BuildConfiguration.values + .firstWhereOrNull((element) => element.name == name); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span, - ); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span); } } return CargokitCrateOptions( @@ -217,7 +216,9 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({required String manifestDir}) { + static CargokitCrateOptions load({ + required String manifestDir, + }) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -259,23 +260,20 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span); } } return CargokitUserOptions( diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 805af376a05..019859c33ad 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,7 +84,9 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -118,10 +120,8 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = RustBuilder( - target: target, - environment: buildEnvironment, - ); + final builder = + RustBuilder(target: target, environment: buildEnvironment); builder.prepare(rustup); final res = await builder.build(); @@ -165,8 +165,7 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', - ); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); await Future.delayed(Duration(seconds: 2)); } } @@ -190,17 +189,16 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - ), - ); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + )); } return release; } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart index ee48dab6c77..e46722be493 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,7 +9,10 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain(this.name, this.targets); + _Toolchain( + this.name, + this.targets, + ); final String name; final List targets; @@ -24,12 +27,14 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains.add( - _Toolchain(toolchain, _getInstalledTargets(toolchain)), - ); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); } - void installTarget(String target, {required String toolchain}) { + void installTarget( + String target, { + required String toolchain, + }) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -60,8 +65,7 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), - ) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -84,7 +88,12 @@ class Rustup { .toList(growable: true); return lines - .map((name) => _Toolchain(name, _getInstalledTargets(name))) + .map( + (name) => _Toolchain( + name, + _getInstalledTargets(name), + ), + ) .toList(growable: true); } @@ -111,13 +120,10 @@ class Rustup { return; } // Useful for -Z build-std - runCommand("rustup", [ - 'component', - 'add', - 'rust-src', - '--toolchain', - 'nightly', - ]); + runCommand( + "rustup", + ['component', 'add', 'rust-src', '--toolchain', 'nightly'], + ); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart index 5091560468b..7e9bb250360 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,10 +43,22 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), - Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), - Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), - Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), + Target( + rust: 'x86_64-pc-windows-msvc', + flutter: 'windows-x64', + ), + Target( + rust: 'aarch64-pc-windows-msvc', + flutter: 'windows-arm64', + ), + Target( + rust: 'x86_64-unknown-linux-gnu', + flutter: 'linux-x64', + ), + Target( + rust: 'aarch64-unknown-linux-gnu', + flutter: 'linux-arm64', + ), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -98,11 +110,9 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull( - (element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch, - ); + return all.firstWhereOrNull((element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch); } static Target? forRustTriple(String triple) { diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart index 10ec2a3dba3..8bb6a8724fb 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,18 +89,16 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!( - TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - ), - ); + final result = testRunCommandOverride!(TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + )); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 4c4b2879ffb..2366b57bfd8 100644 --- a/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/gallery/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,7 +14,9 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({required this.manifestDir}); + VerifyBinaries({ + required this.manifestDir, + }); final String manifestDir; @@ -46,15 +48,12 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = Uri.parse( - '$prefix$crateHash/$signatureFileName', - ); + final signatureUrl = + Uri.parse('$prefix$crateHash/$signatureFileName'); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -69,11 +68,8 @@ class VerifyBinaries { break; } - if (!verify( - precompiledBinaries.publicKey, - asset.bodyBytes, - signature.bodyBytes, - )) { + if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, + signature.bodyBytes)) { stdout.writeln('INVALID SIGNATURE'); ok = false; } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 7f3011dcf07..37dec5708b3 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,17 +25,18 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); } - runCommand(clang, [target, ...args]); + runCommand(clang, [ + target, + ...args, + ]); } /// Full path to Android SDK. @@ -59,7 +60,9 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({required String javaHome}) { + void installNdk({ + required String javaHome, + }) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -70,11 +73,12 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand( - sdkManager, - ['--install', 'ndk;$ndkVersion'], - environment: {'JAVA_HOME': javaHome}, - ); + runCommand(sdkManager, [ + '--install', + 'ndk;$ndkVersion', + ], environment: { + 'JAVA_HOME': javaHome, + }); } Future> buildEnvironment() async { @@ -92,10 +96,8 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = math.max( - target.androidMinSdkVersion!, - this.minSdkVersion, - ); + final minSdkVersion = + math.max(target.androidMinSdkVersion!, this.minSdkVersion); final exe = Platform.isWindows ? '.exe' : ''; @@ -133,12 +135,15 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart'), - ))! + Uri.parse('package:build_tool/buildtool.dart')))! .toFilePath(); - final selfPath = path.canonicalize( - path.join(packagePath, '..', '..', '..', runRustTool), - ); + final selfPath = path.canonicalize(path.join( + packagePath, + '..', + '..', + '..', + runRustTool, + )); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -171,15 +176,13 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File( - path.join(workaroundDir, 'libgcc.a'), - ).writeAsStringSync('INPUT(-lunwind)'); + File(path.join(workaroundDir, 'libgcc.a')) + .writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File( - path.join(workaroundDir, 'libunwind.a'), - ).writeAsStringSync('INPUT(-lgcc)'); + File(path.join(workaroundDir, 'libunwind.a')) + .writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; @@ -193,7 +196,7 @@ class AndroidEnvironment { "-C", "link-arg=-Wl,--hash-style=both", "-C", - "link-arg=-Wl,-z,max-page-size=16384", + "link-arg=-Wl,-z,max-page-size=16384" ]; final pageSizeArgsString = pageSizeArgs.join("\x1f"); diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index 735bb85e8a8..e608cece734 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,13 +36,19 @@ class Artifact { } } - Artifact({required this.path, required this.finalFileName}); + Artifact({ + required this.path, + required this.finalFileName, + }); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({required this.environment, required this.userOptions}); + ArtifactProvider({ + required this.environment, + required this.userOptions, + }); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -76,15 +82,13 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ), + ) }; final artifacts = artifactNames - .map( - (artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - ), - ) + .map((artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + )) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -93,8 +97,7 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets, - ) async { + List targets) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -105,19 +108,13 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute( - environment.manifestDir, - tempStorage: environment.targetTempDir, - ); + final crateHash = CrateHash.compute(environment.manifestDir, + tempStorage: environment.targetTempDir); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', - ); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); - final downloadedArtifactsDir = path.join( - environment.targetTempDir, - 'precompiled', - crateHash, - ); + final downloadedArtifactsDir = + path.join(environment.targetTempDir, 'precompiled', crateHash); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -134,10 +131,8 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -146,9 +141,10 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add( - Artifact(path: downloadedPath, finalFileName: artifact), - ); + artifactsForTarget.add(Artifact( + path: downloadedPath, + finalFileName: artifact, + )); } else { break; } @@ -175,8 +171,7 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', - ); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -200,14 +195,12 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)', - ); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}', - ); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); return; } _log.fine('Downloading binary from $url'); @@ -217,10 +210,7 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, - res.bodyBytes, - signature.bodyBytes, - )) { + precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -228,7 +218,10 @@ class ArtifactProvider { } } -enum AritifactType { staticlib, dylib } +enum AritifactType { + staticlib, + dylib, +} AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -258,7 +251,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb', + if (!remote) '$libraryName.pdb' ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 560a52ef51b..6f3b2a4ec11 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,19 +24,16 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File( - lib.path, - ).copySync(path.join(Environment.outputDir, lib.finalFileName)); + File(lib.path) + .copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 8d74d91e2cf..9956eb364d6 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,8 +25,7 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }) @@ -34,10 +33,8 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 3034e18b9b5..8a9c0db5def 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, - darwinAarch: arch, - ); + platformName: Environment.darwinPlatformName, darwinAarch: arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); + runCommand("lipo", [ + '-create', + ...sourceFiles, + '-output', + targetFile, + ]); } final outputDir = Environment.outputDir; diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 159cb779a43..70dfe0eb1af 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,12 +110,10 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption( - 'target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.', - ) + ..addMultiOption('target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.') ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -183,8 +181,7 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString', - ); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); } } final targetStrigns = argResults!['target'] as List; @@ -232,7 +229,9 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); + final verifyBinaries = VerifyBinaries( + manifestDir: manifestDir, + ); await verifyBinaries.run(); } } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart index ccd9610483f..3ed949f2c24 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,7 +17,11 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { debug, release, profile } +enum BuildConfiguration { + debug, + release, + profile, +} extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -83,12 +87,15 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({required bool isAndroid}) { - final buildConfiguration = parseBuildConfiguration( - Environment.configuration, - ); + static BuildEnvironment fromEnvironment({ + required bool isAndroid, + }) { + final buildConfiguration = + parseBuildConfiguration(Environment.configuration); final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -111,9 +118,14 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({required this.target, required this.environment}); + RustBuilder({ + required this.target, + required this.environment, + }); - void prepare(Rustup rustup) { + void prepare( + Rustup rustup, + ) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -139,29 +151,30 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment()); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment(), + ); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 8dbfb74ffe9..0c4d88d16b7 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,7 +24,10 @@ class CrateHash { )._compute(); } - CrateHash._({required this.manifestDir, required this.tempStorage}); + CrateHash._({ + required this.manifestDir, + required this.tempStorage, + }); String _compute() { final files = getFiles(); diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart index da1e36342b7..5edd4fd1848 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,7 +37,11 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord(rec.level, line, rec.loggerName)); + _log(LogRecord( + rec.level, + line, + rec.loggerName, + )); } } }); diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart index 291683b9dfe..22aef1d371c 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,27 +47,32 @@ class SourceSpanException implements Exception { } } -enum Toolchain { stable, beta, nightly } +enum Toolchain { + stable, + beta, + nightly, +} class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({required this.toolchain, required this.flags}); + CargoBuildOptions({ + required this.toolchain, + required this.flags, + }); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = Toolchain.values.firstWhereOrNull( - (element) => element.name == name, - ); + final toolchain = + Toolchain.values.firstWhereOrNull((element) => element.name == name); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span, - ); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span); } static CargoBuildOptions parse(YamlNode node) { @@ -92,14 +97,11 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', - value.span, - ); + 'Extra flags must be a list of strings', value.span); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span, - ); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -116,15 +118,16 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); + PrecompiledBinaries({ + required this.uriPrefix, + required this.publicKey, + }); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', - span, - ); + 'Invalid public key. Must be 32 bytes long.', span); } return PublicKey(bytes); } @@ -139,34 +142,33 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', - urlPrefixNode.span, - ), + 'Invalid URL prefix value.', urlPrefixNode.span), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => _publicKeyFromHex( - publicKey, - publicKeyNode.span, - ), + YamlScalar(value: String publicKey) => + _publicKeyFromHex(publicKey, publicKeyNode.span), _ => throw SourceSpanException( - 'Invalid public key value.', - publicKeyNode.span, - ), + 'Invalid public key value.', publicKeyNode.span), }; - return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); + return PrecompiledBinaries( + uriPrefix: urlPrefix, + publicKey: publicKey, + ); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span, - ); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); + CargokitCrateOptions({ + this.cargo = const {}, + this.precompiledBinaries, + }); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -189,26 +191,23 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values.firstWhereOrNull( - (element) => element.name == name, - ); + final configuration = BuildConfiguration.values + .firstWhereOrNull((element) => element.name == name); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span, - ); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span); } } return CargokitCrateOptions( @@ -217,7 +216,9 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({required String manifestDir}) { + static CargokitCrateOptions load({ + required String manifestDir, + }) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -259,23 +260,20 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span); } } return CargokitUserOptions( diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 805af376a05..019859c33ad 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,7 +84,9 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -118,10 +120,8 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = RustBuilder( - target: target, - environment: buildEnvironment, - ); + final builder = + RustBuilder(target: target, environment: buildEnvironment); builder.prepare(rustup); final res = await builder.build(); @@ -165,8 +165,7 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', - ); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); await Future.delayed(Duration(seconds: 2)); } } @@ -190,17 +189,16 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - ), - ); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + )); } return release; } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart index ee48dab6c77..e46722be493 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,7 +9,10 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain(this.name, this.targets); + _Toolchain( + this.name, + this.targets, + ); final String name; final List targets; @@ -24,12 +27,14 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains.add( - _Toolchain(toolchain, _getInstalledTargets(toolchain)), - ); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); } - void installTarget(String target, {required String toolchain}) { + void installTarget( + String target, { + required String toolchain, + }) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -60,8 +65,7 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), - ) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -84,7 +88,12 @@ class Rustup { .toList(growable: true); return lines - .map((name) => _Toolchain(name, _getInstalledTargets(name))) + .map( + (name) => _Toolchain( + name, + _getInstalledTargets(name), + ), + ) .toList(growable: true); } @@ -111,13 +120,10 @@ class Rustup { return; } // Useful for -Z build-std - runCommand("rustup", [ - 'component', - 'add', - 'rust-src', - '--toolchain', - 'nightly', - ]); + runCommand( + "rustup", + ['component', 'add', 'rust-src', '--toolchain', 'nightly'], + ); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart index 5091560468b..7e9bb250360 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,10 +43,22 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), - Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), - Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), - Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), + Target( + rust: 'x86_64-pc-windows-msvc', + flutter: 'windows-x64', + ), + Target( + rust: 'aarch64-pc-windows-msvc', + flutter: 'windows-arm64', + ), + Target( + rust: 'x86_64-unknown-linux-gnu', + flutter: 'linux-x64', + ), + Target( + rust: 'aarch64-unknown-linux-gnu', + flutter: 'linux-arm64', + ), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -98,11 +110,9 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull( - (element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch, - ); + return all.firstWhereOrNull((element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch); } static Target? forRustTriple(String triple) { diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart index 10ec2a3dba3..8bb6a8724fb 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,18 +89,16 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!( - TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - ), - ); + final result = testRunCommandOverride!(TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + )); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 4c4b2879ffb..2366b57bfd8 100644 --- a/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/integrate_third_party/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,7 +14,9 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({required this.manifestDir}); + VerifyBinaries({ + required this.manifestDir, + }); final String manifestDir; @@ -46,15 +48,12 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = Uri.parse( - '$prefix$crateHash/$signatureFileName', - ); + final signatureUrl = + Uri.parse('$prefix$crateHash/$signatureFileName'); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -69,11 +68,8 @@ class VerifyBinaries { break; } - if (!verify( - precompiledBinaries.publicKey, - asset.bodyBytes, - signature.bodyBytes, - )) { + if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, + signature.bodyBytes)) { stdout.writeln('INVALID SIGNATURE'); ok = false; } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 7f3011dcf07..37dec5708b3 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,17 +25,18 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); } - runCommand(clang, [target, ...args]); + runCommand(clang, [ + target, + ...args, + ]); } /// Full path to Android SDK. @@ -59,7 +60,9 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({required String javaHome}) { + void installNdk({ + required String javaHome, + }) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -70,11 +73,12 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand( - sdkManager, - ['--install', 'ndk;$ndkVersion'], - environment: {'JAVA_HOME': javaHome}, - ); + runCommand(sdkManager, [ + '--install', + 'ndk;$ndkVersion', + ], environment: { + 'JAVA_HOME': javaHome, + }); } Future> buildEnvironment() async { @@ -92,10 +96,8 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = math.max( - target.androidMinSdkVersion!, - this.minSdkVersion, - ); + final minSdkVersion = + math.max(target.androidMinSdkVersion!, this.minSdkVersion); final exe = Platform.isWindows ? '.exe' : ''; @@ -133,12 +135,15 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart'), - ))! + Uri.parse('package:build_tool/buildtool.dart')))! .toFilePath(); - final selfPath = path.canonicalize( - path.join(packagePath, '..', '..', '..', runRustTool), - ); + final selfPath = path.canonicalize(path.join( + packagePath, + '..', + '..', + '..', + runRustTool, + )); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -171,15 +176,13 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File( - path.join(workaroundDir, 'libgcc.a'), - ).writeAsStringSync('INPUT(-lunwind)'); + File(path.join(workaroundDir, 'libgcc.a')) + .writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File( - path.join(workaroundDir, 'libunwind.a'), - ).writeAsStringSync('INPUT(-lgcc)'); + File(path.join(workaroundDir, 'libunwind.a')) + .writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; @@ -193,7 +196,7 @@ class AndroidEnvironment { "-C", "link-arg=-Wl,--hash-style=both", "-C", - "link-arg=-Wl,-z,max-page-size=16384", + "link-arg=-Wl,-z,max-page-size=16384" ]; final pageSizeArgsString = pageSizeArgs.join("\x1f"); diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index 735bb85e8a8..e608cece734 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,13 +36,19 @@ class Artifact { } } - Artifact({required this.path, required this.finalFileName}); + Artifact({ + required this.path, + required this.finalFileName, + }); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({required this.environment, required this.userOptions}); + ArtifactProvider({ + required this.environment, + required this.userOptions, + }); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -76,15 +82,13 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ), + ) }; final artifacts = artifactNames - .map( - (artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - ), - ) + .map((artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + )) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -93,8 +97,7 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets, - ) async { + List targets) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -105,19 +108,13 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute( - environment.manifestDir, - tempStorage: environment.targetTempDir, - ); + final crateHash = CrateHash.compute(environment.manifestDir, + tempStorage: environment.targetTempDir); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', - ); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); - final downloadedArtifactsDir = path.join( - environment.targetTempDir, - 'precompiled', - crateHash, - ); + final downloadedArtifactsDir = + path.join(environment.targetTempDir, 'precompiled', crateHash); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -134,10 +131,8 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -146,9 +141,10 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add( - Artifact(path: downloadedPath, finalFileName: artifact), - ); + artifactsForTarget.add(Artifact( + path: downloadedPath, + finalFileName: artifact, + )); } else { break; } @@ -175,8 +171,7 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', - ); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -200,14 +195,12 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)', - ); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}', - ); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); return; } _log.fine('Downloading binary from $url'); @@ -217,10 +210,7 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, - res.bodyBytes, - signature.bodyBytes, - )) { + precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -228,7 +218,10 @@ class ArtifactProvider { } } -enum AritifactType { staticlib, dylib } +enum AritifactType { + staticlib, + dylib, +} AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -258,7 +251,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb', + if (!remote) '$libraryName.pdb' ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 560a52ef51b..6f3b2a4ec11 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,19 +24,16 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File( - lib.path, - ).copySync(path.join(Environment.outputDir, lib.finalFileName)); + File(lib.path) + .copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 8d74d91e2cf..9956eb364d6 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,8 +25,7 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }) @@ -34,10 +33,8 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 3034e18b9b5..8a9c0db5def 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, - darwinAarch: arch, - ); + platformName: Environment.darwinPlatformName, darwinAarch: arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); + runCommand("lipo", [ + '-create', + ...sourceFiles, + '-output', + targetFile, + ]); } final outputDir = Environment.outputDir; diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 159cb779a43..70dfe0eb1af 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,12 +110,10 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption( - 'target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.', - ) + ..addMultiOption('target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.') ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -183,8 +181,7 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString', - ); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); } } final targetStrigns = argResults!['target'] as List; @@ -232,7 +229,9 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); + final verifyBinaries = VerifyBinaries( + manifestDir: manifestDir, + ); await verifyBinaries.run(); } } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart index ccd9610483f..3ed949f2c24 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,7 +17,11 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { debug, release, profile } +enum BuildConfiguration { + debug, + release, + profile, +} extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -83,12 +87,15 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({required bool isAndroid}) { - final buildConfiguration = parseBuildConfiguration( - Environment.configuration, - ); + static BuildEnvironment fromEnvironment({ + required bool isAndroid, + }) { + final buildConfiguration = + parseBuildConfiguration(Environment.configuration); final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -111,9 +118,14 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({required this.target, required this.environment}); + RustBuilder({ + required this.target, + required this.environment, + }); - void prepare(Rustup rustup) { + void prepare( + Rustup rustup, + ) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -139,29 +151,30 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment()); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment(), + ); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 8dbfb74ffe9..0c4d88d16b7 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,7 +24,10 @@ class CrateHash { )._compute(); } - CrateHash._({required this.manifestDir, required this.tempStorage}); + CrateHash._({ + required this.manifestDir, + required this.tempStorage, + }); String _compute() { final files = getFiles(); diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart index da1e36342b7..5edd4fd1848 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,7 +37,11 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord(rec.level, line, rec.loggerName)); + _log(LogRecord( + rec.level, + line, + rec.loggerName, + )); } } }); diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart index 291683b9dfe..22aef1d371c 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,27 +47,32 @@ class SourceSpanException implements Exception { } } -enum Toolchain { stable, beta, nightly } +enum Toolchain { + stable, + beta, + nightly, +} class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({required this.toolchain, required this.flags}); + CargoBuildOptions({ + required this.toolchain, + required this.flags, + }); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = Toolchain.values.firstWhereOrNull( - (element) => element.name == name, - ); + final toolchain = + Toolchain.values.firstWhereOrNull((element) => element.name == name); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span, - ); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span); } static CargoBuildOptions parse(YamlNode node) { @@ -92,14 +97,11 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', - value.span, - ); + 'Extra flags must be a list of strings', value.span); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span, - ); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -116,15 +118,16 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); + PrecompiledBinaries({ + required this.uriPrefix, + required this.publicKey, + }); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', - span, - ); + 'Invalid public key. Must be 32 bytes long.', span); } return PublicKey(bytes); } @@ -139,34 +142,33 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', - urlPrefixNode.span, - ), + 'Invalid URL prefix value.', urlPrefixNode.span), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => _publicKeyFromHex( - publicKey, - publicKeyNode.span, - ), + YamlScalar(value: String publicKey) => + _publicKeyFromHex(publicKey, publicKeyNode.span), _ => throw SourceSpanException( - 'Invalid public key value.', - publicKeyNode.span, - ), + 'Invalid public key value.', publicKeyNode.span), }; - return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); + return PrecompiledBinaries( + uriPrefix: urlPrefix, + publicKey: publicKey, + ); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span, - ); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); + CargokitCrateOptions({ + this.cargo = const {}, + this.precompiledBinaries, + }); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -189,26 +191,23 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values.firstWhereOrNull( - (element) => element.name == name, - ); + final configuration = BuildConfiguration.values + .firstWhereOrNull((element) => element.name == name); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span, - ); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span); } } return CargokitCrateOptions( @@ -217,7 +216,9 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({required String manifestDir}) { + static CargokitCrateOptions load({ + required String manifestDir, + }) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -259,23 +260,20 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span); } } return CargokitUserOptions( diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 805af376a05..019859c33ad 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,7 +84,9 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -118,10 +120,8 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = RustBuilder( - target: target, - environment: buildEnvironment, - ); + final builder = + RustBuilder(target: target, environment: buildEnvironment); builder.prepare(rustup); final res = await builder.build(); @@ -165,8 +165,7 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', - ); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); await Future.delayed(Duration(seconds: 2)); } } @@ -190,17 +189,16 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - ), - ); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + )); } return release; } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart index ee48dab6c77..e46722be493 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,7 +9,10 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain(this.name, this.targets); + _Toolchain( + this.name, + this.targets, + ); final String name; final List targets; @@ -24,12 +27,14 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains.add( - _Toolchain(toolchain, _getInstalledTargets(toolchain)), - ); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); } - void installTarget(String target, {required String toolchain}) { + void installTarget( + String target, { + required String toolchain, + }) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -60,8 +65,7 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), - ) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -84,7 +88,12 @@ class Rustup { .toList(growable: true); return lines - .map((name) => _Toolchain(name, _getInstalledTargets(name))) + .map( + (name) => _Toolchain( + name, + _getInstalledTargets(name), + ), + ) .toList(growable: true); } @@ -111,13 +120,10 @@ class Rustup { return; } // Useful for -Z build-std - runCommand("rustup", [ - 'component', - 'add', - 'rust-src', - '--toolchain', - 'nightly', - ]); + runCommand( + "rustup", + ['component', 'add', 'rust-src', '--toolchain', 'nightly'], + ); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart index 5091560468b..7e9bb250360 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,10 +43,22 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), - Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), - Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), - Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), + Target( + rust: 'x86_64-pc-windows-msvc', + flutter: 'windows-x64', + ), + Target( + rust: 'aarch64-pc-windows-msvc', + flutter: 'windows-arm64', + ), + Target( + rust: 'x86_64-unknown-linux-gnu', + flutter: 'linux-x64', + ), + Target( + rust: 'aarch64-unknown-linux-gnu', + flutter: 'linux-arm64', + ), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -98,11 +110,9 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull( - (element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch, - ); + return all.firstWhereOrNull((element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch); } static Target? forRustTriple(String triple) { diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart index 10ec2a3dba3..8bb6a8724fb 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,18 +89,16 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!( - TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - ), - ); + final result = testRunCommandOverride!(TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + )); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 4c4b2879ffb..2366b57bfd8 100644 --- a/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/rust_ui_counter/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,7 +14,9 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({required this.manifestDir}); + VerifyBinaries({ + required this.manifestDir, + }); final String manifestDir; @@ -46,15 +48,12 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = Uri.parse( - '$prefix$crateHash/$signatureFileName', - ); + final signatureUrl = + Uri.parse('$prefix$crateHash/$signatureFileName'); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -69,11 +68,8 @@ class VerifyBinaries { break; } - if (!verify( - precompiledBinaries.publicKey, - asset.bodyBytes, - signature.bodyBytes, - )) { + if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, + signature.bodyBytes)) { stdout.writeln('INVALID SIGNATURE'); ok = false; } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart index 7f3011dcf07..37dec5708b3 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -25,17 +25,18 @@ class AndroidEnvironment { final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; if (clang == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); } final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; if (target == null) { throw Exception( - "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var", - ); + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); } - runCommand(clang, [target, ...args]); + runCommand(clang, [ + target, + ...args, + ]); } /// Full path to Android SDK. @@ -59,7 +60,9 @@ class AndroidEnvironment { return ndkPackageXml.existsSync(); } - void installNdk({required String javaHome}) { + void installNdk({ + required String javaHome, + }) { final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; final sdkManager = path.join( sdkPath, @@ -70,11 +73,12 @@ class AndroidEnvironment { ); log.info('Installing NDK $ndkVersion'); - runCommand( - sdkManager, - ['--install', 'ndk;$ndkVersion'], - environment: {'JAVA_HOME': javaHome}, - ); + runCommand(sdkManager, [ + '--install', + 'ndk;$ndkVersion', + ], environment: { + 'JAVA_HOME': javaHome, + }); } Future> buildEnvironment() async { @@ -92,10 +96,8 @@ class AndroidEnvironment { 'bin', ); - final minSdkVersion = math.max( - target.androidMinSdkVersion!, - this.minSdkVersion, - ); + final minSdkVersion = + math.max(target.androidMinSdkVersion!, this.minSdkVersion); final exe = Platform.isWindows ? '.exe' : ''; @@ -133,12 +135,15 @@ class AndroidEnvironment { Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; final packagePath = (await Isolate.resolvePackageUri( - Uri.parse('package:build_tool/buildtool.dart'), - ))! + Uri.parse('package:build_tool/buildtool.dart')))! .toFilePath(); - final selfPath = path.canonicalize( - path.join(packagePath, '..', '..', '..', runRustTool), - ); + final selfPath = path.canonicalize(path.join( + packagePath, + '..', + '..', + '..', + runRustTool, + )); // Make sure that run_build_tool is working properly even initially launched directly // through dart run. @@ -171,15 +176,13 @@ class AndroidEnvironment { ); Directory(workaroundDir).createSync(recursive: true); if (ndkVersion.major >= 23) { - File( - path.join(workaroundDir, 'libgcc.a'), - ).writeAsStringSync('INPUT(-lunwind)'); + File(path.join(workaroundDir, 'libgcc.a')) + .writeAsStringSync('INPUT(-lunwind)'); } else { // Other way around, untested, forward libgcc.a from libunwind once Rust // gets updated for NDK23+. - File( - path.join(workaroundDir, 'libunwind.a'), - ).writeAsStringSync('INPUT(-lgcc)'); + File(path.join(workaroundDir, 'libunwind.a')) + .writeAsStringSync('INPUT(-lgcc)'); } var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; @@ -193,7 +196,7 @@ class AndroidEnvironment { "-C", "link-arg=-Wl,--hash-style=both", "-C", - "link-arg=-Wl,-z,max-page-size=16384", + "link-arg=-Wl,-z,max-page-size=16384" ]; final pageSizeArgsString = pageSizeArgs.join("\x1f"); diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart index 735bb85e8a8..e608cece734 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -36,13 +36,19 @@ class Artifact { } } - Artifact({required this.path, required this.finalFileName}); + Artifact({ + required this.path, + required this.finalFileName, + }); } final _log = Logger('artifacts_provider'); class ArtifactProvider { - ArtifactProvider({required this.environment, required this.userOptions}); + ArtifactProvider({ + required this.environment, + required this.userOptions, + }); final BuildEnvironment environment; final CargokitUserOptions userOptions; @@ -76,15 +82,13 @@ class ArtifactProvider { libraryName: environment.crateInfo.packageName, aritifactType: AritifactType.staticlib, remote: false, - ), + ) }; final artifacts = artifactNames - .map( - (artifactName) => Artifact( - path: path.join(targetDir, artifactName), - finalFileName: artifactName, - ), - ) + .map((artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + )) .where((element) => File(element.path).existsSync()) .toList(); result[target] = artifacts; @@ -93,8 +97,7 @@ class ArtifactProvider { } Future>> _getPrecompiledArtifacts( - List targets, - ) async { + List targets) async { if (userOptions.usePrecompiledBinaries == false) { _log.info('Precompiled binaries are disabled'); return {}; @@ -105,19 +108,13 @@ class ArtifactProvider { } final start = Stopwatch()..start(); - final crateHash = CrateHash.compute( - environment.manifestDir, - tempStorage: environment.targetTempDir, - ); + final crateHash = CrateHash.compute(environment.manifestDir, + tempStorage: environment.targetTempDir); _log.fine( - 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms', - ); + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); - final downloadedArtifactsDir = path.join( - environment.targetTempDir, - 'precompiled', - crateHash, - ); + final downloadedArtifactsDir = + path.join(environment.targetTempDir, 'precompiled', crateHash); Directory(downloadedArtifactsDir).createSync(recursive: true); final res = >{}; @@ -134,10 +131,8 @@ class ArtifactProvider { final fileName = PrecompileBinaries.fileName(target, artifact); final downloadedPath = path.join(downloadedArtifactsDir, fileName); if (!File(downloadedPath).existsSync()) { - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); await _tryDownloadArtifacts( crateHash: crateHash, fileName: fileName, @@ -146,9 +141,10 @@ class ArtifactProvider { ); } if (File(downloadedPath).existsSync()) { - artifactsForTarget.add( - Artifact(path: downloadedPath, finalFileName: artifact), - ); + artifactsForTarget.add(Artifact( + path: downloadedPath, + finalFileName: artifact, + )); } else { break; } @@ -175,8 +171,7 @@ class ArtifactProvider { if (attempt++ < maxAttempts && (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { _log.severe( - 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...', - ); + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); await Future.delayed(Duration(seconds: 1)); continue; } else { @@ -200,14 +195,12 @@ class ArtifactProvider { final signature = await _get(signatureUrl); if (signature.statusCode == 404) { _log.warning( - 'Precompiled binaries not available for crate hash $crateHash ($fileName)', - ); + 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); return; } if (signature.statusCode != 200) { _log.severe( - 'Failed to download signature $signatureUrl: status ${signature.statusCode}', - ); + 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); return; } _log.fine('Downloading binary from $url'); @@ -217,10 +210,7 @@ class ArtifactProvider { return; } if (verify( - precompiledBinaries.publicKey, - res.bodyBytes, - signature.bodyBytes, - )) { + precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { File(finalPath).writeAsBytesSync(res.bodyBytes); } else { _log.shout('Signature verification failed! Ignoring binary.'); @@ -228,7 +218,10 @@ class ArtifactProvider { } } -enum AritifactType { staticlib, dylib } +enum AritifactType { + staticlib, + dylib, +} AritifactType artifactTypeForTarget(Target target) { if (target.darwinPlatform != null) { @@ -258,7 +251,7 @@ List getArtifactNames({ return [ '$libraryName.dll', '$libraryName.dll.lib', - if (!remote) '$libraryName.pdb', + if (!remote) '$libraryName.pdb' ]; } } else if (target.rust.contains('-linux-')) { diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart index 560a52ef51b..6f3b2a4ec11 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -24,19 +24,16 @@ class BuildCMake { } final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts([target]); final libs = artifacts[target]!; for (final lib in libs) { if (lib.type == AritifactType.dylib) { - File( - lib.path, - ).copySync(path.join(Environment.outputDir, lib.finalFileName)); + File(lib.path) + .copySync(path.join(Environment.outputDir, lib.finalFileName)); } } } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart index 8d74d91e2cf..9956eb364d6 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -25,8 +25,7 @@ class BuildGradle { final target = Target.forFlutterName(arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }) @@ -34,10 +33,8 @@ class BuildGradle { .toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: true); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); for (final target in targets) { diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart index 3034e18b9b5..8a9c0db5def 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -20,26 +20,26 @@ class BuildPod { Future build() async { final targets = Environment.darwinArchs.map((arch) { final target = Target.forDarwin( - platformName: Environment.darwinPlatformName, - darwinAarch: arch, - ); + platformName: Environment.darwinPlatformName, darwinAarch: arch); if (target == null) { throw Exception( - "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}", - ); + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); } return target; }).toList(); final environment = BuildEnvironment.fromEnvironment(isAndroid: false); - final provider = ArtifactProvider( - environment: environment, - userOptions: userOptions, - ); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); final artifacts = await provider.getArtifacts(targets); void performLipo(String targetFile, Iterable sourceFiles) { - runCommand("lipo", ['-create', ...sourceFiles, '-output', targetFile]); + runCommand("lipo", [ + '-create', + ...sourceFiles, + '-output', + targetFile, + ]); } final outputDir = Environment.outputDir; diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart index 159cb779a43..70dfe0eb1af 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -110,12 +110,10 @@ class PrecompileBinariesCommand extends Command { mandatory: true, help: 'Directory containing Cargo.toml', ) - ..addMultiOption( - 'target', - help: 'Rust target triple of artifact to build.\n' - 'Can be specified multiple times or omitted in which case\n' - 'all targets for current platform will be built.', - ) + ..addMultiOption('target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.') ..addOption( 'android-sdk-location', help: 'Location of Android SDK (if available)', @@ -183,8 +181,7 @@ class PrecompileBinariesCommand extends Command { androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); if (androidMinSdkVersion == null) { throw ArgumentError( - 'Invalid android-min-sdk-version: $androidMinSdkVersionString', - ); + 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); } } final targetStrigns = argResults!['target'] as List; @@ -232,7 +229,9 @@ class VerifyBinariesCommand extends Command { @override Future run() async { final manifestDir = argResults!['manifest-dir'] as String; - final verifyBinaries = VerifyBinaries(manifestDir: manifestDir); + final verifyBinaries = VerifyBinaries( + manifestDir: manifestDir, + ); await verifyBinaries.run(); } } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart index ccd9610483f..3ed949f2c24 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -17,7 +17,11 @@ import 'util.dart'; final _log = Logger('builder'); -enum BuildConfiguration { debug, release, profile } +enum BuildConfiguration { + debug, + release, + profile, +} extension on BuildConfiguration { bool get isDebug => this == BuildConfiguration.debug; @@ -83,12 +87,15 @@ class BuildEnvironment { return buildConfiguration; } - static BuildEnvironment fromEnvironment({required bool isAndroid}) { - final buildConfiguration = parseBuildConfiguration( - Environment.configuration, - ); + static BuildEnvironment fromEnvironment({ + required bool isAndroid, + }) { + final buildConfiguration = + parseBuildConfiguration(Environment.configuration); final manifestDir = Environment.manifestDir; - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final crateInfo = CrateInfo.load(manifestDir); return BuildEnvironment( configuration: buildConfiguration, @@ -111,9 +118,14 @@ class RustBuilder { final Target target; final BuildEnvironment environment; - RustBuilder({required this.target, required this.environment}); + RustBuilder({ + required this.target, + required this.environment, + }); - void prepare(Rustup rustup) { + void prepare( + Rustup rustup, + ) { final toolchain = _toolchain; if (rustup.installedTargets(toolchain) == null) { rustup.installToolchain(toolchain); @@ -139,29 +151,30 @@ class RustBuilder { final extraArgs = _buildOptions?.flags ?? []; final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); runCommand( - 'rustup', - [ - 'run', - _toolchain, - 'cargo', - (target.android == null && environment.glibcVersion != null) - ? 'zigbuild' - : 'build', - ...extraArgs, - '--manifest-path', - manifestPath, - '-p', - environment.crateInfo.packageName, - if (!environment.configuration.isDebug) '--release', - '--target', - target.rust + - ((target.android == null && environment.glibcVersion != null) - ? '.${environment.glibcVersion!}' - : ""), - '--target-dir', - environment.targetTempDir, - ], - environment: await _buildEnvironment()); + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + (target.android == null && environment.glibcVersion != null) + ? 'zigbuild' + : 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust + + ((target.android == null && environment.glibcVersion != null) + ? '.${environment.glibcVersion!}' + : ""), + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment(), + ); return path.join( environment.targetTempDir, target.rust, diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart index 8dbfb74ffe9..0c4d88d16b7 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -24,7 +24,10 @@ class CrateHash { )._compute(); } - CrateHash._({required this.manifestDir, required this.tempStorage}); + CrateHash._({ + required this.manifestDir, + required this.tempStorage, + }); String _compute() { final files = getFiles(); diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart index da1e36342b7..5edd4fd1848 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -37,7 +37,11 @@ void initLogging() { final lines = rec.message.split('\n'); for (final line in lines) { if (line.isNotEmpty || lines.length == 1 || line != lines.last) { - _log(LogRecord(rec.level, line, rec.loggerName)); + _log(LogRecord( + rec.level, + line, + rec.loggerName, + )); } } }); diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart index 291683b9dfe..22aef1d371c 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -47,27 +47,32 @@ class SourceSpanException implements Exception { } } -enum Toolchain { stable, beta, nightly } +enum Toolchain { + stable, + beta, + nightly, +} class CargoBuildOptions { final Toolchain toolchain; final List flags; - CargoBuildOptions({required this.toolchain, required this.flags}); + CargoBuildOptions({ + required this.toolchain, + required this.flags, + }); static Toolchain _toolchainFromNode(YamlNode node) { if (node case YamlScalar(value: String name)) { - final toolchain = Toolchain.values.firstWhereOrNull( - (element) => element.name == name, - ); + final toolchain = + Toolchain.values.firstWhereOrNull((element) => element.name == name); if (toolchain != null) { return toolchain; } } throw SourceSpanException( - 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', - node.span, - ); + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span); } static CargoBuildOptions parse(YamlNode node) { @@ -92,14 +97,11 @@ class CargoBuildOptions { } } throw SourceSpanException( - 'Extra flags must be a list of strings', - value.span, - ); + 'Extra flags must be a list of strings', value.span); } else { throw SourceSpanException( - 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', - key.span, - ); + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span); } } return CargoBuildOptions(toolchain: toolchain, flags: flags); @@ -116,15 +118,16 @@ class PrecompiledBinaries { final String uriPrefix; final PublicKey publicKey; - PrecompiledBinaries({required this.uriPrefix, required this.publicKey}); + PrecompiledBinaries({ + required this.uriPrefix, + required this.publicKey, + }); static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { final bytes = HEX.decode(key); if (bytes.length != 32) { throw SourceSpanException( - 'Invalid public key. Must be 32 bytes long.', - span, - ); + 'Invalid public key. Must be 32 bytes long.', span); } return PublicKey(bytes); } @@ -139,34 +142,33 @@ class PrecompiledBinaries { final urlPrefix = switch (urlPrefixNode) { YamlScalar(value: String urlPrefix) => urlPrefix, _ => throw SourceSpanException( - 'Invalid URL prefix value.', - urlPrefixNode.span, - ), + 'Invalid URL prefix value.', urlPrefixNode.span), }; final publicKey = switch (publicKeyNode) { - YamlScalar(value: String publicKey) => _publicKeyFromHex( - publicKey, - publicKeyNode.span, - ), + YamlScalar(value: String publicKey) => + _publicKeyFromHex(publicKey, publicKeyNode.span), _ => throw SourceSpanException( - 'Invalid public key value.', - publicKeyNode.span, - ), + 'Invalid public key value.', publicKeyNode.span), }; - return PrecompiledBinaries(uriPrefix: urlPrefix, publicKey: publicKey); + return PrecompiledBinaries( + uriPrefix: urlPrefix, + publicKey: publicKey, + ); } } throw SourceSpanException( - 'Invalid precompiled binaries value. ' - 'Expected Map with "url_prefix" and "public_key".', - node.span, - ); + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span); } } /// Cargokit options specified for Rust crate. class CargokitCrateOptions { - CargokitCrateOptions({this.cargo = const {}, this.precompiledBinaries}); + CargokitCrateOptions({ + this.cargo = const {}, + this.precompiledBinaries, + }); final Map cargo; final PrecompiledBinaries? precompiledBinaries; @@ -189,26 +191,23 @@ class CargokitCrateOptions { } for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { if (key case YamlScalar(value: String name)) { - final configuration = BuildConfiguration.values.firstWhereOrNull( - (element) => element.name == name, - ); + final configuration = BuildConfiguration.values + .firstWhereOrNull((element) => element.name == name); if (configuration != null) { options[configuration] = CargoBuildOptions.parse(value); continue; } } throw SourceSpanException( - 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', - key.span, - ); + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span); } } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { precompiledBinaries = PrecompiledBinaries.parse(entry.value); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span); } } return CargokitCrateOptions( @@ -217,7 +216,9 @@ class CargokitCrateOptions { ); } - static CargokitCrateOptions load({required String manifestDir}) { + static CargokitCrateOptions load({ + required String manifestDir, + }) { final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); final file = File.fromUri(uri); if (file.existsSync()) { @@ -259,23 +260,20 @@ class CargokitUserOptions { continue; } throw SourceSpanException( - 'Invalid value for "use_precompiled_binaries". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span); } else if (entry.key case YamlScalar(value: 'verbose_logging')) { if (entry.value case YamlScalar(value: bool value)) { verboseLogging = value; continue; } throw SourceSpanException( - 'Invalid value for "verbose_logging". Must be a boolean.', - entry.value.span, - ); + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span); } else { throw SourceSpanException( - 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', - entry.key.span, - ); + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span); } } return CargokitUserOptions( diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart index 805af376a05..019859c33ad 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -84,7 +84,9 @@ class PrecompileBinaries { tempDir.createSync(recursive: true); - final crateOptions = CargokitCrateOptions.load(manifestDir: manifestDir); + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); final buildEnvironment = BuildEnvironment( configuration: BuildConfiguration.release, @@ -118,10 +120,8 @@ class PrecompileBinaries { _log.info('Building for $target'); - final builder = RustBuilder( - target: target, - environment: buildEnvironment, - ); + final builder = + RustBuilder(target: target, environment: buildEnvironment); builder.prepare(rustup); final res = await builder.build(); @@ -165,8 +165,7 @@ class PrecompileBinaries { } ++retryCount; _log.shout( - 'Upload failed (attempt $retryCount, will retry): ${e.toString()}', - ); + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); await Future.delayed(Duration(seconds: 2)); } } @@ -190,17 +189,16 @@ class PrecompileBinaries { } on ReleaseNotFound { _log.info('Release not found - creating release $tagName'); release = await repo.createRelease( - repositorySlug, - CreateRelease.from( - tagName: tagName, - name: 'Precompiled binaries ${hash.substring(0, 8)}', - targetCommitish: null, - isDraft: false, - isPrerelease: false, - body: 'Precompiled binaries for crate $packageName, ' - 'crate hash $hash.', - ), - ); + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + )); } return release; } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart index ee48dab6c77..e46722be493 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -9,7 +9,10 @@ import 'package:path/path.dart' as path; import 'util.dart'; class _Toolchain { - _Toolchain(this.name, this.targets); + _Toolchain( + this.name, + this.targets, + ); final String name; final List targets; @@ -24,12 +27,14 @@ class Rustup { void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - _installedToolchains.add( - _Toolchain(toolchain, _getInstalledTargets(toolchain)), - ); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); } - void installTarget(String target, {required String toolchain}) { + void installTarget( + String target, { + required String toolchain, + }) { log.info("Installing Rust target: $target"); runCommand("rustup", ['target', 'add', '--toolchain', toolchain, target]); _installedTargets(toolchain)?.add(target); @@ -60,8 +65,7 @@ class Rustup { List? _installedTargets(String toolchain) => _installedToolchains .firstWhereOrNull( - (e) => e.name == toolchain || e.name.startsWith('$toolchain-'), - ) + (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) ?.targets; static List<_Toolchain> _getInstalledToolchains() { @@ -84,7 +88,12 @@ class Rustup { .toList(growable: true); return lines - .map((name) => _Toolchain(name, _getInstalledTargets(name))) + .map( + (name) => _Toolchain( + name, + _getInstalledTargets(name), + ), + ) .toList(growable: true); } @@ -111,13 +120,10 @@ class Rustup { return; } // Useful for -Z build-std - runCommand("rustup", [ - 'component', - 'add', - 'rust-src', - '--toolchain', - 'nightly', - ]); + runCommand( + "rustup", + ['component', 'add', 'rust-src', '--toolchain', 'nightly'], + ); _didInstallRustSrcForNightly = true; } diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart index 5091560468b..7e9bb250360 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -43,10 +43,22 @@ class Target { android: 'x86_64', androidMinSdkVersion: 21, ), - Target(rust: 'x86_64-pc-windows-msvc', flutter: 'windows-x64'), - Target(rust: 'aarch64-pc-windows-msvc', flutter: 'windows-arm64'), - Target(rust: 'x86_64-unknown-linux-gnu', flutter: 'linux-x64'), - Target(rust: 'aarch64-unknown-linux-gnu', flutter: 'linux-arm64'), + Target( + rust: 'x86_64-pc-windows-msvc', + flutter: 'windows-x64', + ), + Target( + rust: 'aarch64-pc-windows-msvc', + flutter: 'windows-arm64', + ), + Target( + rust: 'x86_64-unknown-linux-gnu', + flutter: 'linux-x64', + ), + Target( + rust: 'aarch64-unknown-linux-gnu', + flutter: 'linux-arm64', + ), Target(rust: 'riscv64gc-unknown-linux-gnu', flutter: 'linux-riscv64'), Target( rust: 'x86_64-apple-darwin', @@ -98,11 +110,9 @@ class Target { required String platformName, required String darwinAarch, }) { - return all.firstWhereOrNull( - (element) => // - element.darwinPlatform == platformName && - element.darwinArch == darwinAarch, - ); + return all.firstWhereOrNull((element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch); } static Target? forRustTriple(String triple) { diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart index 10ec2a3dba3..8bb6a8724fb 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -89,18 +89,16 @@ ProcessResult runCommand( Encoding? stderrEncoding = systemEncoding, }) { if (testRunCommandOverride != null) { - final result = testRunCommandOverride!( - TestRunCommandArgs( - executable: executable, - arguments: arguments, - workingDirectory: workingDirectory, - environment: environment, - includeParentEnvironment: includeParentEnvironment, - runInShell: runInShell, - stdoutEncoding: stdoutEncoding, - stderrEncoding: stderrEncoding, - ), - ); + final result = testRunCommandOverride!(TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + )); return ProcessResult( result.pid, result.exitCode, diff --git a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart index 4c4b2879ffb..2366b57bfd8 100644 --- a/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart +++ b/frb_example/rust_ui_todo_list/ui/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -14,7 +14,9 @@ import 'precompile_binaries.dart'; import 'target.dart'; class VerifyBinaries { - VerifyBinaries({required this.manifestDir}); + VerifyBinaries({ + required this.manifestDir, + }); final String manifestDir; @@ -46,15 +48,12 @@ class VerifyBinaries { for (final artifact in artifacts) { final fileName = PrecompileBinaries.fileName(target, artifact); - final signatureFileName = PrecompileBinaries.signatureFileName( - target, - artifact, - ); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); final url = Uri.parse('$prefix$crateHash/$fileName'); - final signatureUrl = Uri.parse( - '$prefix$crateHash/$signatureFileName', - ); + final signatureUrl = + Uri.parse('$prefix$crateHash/$signatureFileName'); final signature = await get(signatureUrl); if (signature.statusCode != 200) { @@ -69,11 +68,8 @@ class VerifyBinaries { break; } - if (!verify( - precompiledBinaries.publicKey, - asset.bodyBytes, - signature.bodyBytes, - )) { + if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, + signature.bodyBytes)) { stdout.writeln('INVALID SIGNATURE'); ok = false; } From 81c1f941939a798f31b2b5d3c88a8cb90e00c514 Mon Sep 17 00:00:00 2001 From: fzyzcjy Date: Sun, 7 Jun 2026 12:17:23 +0800 Subject: [PATCH 3/3] Point CargoKit templates to merged main --- .../assets/integration_template/app/rust_builder/cargokit | 2 +- frb_codegen/assets/integration_template/plugin/cargokit | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frb_codegen/assets/integration_template/app/rust_builder/cargokit b/frb_codegen/assets/integration_template/app/rust_builder/cargokit index 48ba7fd3d48..6f7144d192b 160000 --- a/frb_codegen/assets/integration_template/app/rust_builder/cargokit +++ b/frb_codegen/assets/integration_template/app/rust_builder/cargokit @@ -1 +1 @@ -Subproject commit 48ba7fd3d4804112b764773f4b543658be15689f +Subproject commit 6f7144d192b04075acd73af2656cdebb1d3e4055 diff --git a/frb_codegen/assets/integration_template/plugin/cargokit b/frb_codegen/assets/integration_template/plugin/cargokit index 48ba7fd3d48..6f7144d192b 160000 --- a/frb_codegen/assets/integration_template/plugin/cargokit +++ b/frb_codegen/assets/integration_template/plugin/cargokit @@ -1 +1 @@ -Subproject commit 48ba7fd3d4804112b764773f4b543658be15689f +Subproject commit 6f7144d192b04075acd73af2656cdebb1d3e4055