This CL is pretty large, so I recommend starting with reading the newly added tests for the expected behavior. This change works in conjunction with the linked CLs in the Gerrit topic. Those CLs add support for new platform() definitions for OS targets specified in Soong's arch.go, which are configurable through Android.bp's `target {}` property. It works similary to previous CLs adding support for the `arch {}` property. These configurable props are keyed by the OS: android, linux_bionic, windows, and so on. They map to `select` statements in label list attributes, which this CL enables for cc_library_headers' header_libs and export_header_lib_headers props. This enables //bionic/libc:libc_headers to be generated correctly, from: cc_library_headers { name: "libc_headers", target: { android: { header_libs: ["libc_headers_arch"], export_header_lib_headers: ["libc_headers_arch"], }, linux_bionic: { header_libs: ["libc_headers_arch"], export_header_lib_headers: ["libc_headers_arch"], }, }, // omitted props } to: cc_library_headers( name = "libc_headers", deps = [] + select({ "//build/bazel/platforms/os:android": [ ":libc_headers_arch", ], "//build/bazel/platforms/os:linux_bionic": [ ":libc_headers_arch", ], "//conditions:default": [], }), ) Test: TH Test: Verify generated //bionic/libc:libc_headers Fixes: 183597786 Change-Id: I01016cc2cc9a71449f02300d747f01decebf3f6e
120 lines
3.6 KiB
Go
120 lines
3.6 KiB
Go
// Copyright 2020 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 cc
|
|
|
|
import (
|
|
"android/soong/android"
|
|
"android/soong/bazel"
|
|
)
|
|
|
|
func init() {
|
|
RegisterLibraryHeadersBuildComponents(android.InitRegistrationContext)
|
|
|
|
// Register sdk member types.
|
|
android.RegisterSdkMemberType(headersLibrarySdkMemberType)
|
|
|
|
android.RegisterBp2BuildMutator("cc_library_headers", CcLibraryHeadersBp2Build)
|
|
}
|
|
|
|
var headersLibrarySdkMemberType = &librarySdkMemberType{
|
|
SdkMemberTypeBase: android.SdkMemberTypeBase{
|
|
PropertyName: "native_header_libs",
|
|
SupportsSdk: true,
|
|
HostOsDependent: true,
|
|
},
|
|
prebuiltModuleType: "cc_prebuilt_library_headers",
|
|
noOutputFiles: true,
|
|
}
|
|
|
|
func RegisterLibraryHeadersBuildComponents(ctx android.RegistrationContext) {
|
|
ctx.RegisterModuleType("cc_library_headers", LibraryHeaderFactory)
|
|
ctx.RegisterModuleType("cc_prebuilt_library_headers", prebuiltLibraryHeaderFactory)
|
|
}
|
|
|
|
// cc_library_headers contains a set of c/c++ headers which are imported by
|
|
// other soong cc modules using the header_libs property. For best practices,
|
|
// use export_include_dirs property or LOCAL_EXPORT_C_INCLUDE_DIRS for
|
|
// Make.
|
|
func LibraryHeaderFactory() android.Module {
|
|
module, library := NewLibrary(android.HostAndDeviceSupported)
|
|
library.HeaderOnly()
|
|
module.sdkMemberTypes = []android.SdkMemberType{headersLibrarySdkMemberType}
|
|
return module.Init()
|
|
}
|
|
|
|
// cc_prebuilt_library_headers is a prebuilt version of cc_library_headers
|
|
func prebuiltLibraryHeaderFactory() android.Module {
|
|
module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported)
|
|
library.HeaderOnly()
|
|
return module.Init()
|
|
}
|
|
|
|
type bazelCcLibraryHeadersAttributes struct {
|
|
Hdrs bazel.LabelListAttribute
|
|
Includes bazel.LabelListAttribute
|
|
Deps bazel.LabelListAttribute
|
|
}
|
|
|
|
type bazelCcLibraryHeaders struct {
|
|
android.BazelTargetModuleBase
|
|
bazelCcLibraryHeadersAttributes
|
|
}
|
|
|
|
func BazelCcLibraryHeadersFactory() android.Module {
|
|
module := &bazelCcLibraryHeaders{}
|
|
module.AddProperties(&module.bazelCcLibraryHeadersAttributes)
|
|
android.InitBazelTargetModule(module)
|
|
return module
|
|
}
|
|
|
|
func CcLibraryHeadersBp2Build(ctx android.TopDownMutatorContext) {
|
|
module, ok := ctx.Module().(*Module)
|
|
if !ok {
|
|
// Not a cc module
|
|
return
|
|
}
|
|
|
|
if !module.ConvertWithBp2build(ctx) {
|
|
return
|
|
}
|
|
|
|
if ctx.ModuleType() != "cc_library_headers" {
|
|
return
|
|
}
|
|
|
|
exportedIncludesLabels, exportedIncludesHeadersLabels := bp2BuildParseExportedIncludes(ctx, module)
|
|
|
|
headerLibsLabels := bp2BuildParseHeaderLibs(ctx, module)
|
|
|
|
attrs := &bazelCcLibraryHeadersAttributes{
|
|
Includes: exportedIncludesLabels,
|
|
Hdrs: exportedIncludesHeadersLabels,
|
|
Deps: headerLibsLabels,
|
|
}
|
|
|
|
props := bazel.BazelTargetModuleProperties{
|
|
Rule_class: "cc_library_headers",
|
|
Bzl_load_location: "//build/bazel/rules:cc_library_headers.bzl",
|
|
}
|
|
|
|
ctx.CreateBazelTargetModule(BazelCcLibraryHeadersFactory, module.Name(), props, attrs)
|
|
}
|
|
|
|
func (m *bazelCcLibraryHeaders) Name() string {
|
|
return m.BaseModuleName()
|
|
}
|
|
|
|
func (m *bazelCcLibraryHeaders) GenerateAndroidBuildActions(ctx android.ModuleContext) {}
|