blob: 47a7255f8af342be45d76a4adbdcac349476f6ab [file] [log] [blame]
// Copyright 2013 The Flutter 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:ffi' as ffi;
import 'dart:io' as io;
import 'package:path/path.dart' as pathlib;
import 'exceptions.dart';
/// Contains various environment variables, such as common file paths and command-line options.
Environment get environment {
return _environment ??= Environment();
}
Environment? _environment;
/// Contains various environment variables, such as common file paths and command-line options.
class Environment {
factory Environment() {
final bool isMacosArm = ffi.Abi.current() == ffi.Abi.macosArm64;
final io.File dartExecutable = io.File(io.Platform.resolvedExecutable);
final io.File self = io.File.fromUri(io.Platform.script);
final io.Directory engineSrcDir = self.parent.parent.parent.parent.parent;
final io.Directory engineToolsDir = io.Directory(
pathlib.join(engineSrcDir.path, 'flutter', 'tools'),
);
final io.Directory outDir = io.Directory(pathlib.join(engineSrcDir.path, 'out'));
final io.Directory wasmReleaseOutDir = io.Directory(pathlib.join(outDir.path, 'wasm_release'));
final io.Directory wasmProfileOutDir = io.Directory(pathlib.join(outDir.path, 'wasm_profile'));
final io.Directory wasmDebugUnoptOutDir = io.Directory(
pathlib.join(outDir.path, 'wasm_debug_unopt'),
);
final io.Directory hostDebugUnoptDir = io.Directory(
pathlib.join(outDir.path, 'host_debug_unopt'),
);
final io.Directory dartSdkDir = dartExecutable.parent.parent;
final io.Directory webUiRootDir = io.Directory(
pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui'),
);
for (final io.Directory expectedDirectory in <io.Directory>[engineSrcDir, webUiRootDir]) {
if (!expectedDirectory.existsSync()) {
throw ToolExit('$expectedDirectory does not exist.');
}
}
return Environment._(
self: self,
isMacosArm: isMacosArm,
webUiRootDir: webUiRootDir,
engineSrcDir: engineSrcDir,
engineToolsDir: engineToolsDir,
outDir: outDir,
wasmReleaseOutDir: wasmReleaseOutDir,
wasmProfileOutDir: wasmProfileOutDir,
wasmDebugUnoptOutDir: wasmDebugUnoptOutDir,
hostDebugUnoptDir: hostDebugUnoptDir,
dartSdkDir: dartSdkDir,
);
}
Environment._({
required this.self,
required this.isMacosArm,
required this.webUiRootDir,
required this.engineSrcDir,
required this.engineToolsDir,
required this.outDir,
required this.wasmReleaseOutDir,
required this.wasmProfileOutDir,
required this.wasmDebugUnoptOutDir,
required this.hostDebugUnoptDir,
required this.dartSdkDir,
});
/// The Dart script that's currently running.
final io.File self;
/// Whether the environment is a macOS arm environment.
final bool isMacosArm;
/// Path to the "web_ui" package sources.
final io.Directory webUiRootDir;
/// Path to the engine's "src" directory.
final io.Directory engineSrcDir;
/// Path to the engine's "tools" directory.
final io.Directory engineToolsDir;
/// Path to the engine's "out" directory.
///
/// This is where you'll find the ninja output, such as the Dart SDK.
final io.Directory outDir;
/// The output directory for the wasm_release build.
///
/// We build CanvasKit in release mode to reduce code size.
final io.Directory wasmReleaseOutDir;
/// The output directory for the wasm_profile build.
final io.Directory wasmProfileOutDir;
/// The output directory for the wasm_debug build.
final io.Directory wasmDebugUnoptOutDir;
/// The output directory for the host_debug_unopt build.
final io.Directory hostDebugUnoptDir;
/// The root of the Dart SDK.
final io.Directory dartSdkDir;
/// The "dart" executable file.
String get dartExecutable => pathlib.join(dartSdkDir.path, 'bin', 'dart');
/// Path to dartaotruntime for running aot snapshots
String get dartAotRuntimePath => pathlib.join(dartSdkDir.path, 'bin', 'dartaotruntime');
/// The "pub" executable file.
String get pubExecutable => pathlib.join(dartSdkDir.path, 'bin', 'pub');
/// The path to dart2wasm pre-compiled snapshot
String get dart2wasmSnapshotPath =>
pathlib.join(dartSdkDir.path, 'bin', 'snapshots', 'dart2wasm_product.snapshot');
/// The path to dart2wasm.dart file
String get dart2wasmScriptPath => pathlib.join(
engineSrcDir.path,
'third_party',
'dart',
'pkg',
'dart2wasm',
'bin',
'dart2wasm.dart',
);
/// Path to where github.com/flutter/engine is checked out inside the engine workspace.
io.Directory get flutterDirectory => io.Directory(pathlib.join(engineSrcDir.path, 'flutter'));
io.Directory get webSdkRootDir => io.Directory(pathlib.join(flutterDirectory.path, 'web_sdk'));
/// Path to the "web_engine_tester" package.
io.Directory get webEngineTesterRootDir =>
io.Directory(pathlib.join(webSdkRootDir.path, 'web_engine_tester'));
/// Path to the "build" directory, generated by "package:build_runner".
///
/// This is where compiled test output goes.
io.Directory get webUiBuildDir => io.Directory(pathlib.join(outDir.path, 'web_tests'));
io.Directory get webTestsArtifactsDir =>
io.Directory(pathlib.join(webUiBuildDir.path, 'artifacts'));
/// Path to the ".dart_tool" directory, generated by various Dart tools.
io.Directory get webUiDartToolDir => io.Directory(pathlib.join(webUiRootDir.path, '.dart_tool'));
/// Path to the ".dart_tool" directory living under `engine/src/flutter`.
///
/// This is a designated area for tool downloads which can be used by
/// multiple platforms. For exampe: Flutter repo for e2e tests.
io.Directory get engineDartToolDir =>
io.Directory(pathlib.join(engineSrcDir.path, 'flutter', '.dart_tool'));
/// Path to the "dev" directory containing engine developer tools and
/// configuration files.
io.Directory get webUiDevDir => io.Directory(pathlib.join(webUiRootDir.path, 'dev'));
/// Path to the "test" directory containing web engine tests.
io.Directory get webUiTestDir => io.Directory(pathlib.join(webUiRootDir.path, 'test'));
/// Path to the "lib" directory containing web engine code.
io.Directory get webUiLibDir => io.Directory(pathlib.join(webUiRootDir.path, 'lib'));
/// Path to the base directory to be used by Skia Gold.
io.Directory get webUiSkiaGoldDirectory =>
io.Directory(pathlib.join(webUiDartToolDir.path, 'skia_gold'));
/// Directory to add test results which would later be uploaded to a gcs
/// bucket by LUCI.
io.Directory get webUiTestResultsDirectory =>
io.Directory(pathlib.join(webUiDartToolDir.path, 'test_results'));
}