blob: 9f35e6b8c6bdb41d704216de4b747114c8534e96 [file] [log] [blame] [edit]
#!/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',
];