// 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 'dart:io'; import 'package:path/path.dart' as path; import 'base/context.dart'; import 'build_info.dart'; import 'cache.dart'; import 'globals.dart'; enum HostTool { SkySnapshot, SkyShell, } const Map<HostTool, String> _kHostToolFileName = const <HostTool, String>{ HostTool.SkySnapshot: 'sky_snapshot', HostTool.SkyShell: 'sky_shell', }; /// A ToolConfiguration can return the tools directory for the current host platform /// and the engine artifact directory for a given target platform. It is configurable /// via command-line arguments in order to support local engine builds. class ToolConfiguration { /// [overrideCache] is configurable for testing. ToolConfiguration({ Cache overrideCache }) { _cache = overrideCache ?? cache; } Cache _cache; static ToolConfiguration get instance { if (context[ToolConfiguration] == null) context[ToolConfiguration] = new ToolConfiguration(); return context[ToolConfiguration]; } /// Override using the artifacts from the cache directory (--engine-src-path). String engineSrcPath; /// Path to a local engine build acting as a source for artifacts (--local-engine). String engineBuildPath; bool get isLocalEngine => engineSrcPath != null; /// Return the directory that contains engine artifacts for the given targets. /// This directory might contain artifacts like `libsky_shell.so`. Directory getEngineArtifactsDirectory(TargetPlatform platform, BuildMode mode) { Directory dir = _getEngineArtifactsDirectory(platform, mode); if (dir != null) printTrace('Using engine artifacts dir: ${dir.path}'); return dir; } Directory _getEngineArtifactsDirectory(TargetPlatform platform, BuildMode mode) { if (engineBuildPath != null) { return new Directory(engineBuildPath); } else { String suffix = mode != BuildMode.debug ? '-${getModeName(mode)}' : ''; // Create something like `android-arm` or `android-arm-release`. String dirName = getNameForTargetPlatform(platform) + suffix; Directory engineDir = _cache.getArtifactDirectory('engine'); return new Directory(path.join(engineDir.path, dirName)); } } String getHostToolPath(HostTool tool) { if (engineBuildPath == null) { return path.join(_cache.getArtifactDirectory('engine').path, getNameForHostPlatform(getCurrentHostPlatform()), _kHostToolFileName[tool]); } if (tool == HostTool.SkySnapshot) { String clangPath = path.join(engineBuildPath, 'clang_x64', 'sky_snapshot'); if (FileSystemEntity.isFileSync(clangPath)) return clangPath; return path.join(engineBuildPath, 'sky_snapshot'); } else if (tool == HostTool.SkyShell) { if (getCurrentHostPlatform() == HostPlatform.linux_x64) { return path.join(engineBuildPath, 'sky_shell'); } else if (getCurrentHostPlatform() == HostPlatform.darwin_x64) { return path.join(engineBuildPath, 'SkyShell.app', 'Contents', 'MacOS', 'SkyShell'); } } throw 'Unexpected host tool: $tool'; } }