From 73bcafcbb02d641ec912ac9277049eb91ad381e4 Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Thu, 18 Aug 2022 23:26:00 +0000 Subject: [PATCH] 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 --- cc/Android.bp | 2 ++ cc/cc.go | 5 ++++- cc/ndk_library.go | 20 ++++++++++++----- cc/ndk_test.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++ cc/testing.go | 1 + 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 cc/ndk_test.go diff --git a/cc/Android.bp b/cc/Android.bp index ce944674b..2963c77b5 100644 --- a/cc/Android.bp +++ b/cc/Android.bp @@ -99,10 +99,12 @@ bootstrap_go_package { "library_headers_test.go", "library_stub_test.go", "library_test.go", + "ndk_test.go", "object_test.go", "prebuilt_test.go", "proto_test.go", "sanitize_test.go", + "sdk_test.go", "test_data_test.go", "tidy_test.go", "vendor_public_library_test.go", diff --git a/cc/cc.go b/cc/cc.go index f1e9bf621..99a8d7c63 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -2350,7 +2350,10 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { 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()), depTag, lib) } else { diff --git a/cc/ndk_library.go b/cc/ndk_library.go index 2bbfc4aee..e2b968296 100644 --- a/cc/ndk_library.go +++ b/cc/ndk_library.go @@ -84,11 +84,13 @@ var ( // // Example: // -// ndk_library { -// name: "libfoo", -// symbol_file: "libfoo.map.txt", -// first_version: "9", -// } +// ndk_library { +// +// name: "libfoo", +// symbol_file: "libfoo.map.txt", +// first_version: "9", +// +// } type libraryProperties struct { // Relative path to the symbol map. // 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 // for asm implemented symbols). Allow_untyped_symbols *bool + + // Headers presented by this library to the Public API Surface + Export_header_libs []string } type stubDecorator struct { @@ -483,8 +488,11 @@ func (c *stubDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) O return objs } +// Add a dependency on the header modules of this ndk_library 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 { diff --git a/cc/ndk_test.go b/cc/ndk_test.go new file mode 100644 index 000000000..f20d3c61f --- /dev/null +++ b/cc/ndk_test.go @@ -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())) +} diff --git a/cc/testing.go b/cc/testing.go index 44a865d2a..e42b9fab7 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -41,6 +41,7 @@ func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) { ctx.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory) ctx.RegisterModuleType("ndk_prebuilt_object", NdkPrebuiltObjectFactory) ctx.RegisterModuleType("ndk_library", NdkLibraryFactory) + ctx.RegisterModuleType("ndk_headers", ndkHeadersFactory) } func GatherRequiredDepsForTest(oses ...android.OsType) string {