tool_backend.dart 4.74 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
// Do not add package imports to this file.
6 7
import 'dart:convert'; // flutter_ignore: dart_convert_import.
import 'dart:io'; // flutter_ignore: dart_io_import.
8

9
/// Executes the required Flutter tasks for a desktop build.
10 11
Future<void> main(List<String> arguments) async {
  final String targetPlatform = arguments[0];
12
  final String buildMode = arguments[1].toLowerCase();
13

14
  final String? dartDefines = Platform.environment['DART_DEFINES'];
15
  final bool dartObfuscation = Platform.environment['DART_OBFUSCATION'] == 'true';
16 17 18 19
  final String? extraFrontEndOptions = Platform.environment['EXTRA_FRONT_END_OPTIONS'];
  final String? extraGenSnapshotOptions = Platform.environment['EXTRA_GEN_SNAPSHOT_OPTIONS'];
  final String? flutterEngine = Platform.environment['FLUTTER_ENGINE'];
  final String? flutterRoot = Platform.environment['FLUTTER_ROOT'];
20
  final String flutterTarget = Platform.environment['FLUTTER_TARGET']
21
    ?? pathJoin(<String>['lib', 'main.dart']);
22 23 24 25 26
  final String? codeSizeDirectory = Platform.environment['CODE_SIZE_DIRECTORY'];
  final String? localEngine = Platform.environment['LOCAL_ENGINE'];
  final String? projectDirectory = Platform.environment['PROJECT_DIR'];
  final String? splitDebugInfo = Platform.environment['SPLIT_DEBUG_INFO'];
  final String? bundleSkSLPath = Platform.environment['BUNDLE_SKSL_PATH'];
27 28 29
  final bool trackWidgetCreation = Platform.environment['TRACK_WIDGET_CREATION'] == 'true';
  final bool treeShakeIcons = Platform.environment['TREE_SHAKE_ICONS'] == 'true';
  final bool verbose = Platform.environment['VERBOSE_SCRIPT_LOGGING'] == 'true';
30
  final bool prefixedErrors = Platform.environment['PREFIXED_ERROR_LOGGING'] == 'true';
31

32 33 34 35 36 37 38 39 40
  if (projectDirectory == null) {
    stderr.write('PROJECT_DIR environment variable must be set to the location of Flutter project to be built.');
    exit(1);
  }
  if (flutterRoot == null || flutterRoot.isEmpty) {
    stderr.write('FLUTTER_ROOT environment variable must be set to the location of the Flutter SDK.');
    exit(1);
  }

41 42 43 44 45 46 47 48
  Directory.current = projectDirectory;

  if (localEngine != null && !localEngine.contains(buildMode)) {
    stderr.write('''
ERROR: Requested build with Flutter local engine at '$localEngine'
This engine is not compatible with FLUTTER_BUILD_MODE: '$buildMode'.
You can fix this by updating the LOCAL_ENGINE environment variable, or
by running:
49
  flutter build <platform> --local-engine=host_$buildMode
50
or
51
  flutter build <platform> --local-engine=host_${buildMode}_unopt
52 53 54 55
========================================================================
''');
    exit(1);
  }
56 57 58 59 60 61
  final String flutterExecutable = pathJoin(<String>[
    flutterRoot,
    'bin',
    if (Platform.isWindows)
      'flutter.bat'
    else
62
      'flutter',
63
  ]);
64
  final String bundlePlatform = targetPlatform.startsWith('windows') ? 'windows' : targetPlatform;
65
  final String target = '${buildMode}_bundle_${bundlePlatform}_assets';
66
  final Process assembleProcess = await Process.start(
67 68
    flutterExecutable,
    <String>[
69 70
      if (verbose)
        '--verbose',
71 72
      if (prefixedErrors)
        '--prefixed-errors',
73 74
      if (flutterEngine != null) '--local-engine-src-path=$flutterEngine',
      if (localEngine != null) '--local-engine=$localEngine',
75
      'assemble',
76
      '--no-version-check',
77
      '--output=build',
78
      '-dTargetPlatform=$targetPlatform',
79
      '-dTrackWidgetCreation=$trackWidgetCreation',
80
      '-dBuildMode=$buildMode',
81
      '-dTargetFile=$flutterTarget',
82 83
      '-dTreeShakeIcons="$treeShakeIcons"',
      '-dDartObfuscation=$dartObfuscation',
84
      if (bundleSkSLPath != null)
85
        '-dBundleSkSLPath=$bundleSkSLPath',
86 87
      if (codeSizeDirectory != null)
        '-dCodeSizeDirectory=$codeSizeDirectory',
88 89 90 91 92 93 94
      if (splitDebugInfo != null)
        '-dSplitDebugInfo=$splitDebugInfo',
      if (dartDefines != null)
        '--DartDefines=$dartDefines',
      if (extraGenSnapshotOptions != null)
        '--ExtraGenSnapshotOptions=$extraGenSnapshotOptions',
      if (extraFrontEndOptions != null)
95
        '--ExtraFrontEndOptions=$extraFrontEndOptions',
96 97 98 99 100 101 102 103 104 105 106 107 108
      target,
    ],
  );
  assembleProcess.stdout
    .transform(utf8.decoder)
    .transform(const LineSplitter())
    .listen(stdout.writeln);
  assembleProcess.stderr
    .transform(utf8.decoder)
    .transform(const LineSplitter())
    .listen(stderr.writeln);

  if (await assembleProcess.exitCode != 0) {
109 110 111
    exit(1);
  }
}
112 113 114 115 116 117 118 119

/// Perform a simple path join on the segments based on the current platform.
///
/// Does not normalize paths that have repeated separators.
String pathJoin(List<String> segments) {
  final String separator = Platform.isWindows ? r'\' : '/';
  return segments.join(separator);
}