blob: ec125f2c92ba5ef825f0bdcdcd7cae2e1c95703b [file] [log] [blame]
#!/usr/bin/env dart
// Copyright (c) 2025, 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:io';
import 'package:args/args.dart';
import 'package:front_end/src/util/trim.dart';
import 'package:kernel/target/targets.dart';
import 'package:vm/modular/target/flutter.dart';
/// Helper script to invoke [createTrimmedCopy] as a command-line tool given a
/// `dynamic_interface.yaml` input file.
Future<void> main(List<String> args) async {
ArgResults argResults;
try {
argResults = _argParser.parse(args);
} on ArgParserException catch (e) {
print(e.message);
print(_argParser.usage);
exit(1);
}
if (args.length < 2) {
print(_argParser.usage);
exit(1);
}
String? dynamicInterfacePath = argResults['dynamic-interface'] as String?;
File? dynamicInterface = dynamicInterfacePath != null
? File(dynamicInterfacePath)
: null;
await createTrimmedCopy(
TrimOptions(
inputAppPath: argResults['input'] as String,
inputPlatformPath: argResults['platform'] as String,
outputAppPath: argResults['output'] as String,
outputPlatformPath: argResults['output-platform'] as String?,
dynamicInterfaceUri: dynamicInterface?.uri,
dynamicInterfaceContents: dynamicInterface?.readAsStringSync(),
requiredUserLibraries:
(argResults['required-user-libraries'] as List<String>).toSet(),
requiredDartLibraries: FlutterTarget(
TargetFlags(),
).extraRequiredLibraries.toSet(),
librariesToClear: (argResults['clear-dart-library-body'] as List<String>)
.toSet(),
),
);
}
final ArgParser _argParser = ArgParser()
..addOption(
'input',
help: 'Input application dill file path',
mandatory: true,
)
..addOption(
'platform',
help: 'Input platform dill file path',
mandatory: true,
)
..addOption(
'output',
help: 'Output application dill file path',
mandatory: true,
)
..addOption('output-platform', help: 'Output platform dill file path')
..addOption(
'dynamic-interface',
help: 'Path to the dynamic_interface.yaml file',
)
..addMultiOption(
'clear-dart-library-body',
abbr: 'c',
help:
'List of `dart:` that, even though are required, can be cleared '
'internally since they are only included for compatibility with '
'"extraRequiredLibraries", but are not needed for compilation',
defaultsTo: defaultNonProductionLibraries,
)
..addMultiOption(
'required-user-libraries',
abbr: 'u',
help:
'Alternative to providing a dynamic_interface.yaml input. '
'Specifies the list of necessary user written '
'libraries. Can be a full `package:` URI or a prefix pattern, '
'like `package:foo/*`.',
defaultsTo: const [],
);
/// Libraries that are not needed for production builds and that should
/// be possible to clear when trimming .dill files.
const List<String> defaultNonProductionLibraries = [
'dart:mirrors',
'dart:developer',
'dart:ffi',
'dart:vmservice_io',
'dart:isolate ',
'dart:_vmservice',
'dart:cli',
];