// Copyright 2015 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 'base/context.dart'; import 'base/file_system.dart'; import 'base/platform.dart'; import 'base/utils.dart'; import 'globals.dart'; /// Information about a build to be performed or used. class BuildInfo { const BuildInfo(this.mode, this.flavor, {this.previewDart2, this.extraFrontEndOptions, this.extraGenSnapshotOptions}); final BuildMode mode; /// Represents a custom Android product flavor or an Xcode scheme, null for /// using the default. /// /// If not null, the Gradle build task will be `assembleFlavorMode` (e.g. /// `assemblePaidRelease`), and the Xcode build configuration will be /// Mode-Flavor (e.g. Release-Paid). final String flavor; // Whether build should be done using Dart2 Frontend parser. final bool previewDart2; /// Extra command-line options for front-end. final String extraFrontEndOptions; /// Extra command-line options for gen_snapshot. final String extraGenSnapshotOptions; static const BuildInfo debug = const BuildInfo(BuildMode.debug, null); static const BuildInfo profile = const BuildInfo(BuildMode.profile, null); static const BuildInfo release = const BuildInfo(BuildMode.release, null); /// Returns whether a debug build is requested. /// /// Exactly one of [isDebug], [isProfile], or [isRelease] is true. bool get isDebug => mode == BuildMode.debug; /// Returns whether a profile build is requested. /// /// Exactly one of [isDebug], [isProfile], or [isRelease] is true. bool get isProfile => mode == BuildMode.profile; /// Returns whether a release build is requested. /// /// Exactly one of [isDebug], [isProfile], or [isRelease] is true. bool get isRelease => mode == BuildMode.release; bool get usesAot => isAotBuildMode(mode); bool get supportsEmulator => isEmulatorBuildMode(mode); bool get supportsSimulator => isEmulatorBuildMode(mode); String get modeName => getModeName(mode); } /// The type of build - `debug`, `profile`, or `release`. enum BuildMode { debug, profile, release } String getModeName(BuildMode mode) => getEnumName(mode); BuildMode getBuildModeForName(String mode) { if (mode == 'debug') return BuildMode.debug; if (mode == 'profile') return BuildMode.profile; if (mode == 'release') return BuildMode.release; return null; } // Returns true if the selected build mode uses ahead-of-time compilation. bool isAotBuildMode(BuildMode mode) { return mode == BuildMode.profile || mode == BuildMode.release; } // Returns true if the given build mode can be used on emulators / simulators. bool isEmulatorBuildMode(BuildMode mode) => mode == BuildMode.debug; enum HostPlatform { darwin_x64, linux_x64, windows_x64, } String getNameForHostPlatform(HostPlatform platform) { switch (platform) { case HostPlatform.darwin_x64: return 'darwin-x64'; case HostPlatform.linux_x64: return 'linux-x64'; case HostPlatform.windows_x64: return 'windows-x64'; } assert(false); return null; } enum TargetPlatform { android_arm, android_x64, android_x86, ios, darwin_x64, linux_x64, windows_x64, fuchsia, } String getNameForTargetPlatform(TargetPlatform platform) { switch (platform) { case TargetPlatform.android_arm: return 'android-arm'; case TargetPlatform.android_x64: return 'android-x64'; case TargetPlatform.android_x86: return 'android-x86'; case TargetPlatform.ios: return 'ios'; case TargetPlatform.darwin_x64: return 'darwin-x64'; case TargetPlatform.linux_x64: return 'linux-x64'; case TargetPlatform.windows_x64: return 'windows-x64'; case TargetPlatform.fuchsia: return 'fuchsia'; } assert(false); return null; } TargetPlatform getTargetPlatformForName(String platform) { switch (platform) { case 'android-arm': return TargetPlatform.android_arm; case 'android-x64': return TargetPlatform.android_x64; case 'android-x86': return TargetPlatform.android_x86; case 'ios': return TargetPlatform.ios; case 'darwin-x64': return TargetPlatform.darwin_x64; case 'linux-x64': return TargetPlatform.linux_x64; } assert(platform != null); return null; } HostPlatform getCurrentHostPlatform() { if (platform.isMacOS) return HostPlatform.darwin_x64; if (platform.isLinux) return HostPlatform.linux_x64; if (platform.isWindows) return HostPlatform.windows_x64; printError('Unsupported host platform, defaulting to Linux'); return HostPlatform.linux_x64; } /// Returns the top-level build output directory. String getBuildDirectory() { // TODO(johnmccutchan): Stop calling this function as part of setting // up command line argument processing. if (context == null || config == null) return 'build'; final String buildDir = config.getValue('build-dir') ?? 'build'; if (fs.path.isAbsolute(buildDir)) { throw new Exception( 'build-dir config setting in ${config.configPath} must be relative'); } return buildDir; } /// Returns the Android build output directory. String getAndroidBuildDirectory() { // TODO(cbracken) move to android subdir. return getBuildDirectory(); } /// Returns the AOT build output directory. String getAotBuildDirectory() { return fs.path.join(getBuildDirectory(), 'aot'); } /// Returns the asset build output directory. String getAssetBuildDirectory() { return fs.path.join(getBuildDirectory(), 'flx'); } /// Returns the iOS build output directory. String getIosBuildDirectory() { return fs.path.join(getBuildDirectory(), 'ios'); } /// Returns directory used by incremental compiler (IKG - incremental kernel /// generator) to store cached intermediate state. String getIncrementalCompilerByteStoreDirectory() { return fs.path.join(getBuildDirectory(), 'ikg_byte_store'); }