blob: 497b102bdac5da80051311a0b4cd3bc57d29403c [file] [log] [blame] [edit]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:ffi';
import 'dart:io';
import 'package:native_assets_cli/native_assets_cli.dart';
const packageName = 'use_rust';
void main(List<String> args) async {
final buildConfig = await BuildConfig.fromArgs(args);
if (buildConfig.target.abi != Abi.current()) {
throw Exception('Cross compilation not supported.');
}
final cargoResult = await Process.run(
'cargo',
['build'],
workingDirectory: buildConfig.packageRoot.resolve('rust/').toFilePath(),
);
print(cargoResult.stdout);
print(cargoResult.stderr);
if (cargoResult.exitCode != 0) {
exit(cargoResult.exitCode);
}
final dylibUri =
buildConfig.packageRoot.resolve('rust/target/debug/libuse_rust.dylib');
final dylib = File.fromUri(dylibUri);
if (!await dylib.exists()) {
throw Exception('Could not find $dylib.');
}
final dylinInOutDirUri = buildConfig.outDir
.resolve(buildConfig.target.os.dylibFileName(packageName));
await dylib.copy(dylinInOutDirUri.toFilePath());
final buildOutput = BuildOutput(
dependencies: Dependencies([
buildConfig.packageRoot.resolve('build.dart'),
buildConfig.packageRoot.resolve('rust/build.rs'),
buildConfig.packageRoot.resolve('rust/Cargo.toml'),
buildConfig.packageRoot.resolve('rust/src/lib.rs'),
]),
assets: [
Asset(
id: 'package:$packageName/src/${packageName}_bindings_generated.dart',
linkMode: LinkMode.dynamic,
target: buildConfig.target,
path: AssetAbsolutePath(dylinInOutDirUri),
)
],
);
await buildOutput.writeToFile(outDir: buildConfig.outDir);
}