blob: 1b9a24481c5852ea20ec99743953e7bd982b5bfe [file] [log] [blame] [edit]
// Copyright (c) 2025, 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 'package:hooks/hooks.dart';
import 'architecture.dart';
import 'c_compiler_config.dart';
import 'code_asset.dart';
import 'config.dart';
import 'link_mode_preference.dart';
import 'os.dart';
import 'validation.dart';
/// The protocol extension for the `hook/build.dart` and `hook/link.dart`
/// with [CodeAsset]s and [CodeConfig].
final class CodeAssetExtension implements ProtocolExtension {
/// The architecture to build for.
final Architecture targetArchitecture;
/// The operating system to build for.
final OS targetOS;
/// The preferred link mode.
final LinkModePreference linkModePreference;
/// Optional C compiler configuration.
final CCompilerConfig? cCompiler;
/// Optional Android specific configuration.
///
/// Required if [targetOS] is [OS.android].
final AndroidCodeConfig? android;
/// Optional iOS specific configuration.
///
/// Required if [targetOS] is [OS.iOS].
final IOSCodeConfig? iOS;
/// Optional macOS specific configuration.
///
/// Required if [targetOS] is [OS.macOS].
final MacOSCodeConfig? macOS;
/// Constructs a [CodeAssetExtension].
CodeAssetExtension({
required this.targetArchitecture,
required this.targetOS,
required this.linkModePreference,
this.cCompiler,
this.android,
this.iOS,
this.macOS,
});
@override
void setupBuildInput(BuildInputBuilder input) {
_setupConfig(input);
}
@override
void setupLinkInput(LinkInputBuilder input) {
_setupConfig(input);
}
void _setupConfig(HookInputBuilder input) {
input.config.addBuildAssetTypes([CodeAssetType.type]);
input.config.setupCode(
targetArchitecture: targetArchitecture,
targetOS: targetOS,
linkModePreference: linkModePreference,
cCompiler: cCompiler,
android: android,
iOS: iOS,
macOS: macOS,
);
}
@override
Future<ValidationErrors> validateBuildInput(BuildInput input) =>
validateCodeAssetBuildInput(input);
@override
Future<ValidationErrors> validateLinkInput(LinkInput input) =>
validateCodeAssetLinkInput(input);
@override
Future<ValidationErrors> validateBuildOutput(
BuildInput input,
BuildOutput output,
) => validateCodeAssetBuildOutput(input, output);
@override
Future<ValidationErrors> validateLinkOutput(
LinkInput input,
LinkOutput output,
) => validateCodeAssetLinkOutput(input, output);
@override
Future<ValidationErrors> validateApplicationAssets(
List<EncodedAsset> assets,
) => validateCodeAssetInApplication(assets);
}