| // Copyright 2020 The Fuchsia 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 'package:fxutils/fxutils.dart'; |
| import 'package:meta/meta.dart'; |
| import 'package:path/path.dart' as p; |
| |
| abstract class IFxEnv { |
| String getEnv(String variableName, [String defaultValue]); |
| |
| /// Path to the fx executable. |
| String get fx => p.join(fuchsiaDir, fxLocation); |
| String get sshKey; |
| String get outputDir; |
| String get fuchsiaDir; |
| String get fuchsiaArch; |
| String get hostOutDir; |
| String get zirconBuildRoot; |
| String get zirconToolsDir; |
| String get cwd; |
| |
| /// Relative path to the current output directory from the root of the Fuchsia |
| /// checkout. |
| String get relativeOutputDir => outputDir?.substring(fuchsiaDir.length); |
| |
| /// GN absolute path to the output directory (e.g., "//out/default"). |
| String get userFriendlyOutputDir => |
| relativeOutputDir != outputDir ? '/$relativeOutputDir' : outputDir; |
| |
| /// Relative path between the current working directory and the output |
| /// directory. |
| String get relativeCwd { |
| // `startingDir` asked for from the output root |
| if (cwd == outputDir) { |
| return cwdToken; |
| } |
| |
| // `cwd` asked for from *within* the output directory |
| if (p.isWithin(outputDir, cwd)) { |
| return p.relative(cwd, from: outputDir); |
| } |
| |
| // All other situations, return the actual starting directory. |
| return cwd; |
| } |
| } |
| |
| /// Usage: |
| /// ```dart |
| /// final fxEnv = FxEnv.env(Platform.environment); |
| /// |
| /// // Get the absolute path to the fx executable |
| /// String fxPath = fxEnv.fx; |
| /// |
| /// // Get the path to the directory of your current active build |
| /// String buildPath = fxEnv.outputDir; |
| /// ``` |
| class FxEnv extends IFxEnv { |
| final EnvReader _envReader; |
| FxEnv({@required EnvReader envReader}) |
| : assert(envReader != null), |
| _envReader = envReader; |
| |
| factory FxEnv.env(Map<String, String> env, {String cwd = '/cwd'}) => |
| FxEnv(envReader: EnvReader(environment: env, cwd: cwd)); |
| |
| @override |
| String getEnv(String variableName, [String defaultValue]) => |
| _envReader.getEnv(variableName, defaultValue); |
| |
| /// Path to the ssh key required to reach the device. |
| @override |
| String get sshKey => _envReader.getEnv('FUCHSIA_SSH_KEY'); |
| |
| /// Absolute path to the build directory. Read from the environment variable. |
| @override |
| String get outputDir => _envReader.getEnv('FUCHSIA_BUILD_DIR'); |
| |
| /// Absolute path to the root of the Fuchsia checkout. Read from the |
| /// environment variable. |
| @override |
| String get fuchsiaDir => _envReader.getEnv('FUCHSIA_DIR'); |
| |
| /// The current architecture selected (currently one of x64/arm64) |
| @override |
| String get fuchsiaArch => _envReader.getEnv('FUCHSIA_ARCH'); |
| |
| /// The path to the Fuchsia host-tools build directory |
| /// (usually $FUCHSIA_BUILD_DIR/host_$HOST_ARCH) |
| @override |
| String get hostOutDir => _envReader.getEnv('HOST_OUT_DIR'); |
| |
| @override |
| String get zirconBuildRoot => _envReader.getEnv('ZIRCON_BUILDROOT'); |
| |
| @override |
| String get zirconToolsDir => _envReader.getEnv('ZIRCON_TOOLS_DIR'); |
| |
| /// Current working directory. Pulled from the OS. |
| @override |
| String get cwd => _envReader.getCwd(); |
| } |