build_aot.dart 3.22 KB
Newer Older
1 2 3 4 5 6
// Copyright 2016 The Chromium Authors. 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:async';

xster's avatar
xster committed
7
import '../aot.dart';
8
import '../base/common.dart';
9
import '../build_info.dart';
xster's avatar
xster committed
10
import '../ios/bitcode.dart';
11
import '../resident_runner.dart';
12
import '../runner/flutter_command.dart';
13
import 'build.dart';
14

xster's avatar
xster committed
15
/// Builds AOT snapshots into platform specific library containers.
16
class BuildAotCommand extends BuildSubCommand with TargetPlatformBasedDevelopmentArtifacts {
xster's avatar
xster committed
17
  BuildAotCommand({bool verboseHelp = false, this.aotBuilder}) {
18 19 20
    usesTargetOption();
    addBuildModeFlags();
    usesPubOption();
21
    argParser
22
      ..addOption('output-dir', defaultsTo: getAotBuildDirectory())
23 24
      ..addOption('target-platform',
        defaultsTo: 'android-arm',
25
        allowed: <String>['android-arm', 'android-arm64', 'ios', 'android-x64'],
26
      )
27
      ..addFlag('quiet', defaultsTo: false)
28 29 30 31 32
      ..addFlag('report-timings',
        negatable: false,
        defaultsTo: false,
        help: 'Report timing information about build steps in machine readable form,',
      )
33 34
      ..addMultiOption('ios-arch',
        splitCommas: true,
35 36
        defaultsTo: defaultIOSArchs.map<String>(getNameForDarwinArch),
        allowed: DarwinArch.values.map<String>(getNameForDarwinArch),
37
        help: 'iOS architectures to build.',
38
      )
39
      ..addMultiOption(FlutterOptions.kExtraFrontEndOptions,
40 41 42
        splitCommas: true,
        hide: true,
      )
43
      ..addMultiOption(FlutterOptions.kExtraGenSnapshotOptions,
44 45
        splitCommas: true,
        hide: true,
46 47
      )
      ..addFlag('bitcode',
xster's avatar
xster committed
48
        defaultsTo: kBitcodeEnabledDefault,
49 50
        help: 'Build the AOT bundle with bitcode. Requires a compatible bitcode engine.',
        hide: true,
51
      );
52 53 54 55
    // --track-widget-creation is exposed as a flag here to deal with build
    // invalidation issues, but it is ignored -- there are no plans to support
    // it for AOT mode.
    usesTrackWidgetCreation(hasEffect: false, verboseHelp: verboseHelp);
56 57
  }

xster's avatar
xster committed
58 59
  AotBuilder aotBuilder;

60 61 62 63
  @override
  final String name = 'aot';

  @override
64
  final String description = "Build an ahead-of-time compiled snapshot of your app's Dart code.";
65 66

  @override
67
  Future<FlutterCommandResult> runCommand() async {
68 69
    final String targetPlatform = argResults['target-platform'];
    final TargetPlatform platform = getTargetPlatformForName(targetPlatform);
70 71
    final String outputPath = argResults['output-dir'] ?? getAotBuildDirectory();
    final BuildMode buildMode = getBuildMode();
72
    if (platform == null) {
73
      throwToolExit('Unknown platform: $targetPlatform');
74
    }
75

xster's avatar
xster committed
76 77 78 79 80 81 82 83 84 85 86 87 88
    aotBuilder ??= AotBuilder();

    await aotBuilder.build(
      platform: platform,
      outputPath: outputPath,
      buildMode: buildMode,
      mainDartFile: findMainDartFile(targetFile),
      bitcode: argResults['bitcode'],
      quiet: argResults['quiet'],
      reportTimings: argResults['report-timings'],
      iosBuildArchs: argResults['ios-arch'].map<DarwinArch>(getIOSArchForName),
      extraFrontEndOptions: argResults[FlutterOptions.kExtraFrontEndOptions],
      extraGenSnapshotOptions: argResults[FlutterOptions.kExtraGenSnapshotOptions],
89
    );
xster's avatar
xster committed
90
    return null;
91 92
  }
}