5eb7ee9fad
This change contains a prototype implementation for multitree. Several interfaces and modules are added. 1. Imported/Exported Modules implementing Exportable interface can export artifacts to other components. "imported_filegroup" modules can import generated artifacts from other exported modules. 2. Multitree metadata It contains information about imported/exported modules in each component, and can be generated via "m update-meta". 3. cc library stub It's based on prototype stub libraries. It uses imported/exported mechanism to expose a C API, with a map.txt file and header files. Bug: 230448564 Test: m Change-Id: Id7ff7618e2c630c5617a564d8b23b60a1cc9c8e8
119 lines
3.3 KiB
Go
119 lines
3.3 KiB
Go
// Copyright 2021 Google Inc. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package multitree
|
|
|
|
import (
|
|
"android/soong/android"
|
|
"fmt"
|
|
|
|
"github.com/google/blueprint"
|
|
)
|
|
|
|
var (
|
|
pctx = android.NewPackageContext("android/soong/multitree")
|
|
)
|
|
|
|
func init() {
|
|
RegisterApiSurfaceBuildComponents(android.InitRegistrationContext)
|
|
}
|
|
|
|
var PrepareForTestWithApiSurface = android.FixtureRegisterWithContext(RegisterApiSurfaceBuildComponents)
|
|
|
|
func RegisterApiSurfaceBuildComponents(ctx android.RegistrationContext) {
|
|
ctx.RegisterModuleType("api_surface", ApiSurfaceFactory)
|
|
}
|
|
|
|
type ApiSurface struct {
|
|
android.ModuleBase
|
|
ExportableModuleBase
|
|
properties apiSurfaceProperties
|
|
|
|
allOutputs android.Paths
|
|
taggedOutputs map[string]android.Paths
|
|
}
|
|
|
|
type apiSurfaceProperties struct {
|
|
Contributions []string
|
|
}
|
|
|
|
func ApiSurfaceFactory() android.Module {
|
|
module := &ApiSurface{}
|
|
module.AddProperties(&module.properties)
|
|
android.InitAndroidModule(module)
|
|
InitExportableModule(module)
|
|
return module
|
|
}
|
|
|
|
func (surface *ApiSurface) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
if surface.properties.Contributions != nil {
|
|
ctx.AddVariationDependencies(nil, nil, surface.properties.Contributions...)
|
|
}
|
|
|
|
}
|
|
func (surface *ApiSurface) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
contributionFiles := make(map[string]android.Paths)
|
|
var allOutputs android.Paths
|
|
ctx.WalkDeps(func(child, parent android.Module) bool {
|
|
if contribution, ok := child.(ApiContribution); ok {
|
|
copied := contribution.CopyFilesWithTag(ctx)
|
|
for tag, files := range copied {
|
|
contributionFiles[child.Name()+"#"+tag] = files
|
|
}
|
|
for _, paths := range copied {
|
|
allOutputs = append(allOutputs, paths...)
|
|
}
|
|
return false // no transitive dependencies
|
|
}
|
|
return false
|
|
})
|
|
|
|
// phony target
|
|
ctx.Build(pctx, android.BuildParams{
|
|
Rule: blueprint.Phony,
|
|
Output: android.PathForPhony(ctx, ctx.ModuleName()),
|
|
Inputs: allOutputs,
|
|
})
|
|
|
|
surface.allOutputs = allOutputs
|
|
surface.taggedOutputs = contributionFiles
|
|
}
|
|
|
|
func (surface *ApiSurface) OutputFiles(tag string) (android.Paths, error) {
|
|
if tag != "" {
|
|
return nil, fmt.Errorf("unknown tag: %q", tag)
|
|
}
|
|
return surface.allOutputs, nil
|
|
}
|
|
|
|
func (surface *ApiSurface) TaggedOutputs() map[string]android.Paths {
|
|
return surface.taggedOutputs
|
|
}
|
|
|
|
func (surface *ApiSurface) Exportable() bool {
|
|
return true
|
|
}
|
|
|
|
var _ android.OutputFileProducer = (*ApiSurface)(nil)
|
|
var _ Exportable = (*ApiSurface)(nil)
|
|
|
|
type ApiContribution interface {
|
|
// copy files necessaryt to construct an API surface
|
|
// For C, it will be map.txt and .h files
|
|
// For Java, it will be api.txt
|
|
CopyFilesWithTag(ctx android.ModuleContext) map[string]android.Paths // output paths
|
|
|
|
// Generate Android.bp in out/ to use the exported .txt files
|
|
// GenerateBuildFiles(ctx ModuleContext) Paths //output paths
|
|
}
|