123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- // Copyright 2023 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 aidl_library
- import (
- "android/soong/android"
- "android/soong/bazel"
- "github.com/google/blueprint"
- "github.com/google/blueprint/proptools"
- )
- var PrepareForTestWithAidlLibrary = android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
- registerAidlLibraryBuildComponents(ctx)
- })
- func init() {
- registerAidlLibraryBuildComponents(android.InitRegistrationContext)
- }
- func registerAidlLibraryBuildComponents(ctx android.RegistrationContext) {
- ctx.RegisterModuleType("aidl_library", AidlLibraryFactory)
- }
- type aidlLibraryProperties struct {
- // srcs lists files that are included in this module for aidl compilation
- Srcs []string `android:"path"`
- // hdrs lists the headers that are imported by srcs but are not compiled by aidl to language binding code
- // hdrs is provided to support Bazel migration. It is a no-op until
- // we enable input sandbox in aidl compilation action
- Hdrs []string `android:"path"`
- // The prefix to strip from the paths of the .aidl files
- // The remaining path is the package path of the aidl interface
- Strip_import_prefix *string
- // List of aidl files or aidl_library depended on by the module
- Deps []string `android:"arch_variant"`
- }
- type AidlLibrary struct {
- android.ModuleBase
- android.BazelModuleBase
- properties aidlLibraryProperties
- }
- type bazelAidlLibraryAttributes struct {
- Srcs bazel.LabelListAttribute
- Hdrs bazel.LabelListAttribute
- Strip_import_prefix *string
- Deps bazel.LabelListAttribute
- }
- func (lib *AidlLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
- srcs := bazel.MakeLabelListAttribute(
- android.BazelLabelForModuleSrc(
- ctx,
- lib.properties.Srcs,
- ),
- )
- hdrs := bazel.MakeLabelListAttribute(
- android.BazelLabelForModuleSrc(
- ctx,
- lib.properties.Hdrs,
- ),
- )
- tags := []string{"apex_available=//apex_available:anyapex"}
- deps := bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, lib.properties.Deps))
- attrs := &bazelAidlLibraryAttributes{
- Srcs: srcs,
- Hdrs: hdrs,
- Strip_import_prefix: lib.properties.Strip_import_prefix,
- Deps: deps,
- }
- props := bazel.BazelTargetModuleProperties{
- Rule_class: "aidl_library",
- Bzl_load_location: "//build/bazel/rules/aidl:aidl_library.bzl",
- }
- ctx.CreateBazelTargetModule(
- props,
- android.CommonAttributes{
- Name: lib.Name(),
- Tags: bazel.MakeStringListAttribute(tags),
- },
- attrs,
- )
- }
- type AidlLibraryInfo struct {
- // The direct aidl files of the module
- Srcs android.Paths
- // The include dirs to the direct aidl files and those provided from transitive aidl_library deps
- IncludeDirs android.DepSet[android.Path]
- // The direct hdrs and hdrs from transitive deps
- Hdrs android.DepSet[android.Path]
- }
- // AidlLibraryProvider provides the srcs and the transitive include dirs
- var AidlLibraryProvider = blueprint.NewProvider(AidlLibraryInfo{})
- func (lib *AidlLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
- includeDirsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.PREORDER)
- hdrsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.PREORDER)
- if len(lib.properties.Srcs) == 0 && len(lib.properties.Hdrs) == 0 {
- ctx.ModuleErrorf("at least srcs or hdrs prop must be non-empty")
- }
- srcs := android.PathsForModuleSrc(ctx, lib.properties.Srcs)
- hdrs := android.PathsForModuleSrc(ctx, lib.properties.Hdrs)
- if lib.properties.Strip_import_prefix != nil {
- srcs = android.PathsWithModuleSrcSubDir(
- ctx,
- srcs,
- android.String(lib.properties.Strip_import_prefix),
- )
- hdrs = android.PathsWithModuleSrcSubDir(
- ctx,
- hdrs,
- android.String(lib.properties.Strip_import_prefix),
- )
- }
- hdrsDepSetBuilder.Direct(hdrs...)
- includeDir := android.PathForModuleSrc(
- ctx,
- proptools.StringDefault(lib.properties.Strip_import_prefix, ""),
- )
- includeDirsDepSetBuilder.Direct(includeDir)
- for _, dep := range ctx.GetDirectDepsWithTag(aidlLibraryTag) {
- if ctx.OtherModuleHasProvider(dep, AidlLibraryProvider) {
- info := ctx.OtherModuleProvider(dep, AidlLibraryProvider).(AidlLibraryInfo)
- includeDirsDepSetBuilder.Transitive(&info.IncludeDirs)
- hdrsDepSetBuilder.Transitive(&info.Hdrs)
- }
- }
- ctx.SetProvider(AidlLibraryProvider, AidlLibraryInfo{
- Srcs: srcs,
- IncludeDirs: *includeDirsDepSetBuilder.Build(),
- Hdrs: *hdrsDepSetBuilder.Build(),
- })
- }
- // aidl_library contains a list of .aidl files and the strip_import_prefix to
- // to strip from the paths of the .aidl files. The sub-path left-over after stripping
- // corresponds to the aidl package path the aidl interfaces are scoped in
- func AidlLibraryFactory() android.Module {
- module := &AidlLibrary{}
- module.AddProperties(&module.properties)
- android.InitAndroidModule(module)
- android.InitBazelModule(module)
- return module
- }
- type aidlDependencyTag struct {
- blueprint.BaseDependencyTag
- }
- var aidlLibraryTag = aidlDependencyTag{}
- func (lib *AidlLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
- for _, dep := range lib.properties.Deps {
- ctx.AddDependency(lib, aidlLibraryTag, dep)
- }
- }
|