blob: eb1d073f61e2a74283c9679170eb18c59e914d7d [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. 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:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:path/path.dart' as p;
/// Relative path to the asset graph from the root package dir.
final String assetGraphPath = assetGraphPathFor(_scriptPath);
/// Relative path to the asset graph for a build script at [path]
String assetGraphPathFor(String path) =>
'$cacheDir/${_scriptHashFor(path)}/asset_graph.json';
/// Relative path to the directory which holds serialized versions of errors
/// reported during previous builds.
final errorCachePath =
p.url.join(cacheDir, _scriptHashFor(_scriptPath), 'error_cache');
final String _scriptPath = Platform.script.scheme == 'file'
? p.url.joinAll(
p.split(p.relative(Platform.script.toFilePath(), from: p.current)))
: Platform.script.path;
/// Directory containing automatically generated build entrypoints.
///
/// Files in this directory must be read to do build script invalidation.
const entryPointDir = '$cacheDir/entrypoint';
/// The directory to which hidden assets will be written.
String get generatedOutputDirectory => '$cacheDir/$_generatedOutputDirectory';
/// Locks the generated directory name for the duration of this process.
///
/// This should be invoked before any builds start.
void lockGeneratedOutputDirectory() => _generatedOutputDirectoryIsLocked = true;
/// The default generated dir name. Can be modified with
/// [overrideGeneratedOutputDirectory].
String _generatedOutputDirectory = 'generated';
/// Whether or not the [generatedOutputDirectory] is locked. This must be `true`
/// before you can access [generatedOutputDirectory];
bool _generatedOutputDirectoryIsLocked = false;
/// Overrides the generated directory name.
///
/// This is interpreted as a relative path under the [cacheDir].
void overrideGeneratedOutputDirectory(String path) {
if (_generatedOutputDirectory != 'generated') {
throw StateError('You can only override the generated dir once.');
} else if (_generatedOutputDirectoryIsLocked) {
throw StateError(
'Attempted to override the generated dir after it was locked.');
} else if (!p.isRelative(path)) {
throw StateError('Only relative paths are accepted for the generated dir '
'but got `$path`.');
}
_generatedOutputDirectory = path;
}
/// Relative path to the cache directory from the root package dir.
const String cacheDir = '.dart_tool/build';
/// Returns a hash for a given Dart script path.
///
/// Normalizes between snapshot and Dart source file paths so they give the same
/// hash.
String _scriptHashFor(String path) => md5
.convert(utf8.encode(
path.endsWith('.snapshot') ? path.substring(0, path.length - 9) : path))
.toString();
/// The name of the pub binary on the current platform.
final pubBinary = p.join(sdkBin, Platform.isWindows ? 'pub.bat' : 'pub');
/// The path to the sdk bin directory on the current platform.
final sdkBin = p.join(sdkPath, 'bin');
/// The path to the sdk on the current platform.
final sdkPath = p.dirname(p.dirname(Platform.resolvedExecutable));
/// The maximum number of concurrent actions to run per build phase.
const buildPhasePoolSize = 16;