blob: 66e486ee91bd43b68d1d08186898f0251c47df0c [file] [log] [blame]
// Copyright 2019 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.
package build
import (
"path/filepath"
"golang.org/x/exp/maps"
"golang.org/x/exp/slices"
)
const (
imageManifestName = "images"
)
// Modules is a convenience interface for accessing the various build API
// modules associated with a build.
//
// For information about each build API module, see the corresponding
// `build_api_module` target in //BUILD.gn.
type Modules struct {
buildDir string
// keep-sorted start
apis []string
archives []Archive
args Args
assemblyInputArchives []AssemblyInputArchive
assemblyManifests []AssemblyManifest
binaries []Binary
checkoutArtifacts []CheckoutArtifact
clippyTargets []ClippyTarget
generatedSources []string
images []Image
licenses []License
packageRepositories []PackageRepo
platforms []DimensionSet
prebuiltBinarySets []PrebuiltBinarySet
productBundles []ProductBundle
productSizeCheckerOutput []ProductSizeCheckerOutput
sdkArchives []SDKArchive
testDurations []TestDuration
testListLocation []string
testSpecs []TestSpec
tools Tools
// keep-sorted end
}
// NewModules returns a Modules associated with a given build directory.
func NewModules(buildDir string) (*Modules, error) {
m := &Modules{buildDir: buildDir}
buildApiClient, err := NewBuildAPIClient(buildDir)
if err != nil {
return nil, err
}
manifests := map[string]interface{}{
// keep-sorted start ignore_prefixes="
"api": &m.apis,
"archives": &m.archives,
"args": &m.args,
"assembly_input_archives": &m.assemblyInputArchives,
"assembly_manifests": &m.assemblyManifests,
"binaries": &m.binaries,
"checkout_artifacts": &m.checkoutArtifacts,
"clippy_target_mapping": &m.clippyTargets,
"generated_sources": &m.generatedSources,
imageManifestName: &m.images,
"licenses": &m.licenses,
"package-repositories": &m.packageRepositories,
"platforms": &m.platforms,
"prebuilt_binaries": &m.prebuiltBinarySets,
"product_bundles": &m.productBundles,
"product_size_checker_output": &m.productSizeCheckerOutput,
"sdk_archives": &m.sdkArchives,
"test_durations": &m.testDurations,
"test_list_location": &m.testListLocation,
"tests": &m.testSpecs,
"tool_paths": &m.tools,
// keep-sorted end
}
// Ensure we read the manifests in order, so that if multiple manifests are
// missing we always get the same error.
manifestNames := maps.Keys(manifests)
slices.Sort(manifestNames)
for _, manifest := range manifestNames {
if err := buildApiClient.GetJSON(manifest, manifests[manifest]); err != nil {
return nil, err
}
}
return m, nil
}
// BuildDir returns the fuchsia build directory root.
func (m Modules) BuildDir() string {
return m.buildDir
}
// ImageManifest returns the path to the images manifest.
func (m Modules) ImageManifest() string {
return filepath.Join(m.BuildDir(), imageManifestName+".json")
}
// APIs returns the build API module of available build API modules.
func (m Modules) APIs() []string {
return m.apis
}
func (m Modules) Archives() []Archive {
return m.archives
}
func (m Modules) Args() Args {
return m.args
}
func (m Modules) AssemblyInputArchives() []AssemblyInputArchive {
return m.assemblyInputArchives
}
func (m Modules) AssemblyManifests() []AssemblyManifest {
return m.assemblyManifests
}
func (m Modules) Binaries() []Binary {
return m.binaries
}
func (m Modules) CheckoutArtifacts() []CheckoutArtifact {
return m.checkoutArtifacts
}
func (m Modules) ClippyTargets() []ClippyTarget {
return m.clippyTargets
}
func (m Modules) GeneratedSources() []string {
return m.generatedSources
}
func (m Modules) Images() []Image {
return m.images
}
func (m Modules) Licenses() []License {
return m.licenses
}
func (m Modules) PackageRepositories() []PackageRepo {
return m.packageRepositories
}
// Platforms returns the build API module of available platforms to test on.
func (m Modules) Platforms() []DimensionSet {
return m.platforms
}
// PrebuiltBinarySets returns the build API module of prebuilt packages
// registered in the build.
func (m Modules) PrebuiltBinarySets() []PrebuiltBinarySet {
return m.prebuiltBinarySets
}
func (m Modules) ProductSizeCheckerOutput() []ProductSizeCheckerOutput {
return m.productSizeCheckerOutput
}
func (m Modules) ProductBundles() []ProductBundle {
return m.productBundles
}
func (m Modules) SDKArchives() []SDKArchive {
return m.sdkArchives
}
func (m Modules) TestDurations() []TestDuration {
return m.testDurations
}
func (m Modules) TestListLocation() []string {
return m.testListLocation
}
func (m Modules) TestSpecs() []TestSpec {
return m.testSpecs
}
func (m Modules) Tools() Tools {
return m.tools
}