Add a property in ndk_library for header contributions

The new property will be used to determine the header file contributions of
ndk_library(s) to the Public API surface. This should be a no-op for
regular Soong builds.

This will be used by a future bp2build converter to populate
the BUILD files for Multi-tree `cc_api_contribution` targets

(Also noticed that sdk_test.go was never added to testSrcs, which this
CL should fix)

Test: go test ./cc
Test: TH

Change-Id: Ieea093e4aac68e341c6414b6cafe02c441643cdf
This commit is contained in:
Spandan Das 2022-08-18 23:26:00 +00:00
parent f9f9ed7cf1
commit 73bcafcbb0
5 changed files with 77 additions and 7 deletions

View file

@ -99,10 +99,12 @@ bootstrap_go_package {
"library_headers_test.go", "library_headers_test.go",
"library_stub_test.go", "library_stub_test.go",
"library_test.go", "library_test.go",
"ndk_test.go",
"object_test.go", "object_test.go",
"prebuilt_test.go", "prebuilt_test.go",
"proto_test.go", "proto_test.go",
"sanitize_test.go", "sanitize_test.go",
"sdk_test.go",
"test_data_test.go", "test_data_test.go",
"tidy_test.go", "tidy_test.go",
"vendor_public_library_test.go", "vendor_public_library_test.go",

View file

@ -2350,7 +2350,10 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs) lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
if c.IsStubs() { if c.isNDKStubLibrary() {
// ndk_headers do not have any variations
actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
} else if c.IsStubs() {
actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()), actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
depTag, lib) depTag, lib)
} else { } else {

View file

@ -84,11 +84,13 @@ var (
// //
// Example: // Example:
// //
// ndk_library { // ndk_library {
// name: "libfoo", //
// symbol_file: "libfoo.map.txt", // name: "libfoo",
// first_version: "9", // symbol_file: "libfoo.map.txt",
// } // first_version: "9",
//
// }
type libraryProperties struct { type libraryProperties struct {
// Relative path to the symbol map. // Relative path to the symbol map.
// An example file can be seen here: TODO(danalbert): Make an example. // An example file can be seen here: TODO(danalbert): Make an example.
@ -109,6 +111,9 @@ type libraryProperties struct {
// where it is enabled pending a fix for http://b/190554910 (no debug info // where it is enabled pending a fix for http://b/190554910 (no debug info
// for asm implemented symbols). // for asm implemented symbols).
Allow_untyped_symbols *bool Allow_untyped_symbols *bool
// Headers presented by this library to the Public API Surface
Export_header_libs []string
} }
type stubDecorator struct { type stubDecorator struct {
@ -483,8 +488,11 @@ func (c *stubDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) O
return objs return objs
} }
// Add a dependency on the header modules of this ndk_library
func (linker *stubDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { func (linker *stubDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
return Deps{} return Deps{
HeaderLibs: linker.properties.Export_header_libs,
}
} }
func (linker *stubDecorator) Name(name string) string { func (linker *stubDecorator) Name(name string) string {

56
cc/ndk_test.go Normal file
View file

@ -0,0 +1,56 @@
// Copyright 2022 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 (
"testing"
"github.com/google/blueprint"
"android/soong/android"
)
func TestNdkHeaderDependency(t *testing.T) {
isDep := func(ctx *android.TestResult, from, toExpected android.Module) bool {
foundDep := false
ctx.VisitDirectDeps(from, func(toActual blueprint.Module) {
if toExpected.Name() == toActual.Name() {
foundDep = true
}
})
return foundDep
}
bp := `
ndk_library {
name: "libfoo",
first_version: "29",
symbol_file: "libfoo.map.txt",
export_header_libs: ["libfoo_headers"],
}
ndk_headers {
name: "libfoo_headers",
srcs: ["foo.h"],
license: "NOTICE",
}
//This module is needed since Soong creates a dep edge on source
cc_library {
name: "libfoo",
}
`
ctx := prepareForCcTest.RunTestWithBp(t, bp)
libfoo := ctx.ModuleForTests("libfoo.ndk", "android_arm64_armv8-a_sdk_shared")
libfoo_headers := ctx.ModuleForTests("libfoo_headers", "")
android.AssertBoolEquals(t, "Could not find headers of ndk_library", true, isDep(ctx, libfoo.Module(), libfoo_headers.Module()))
}

View file

@ -41,6 +41,7 @@ func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) {
ctx.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory) ctx.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory)
ctx.RegisterModuleType("ndk_prebuilt_object", NdkPrebuiltObjectFactory) ctx.RegisterModuleType("ndk_prebuilt_object", NdkPrebuiltObjectFactory)
ctx.RegisterModuleType("ndk_library", NdkLibraryFactory) ctx.RegisterModuleType("ndk_library", NdkLibraryFactory)
ctx.RegisterModuleType("ndk_headers", ndkHeadersFactory)
} }
func GatherRequiredDepsForTest(oses ...android.OsType) string { func GatherRequiredDepsForTest(oses ...android.OsType) string {