From c4563b4f3f1d7f332a53af4bd44cb43ef4f48439 Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Fri, 15 Sep 2023 20:18:34 +0200 Subject: [PATCH] fix: properly install targets per toolchain --- build_tool/lib/src/builder.dart | 4 +- build_tool/lib/src/rustup.dart | 71 +++++++++++++++++++++++++-------- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/build_tool/lib/src/builder.dart b/build_tool/lib/src/builder.dart index 9393f63..2f71756 100644 --- a/build_tool/lib/src/builder.dart +++ b/build_tool/lib/src/builder.dart @@ -122,8 +122,8 @@ class RustBuilder { if (toolchain == 'nightly') { rustup.installRustSrcForNightly(); } - if (!rustup.installedTargets.contains(target.rust)) { - rustup.installTarget(target.rust); + if (!rustup.installedTargets(toolchain).contains(target.rust)) { + rustup.installTarget(target.rust, toolchain: toolchain); } } diff --git a/build_tool/lib/src/rustup.dart b/build_tool/lib/src/rustup.dart index 6828614..7af898e 100644 --- a/build_tool/lib/src/rustup.dart +++ b/build_tool/lib/src/rustup.dart @@ -4,38 +4,77 @@ import 'package:path/path.dart' as path; import 'util.dart'; -class Rustup { - final List installedTargets; - final List installedToolchains; +class _Toolchain { + _Toolchain( + this.name, + this.targets, + ); - Rustup() - : installedTargets = _getInstalledTargets(), - installedToolchains = _getInstalledToolchains(); + final String name; + final List targets; +} - void installTarget(String target) { - log.info("Installing Rust target: $target"); - runCommand("rustup", ['target', 'add', target]); - installedTargets.add(target); - } +class Rustup { + List get installedToolchains => + _installedToolchains.map((e) => e.name).toList(growable: false); + + List installedTargets(String toolchain) => + List.unmodifiable(_installedTargets(toolchain)); void installToolchain(String toolchain) { log.info("Installing Rust toolchain: $toolchain"); runCommand("rustup", ['toolchain', 'install', toolchain]); - installedToolchains.add(toolchain); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(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); } - static List _getInstalledToolchains() { + final List<_Toolchain> _installedToolchains; + + Rustup() : _installedToolchains = _getInstalledToolchains(); + + List _installedTargets(String toolchain) => + _installedToolchains.firstWhere((e) => e.name == toolchain).targets; + + static List<_Toolchain> _getInstalledToolchains() { final res = runCommand("rustup", ['toolchain', 'list']); final lines = res.stdout .toString() .split('\n') .where((e) => e.isNotEmpty) .toList(growable: true); - return lines; + return lines + .map( + (toolchain) => _Toolchain( + toolchain, + _getInstalledTargets(toolchain), + ), + ) + .toList(growable: true); } - static List _getInstalledTargets() { - final res = runCommand("rustup", ['target', 'list', '--installed']); + static List _getInstalledTargets(String toolchain) { + final res = runCommand("rustup", [ + 'target', + 'list', + '--toolchain', + toolchain, + '--installed', + ]); final lines = res.stdout .toString() .split('\n')