Fix prebuilt selection logic for cc_prebuilt_library_headers.
Unlike other prebuilt modules it doesn't have a srcs property of any
kind, so android.Prebuilt cannot defer to the source module just
because its srcsSupplier would return nil.
Test: m nothing
Bug: 202192894
Change-Id: Iafcf165569bad6eae37820cf71aa0fcacb720e02
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 45bb1ca..636bab8 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -263,9 +263,10 @@
library.androidMkWriteExportedFlags(entries)
library.androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries)
- _, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base())
-
- entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
+ if entries.OutputFile.Valid() {
+ _, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base())
+ entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
+ }
if library.coverageOutputFile.Valid() {
entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputFile.String())
diff --git a/cc/library_headers.go b/cc/library_headers.go
index ede6ab3..141a2a5 100644
--- a/cc/library_headers.go
+++ b/cc/library_headers.go
@@ -102,7 +102,7 @@
// cc_prebuilt_library_headers is a prebuilt version of cc_library_headers
func prebuiltLibraryHeaderFactory() android.Module {
- module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported)
+ module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported, "")
library.HeaderOnly()
return module.Init()
}
diff --git a/cc/library_headers_test.go b/cc/library_headers_test.go
index 564ef61..9789ab0 100644
--- a/cc/library_headers_test.go
+++ b/cc/library_headers_test.go
@@ -15,8 +15,13 @@
package cc
import (
+ "fmt"
"strings"
"testing"
+
+ "android/soong/android"
+
+ "github.com/google/blueprint"
)
func TestLibraryHeaders(t *testing.T) {
@@ -60,3 +65,43 @@
t.Errorf("cflags for libsystem must contain -Imy_include, but was %#v.", cflags)
}
}
+
+func TestPrebuiltLibraryHeadersPreferred(t *testing.T) {
+ bp := `
+ cc_library_headers {
+ name: "headers",
+ export_include_dirs: ["my_include"],
+ }
+ cc_prebuilt_library_headers {
+ name: "headers",
+ prefer: %t,
+ export_include_dirs: ["my_include"],
+ }
+ cc_library_static {
+ name: "lib",
+ srcs: ["foo.c"],
+ header_libs: ["headers"],
+ }
+ `
+
+ for _, prebuiltPreferred := range []bool{false, true} {
+ t.Run(fmt.Sprintf("prebuilt prefer %t", prebuiltPreferred), func(t *testing.T) {
+ ctx := testCc(t, fmt.Sprintf(bp, prebuiltPreferred))
+ lib := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static")
+ sourceDep := ctx.ModuleForTests("headers", "android_arm64_armv8-a")
+ prebuiltDep := ctx.ModuleForTests("prebuilt_headers", "android_arm64_armv8-a")
+ hasSourceDep := false
+ hasPrebuiltDep := false
+ ctx.VisitDirectDeps(lib.Module(), func(dep blueprint.Module) {
+ if dep == sourceDep.Module() {
+ hasSourceDep = true
+ }
+ if dep == prebuiltDep.Module() {
+ hasPrebuiltDep = true
+ }
+ })
+ android.AssertBoolEquals(t, "depends on source headers", !prebuiltPreferred, hasSourceDep)
+ android.AssertBoolEquals(t, "depends on prebuilt headers", prebuiltPreferred, hasPrebuiltDep)
+ })
+ }
+}
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index 16945ac..a279054 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -235,7 +235,7 @@
return android.RemoveOptionalPrebuiltPrefix(name)
}
-func NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
+func NewPrebuiltLibrary(hod android.HostOrDeviceSupported, srcsProperty string) (*Module, *libraryDecorator) {
module, library := NewLibrary(hod)
module.compiler = nil
@@ -247,11 +247,15 @@
module.AddProperties(&prebuilt.properties)
- srcsSupplier := func(ctx android.BaseModuleContext, _ android.Module) []string {
- return prebuilt.prebuiltSrcs(ctx)
- }
+ if srcsProperty == "" {
+ android.InitPrebuiltModuleWithoutSrcs(module)
+ } else {
+ srcsSupplier := func(ctx android.BaseModuleContext, _ android.Module) []string {
+ return prebuilt.prebuiltSrcs(ctx)
+ }
- android.InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, "srcs")
+ android.InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, srcsProperty)
+ }
// Prebuilt libraries can be used in SDKs.
android.InitSdkAwareModule(module)
@@ -261,7 +265,7 @@
// cc_prebuilt_library installs a precompiled shared library that are
// listed in the srcs property in the device's directory.
func PrebuiltLibraryFactory() android.Module {
- module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported)
+ module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported, "srcs")
// Prebuilt shared libraries can be included in APEXes
android.InitApexModule(module)
@@ -280,14 +284,14 @@
// to be used as a data dependency of a test-related module (such as cc_test, or
// cc_test_library).
func PrebuiltSharedTestLibraryFactory() android.Module {
- module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported)
+ module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported, "srcs")
library.BuildOnlyShared()
library.baseInstaller = NewTestInstaller()
return module.Init()
}
func NewPrebuiltSharedLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
- module, library := NewPrebuiltLibrary(hod)
+ module, library := NewPrebuiltLibrary(hod, "srcs")
library.BuildOnlyShared()
// Prebuilt shared libraries can be included in APEXes
@@ -304,7 +308,7 @@
}
func NewPrebuiltStaticLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
- module, library := NewPrebuiltLibrary(hod)
+ module, library := NewPrebuiltLibrary(hod, "srcs")
library.BuildOnlyStatic()
module.bazelHandler = &prebuiltStaticLibraryBazelHandler{module: module, library: library}
return module, library