Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions tools/engine_tool/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,17 @@ void main(List<String> args) async {

// Find and parse the engine build configs.
final io.Directory buildConfigsDir = io.Directory(p.join(
engine.flutterDir.path, 'ci', 'builders',
engine.flutterDir.path,
'ci',
'builders',
));
final BuildConfigLoader loader = BuildConfigLoader(
buildConfigsDir: buildConfigsDir,
);

// Treat it as an error if no build configs were found. The caller likely
// expected to find some.
final Map<String, BuildConfig> configs = loader.configs;
final Map<String, BuilderConfig> configs = loader.configs;
if (configs.isEmpty) {
io.stderr.writeln(
'Error: No build configs found under ${buildConfigsDir.path}',
Expand Down
40 changes: 19 additions & 21 deletions tools/engine_tool/lib/src/build_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,47 +6,45 @@ import 'package:engine_build_configs/engine_build_configs.dart';

import 'environment.dart';

/// A function that returns true or false when given a [BuildConfig] and its
/// A function that returns true or false when given a [BuilderConfig] and its
/// name.
typedef ConfigFilter = bool Function(String name, BuildConfig config);
typedef ConfigFilter = bool Function(String name, BuilderConfig config);

/// A function that returns true or false when given a [BuildConfig] name
/// and a [GlobalBuild].
typedef BuildFilter = bool Function(String configName, GlobalBuild build);
/// A function that returns true or false when given a [BuilderConfig] name
/// and a [Build].
typedef BuildFilter = bool Function(String configName, Build build);

/// Returns a filtered copy of [input] filtering out configs where test
/// returns false.
Map<String, BuildConfig> filterBuildConfigs(
Map<String, BuildConfig> input, ConfigFilter test) {
return <String, BuildConfig>{
for (final MapEntry<String, BuildConfig> entry in input.entries)
Map<String, BuilderConfig> filterBuilderConfigs(
Map<String, BuilderConfig> input, ConfigFilter test) {
return <String, BuilderConfig>{
for (final MapEntry<String, BuilderConfig> entry in input.entries)
if (test(entry.key, entry.value)) entry.key: entry.value,
};
}

/// Returns a copy of [input] filtering out configs that are not runnable
/// on the current platform.
Map<String, BuildConfig> runnableBuildConfigs(
Environment env, Map<String, BuildConfig> input) {
return filterBuildConfigs(input, (String name, BuildConfig config) {
Map<String, BuilderConfig> runnableBuilderConfigs(
Environment env, Map<String, BuilderConfig> input) {
return filterBuilderConfigs(input, (String name, BuilderConfig config) {
return config.canRunOn(env.platform);
});
}

/// Returns a List of [GlobalBuild] that match test.
List<GlobalBuild> filterBuilds(
Map<String, BuildConfig> input, BuildFilter test) {
return <GlobalBuild>[
for (final MapEntry<String, BuildConfig> entry in input.entries)
for (final GlobalBuild build in entry.value.builds)
/// Returns a List of [Build] that match test.
List<Build> filterBuilds(Map<String, BuilderConfig> input, BuildFilter test) {
return <Build>[
for (final MapEntry<String, BuilderConfig> entry in input.entries)
for (final Build build in entry.value.builds)
if (test(entry.key, build)) build,
];
}

/// Returns a list of runnable builds.
List<GlobalBuild> runnableBuilds(
Environment env, Map<String, BuildConfig> input) {
return filterBuilds(input, (String configName, GlobalBuild build) {
List<Build> runnableBuilds(Environment env, Map<String, BuilderConfig> input) {
return filterBuilds(input, (String configName, Build build) {
return build.canRunOn(env.platform);
});
}
42 changes: 19 additions & 23 deletions tools/engine_tool/lib/src/commands/build_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,12 @@ import '../logger.dart';
import 'command.dart';
import 'flags.dart';

// TODO(johnmccutchan): Should BuildConfig be BuilderConfig and GlobalBuild be BuildConfig?
// TODO(johnmccutchan): List all available build targets and allow the user
// to specify which one(s) we should build on the cli.
// TODO(johnmccutchan): Can we show a progress indicator like 'running gn...'?

/// The root 'build' command.
final class BuildCommand extends CommandBase {
/// Constructs the 'build' command.
BuildCommand({
required super.environment,
required Map<String, BuildConfig> configs,
required Map<String, BuilderConfig> configs,
}) {
builds = runnableBuilds(environment, configs);
// Add options here that are common to all queries.
Expand All @@ -29,18 +24,18 @@ final class BuildCommand extends CommandBase {
defaultsTo: 'host_debug',
help: 'Specify the build config to use',
allowed: <String>[
for (final GlobalBuild config in runnableBuilds(environment, configs))
for (final Build config in runnableBuilds(environment, configs))
config.name,
],
allowedHelp: <String, String>{
for (final GlobalBuild config in runnableBuilds(environment, configs))
for (final Build config in runnableBuilds(environment, configs))
config.name: config.gn.join(' '),
},
);
}

/// List of compatible builds.
late final List<GlobalBuild> builds;
late final List<Build> builds;

@override
String get name => 'build';
Expand All @@ -51,14 +46,13 @@ final class BuildCommand extends CommandBase {
@override
Future<int> run() async {
final String configName = argResults![configFlag] as String;
final GlobalBuild? build = builds
.where((GlobalBuild build) => build.name == configName)
.firstOrNull;
final Build? build =
builds.where((Build build) => build.name == configName).firstOrNull;
if (build == null) {
environment.logger.error('Could not find config $configName');
return 1;
}
final GlobalBuildRunner buildRunner = GlobalBuildRunner(
final BuildRunner buildRunner = BuildRunner(
platform: environment.platform,
processRunner: environment.processRunner,
abi: environment.abi,
Expand All @@ -78,16 +72,18 @@ final class BuildCommand extends CommandBase {
spinner = null;
environment.logger.clearLine();
environment.logger.status(event);
case RunnerProgress(done: false): {
spinner?.finish();
spinner = null;
final String percent = '${event.percent.toStringAsFixed(1)}%';
final String fraction = '(${event.completed}/${event.total})';
final String prefix = '[${event.name}] $percent $fraction ';
final String what = event.what;
environment.logger.clearLine();
environment.logger.status('$prefix$what', newline: false, fit: true);
}
case RunnerProgress(done: false):
{
spinner?.finish();
spinner = null;
final String percent = '${event.percent.toStringAsFixed(1)}%';
final String fraction = '(${event.completed}/${event.total})';
final String prefix = '[${event.name}] $percent $fraction ';
final String what = event.what;
environment.logger.clearLine();
environment.logger
.status('$prefix$what', newline: false, fit: true);
}
default:
spinner?.finish();
spinner = null;
Expand Down
2 changes: 1 addition & 1 deletion tools/engine_tool/lib/src/commands/command_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ final class ToolCommandRunner extends CommandRunner<int> {
final Environment environment;

/// Build configurations loaded from the engine from under ci/builders.
final Map<String, BuildConfig> configs;
final Map<String, BuilderConfig> configs;

@override
Future<int> run(Iterable<String> args) async {
Expand Down
12 changes: 6 additions & 6 deletions tools/engine_tool/lib/src/commands/query_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ final class QueryCommand extends CommandBase {
abbr: 'b',
help: 'Restrict the query to a single builder.',
allowed: <String>[
for (final MapEntry<String, BuildConfig> entry in configs.entries)
for (final MapEntry<String, BuilderConfig> entry in configs.entries)
if (entry.value.canRunOn(environment.platform)) entry.key,
],
allowedHelp: <String, String>{
// TODO(zanderso): Add human readable descriptions to the json files.
for (final MapEntry<String, BuildConfig> entry in configs.entries)
for (final MapEntry<String, BuilderConfig> entry in configs.entries)
if (entry.value.canRunOn(environment.platform))
entry.key: entry.value.path,
},
Expand All @@ -51,7 +51,7 @@ final class QueryCommand extends CommandBase {
}

/// Build configurations loaded from the engine from under ci/builders.
final Map<String, BuildConfig> configs;
final Map<String, BuilderConfig> configs;

@override
String get name => 'query';
Expand All @@ -70,7 +70,7 @@ final class QueryBuildersCommand extends CommandBase {
});

/// Build configurations loaded from the engine from under ci/builders.
final Map<String, BuildConfig> configs;
final Map<String, BuilderConfig> configs;

@override
String get name => 'builders';
Expand All @@ -97,13 +97,13 @@ final class QueryBuildersCommand extends CommandBase {
continue;
}

final BuildConfig config = configs[key]!;
final BuilderConfig config = configs[key]!;
if (!config.canRunOn(environment.platform) && !all) {
continue;
}

environment.logger.status('"$key" builder:');
for (final GlobalBuild build in config.builds) {
for (final Build build in config.builds) {
if (!build.canRunOn(environment.platform) && !all) {
continue;
}
Expand Down
10 changes: 5 additions & 5 deletions tools/engine_tool/test/build_command_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,25 @@ void main() {
return;
}

final BuildConfig linuxTestConfig = BuildConfig.fromJson(
final BuilderConfig linuxTestConfig = BuilderConfig.fromJson(
path: 'ci/builders/linux_test_config.json',
map: convert.jsonDecode(fixtures.testConfig('Linux'))
as Map<String, Object?>,
);

final BuildConfig macTestConfig = BuildConfig.fromJson(
final BuilderConfig macTestConfig = BuilderConfig.fromJson(
path: 'ci/builders/mac_test_config.json',
map: convert.jsonDecode(fixtures.testConfig('Mac-12'))
as Map<String, Object?>,
);

final BuildConfig winTestConfig = BuildConfig.fromJson(
final BuilderConfig winTestConfig = BuilderConfig.fromJson(
path: 'ci/builders/win_test_config.json',
map: convert.jsonDecode(fixtures.testConfig('Windows-11'))
as Map<String, Object?>,
);

final Map<String, BuildConfig> configs = <String, BuildConfig>{
final Map<String, BuilderConfig> configs = <String, BuilderConfig>{
'linux_test_config': linuxTestConfig,
'linux_test_config2': linuxTestConfig,
'mac_test_config': macTestConfig,
Expand Down Expand Up @@ -79,7 +79,7 @@ void main() {
test('can find host runnable build', () async {
final Logger logger = Logger.test();
final (Environment env, _) = linuxEnv(logger);
final List<GlobalBuild> result = runnableBuilds(env, configs);
final List<Build> result = runnableBuilds(env, configs);
expect(result.length, equals(2));
expect(result[0].name, equals('build_name'));
});
Expand Down
Loading