Add cc_prebuilt_library_headers

In preparation for adding cc_library_headers support to
sdk/module_exports.

Two changes were needed to make the prebuilt version work.
1) Had to stop the prebuilt version of the library from creating static
   and shared variants for header only.
2) Had to allow the code to export/reexport include dirs to run even
   when no src is provided.

Bug: 148933848
Test: m nothing
Change-Id: Idd50ed38bc90d1d93551f78e6310f167941487d9
This commit is contained in:
Paul Duffin
2020-02-21 10:57:00 +00:00
parent 1c6c1c7251
commit f5ea9e1f76
4 changed files with 56 additions and 20 deletions

View File

@@ -1303,22 +1303,28 @@ func LinkageMutator(mctx android.BottomUpMutatorContext) {
if cc_prebuilt {
library := mctx.Module().(*Module).linker.(prebuiltLibraryInterface)
// Always create both the static and shared variants for prebuilt libraries, and then disable the one
// that is not being used. This allows them to share the name of a cc_library module, which requires that
// all the variants of the cc_library also exist on the prebuilt.
modules := mctx.CreateLocalVariations("static", "shared")
static := modules[0].(*Module)
shared := modules[1].(*Module)
// Differentiate between header only and building an actual static/shared library
if library.buildStatic() || library.buildShared() {
// Always create both the static and shared variants for prebuilt libraries, and then disable the one
// that is not being used. This allows them to share the name of a cc_library module, which requires that
// all the variants of the cc_library also exist on the prebuilt.
modules := mctx.CreateLocalVariations("static", "shared")
static := modules[0].(*Module)
shared := modules[1].(*Module)
static.linker.(prebuiltLibraryInterface).setStatic()
shared.linker.(prebuiltLibraryInterface).setShared()
static.linker.(prebuiltLibraryInterface).setStatic()
shared.linker.(prebuiltLibraryInterface).setShared()
if !library.buildStatic() {
static.linker.(prebuiltLibraryInterface).disablePrebuilt()
}
if !library.buildShared() {
shared.linker.(prebuiltLibraryInterface).disablePrebuilt()
if !library.buildStatic() {
static.linker.(prebuiltLibraryInterface).disablePrebuilt()
}
if !library.buildShared() {
shared.linker.(prebuiltLibraryInterface).disablePrebuilt()
}
} else {
// Header only
}
} else if library, ok := mctx.Module().(LinkableInterface); ok && library.CcLibraryInterface() {
// Non-cc.Modules may need an empty variant for their mutators.

View File

@@ -22,6 +22,7 @@ func init() {
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
@@ -33,3 +34,10 @@ func LibraryHeaderFactory() android.Module {
library.HeaderOnly()
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()
}

View File

@@ -39,3 +39,24 @@ func TestLibraryHeaders(t *testing.T) {
t.Errorf("cflags for libsystem must contain -Imy_include, but was %#v.", cflags)
}
}
func TestPrebuiltLibraryHeaders(t *testing.T) {
ctx := testCc(t, `
cc_prebuilt_library_headers {
name: "headers",
export_include_dirs: ["my_include"],
}
cc_library_static {
name: "lib",
srcs: ["foo.c"],
header_libs: ["headers"],
}
`)
// test if header search paths are correctly added
cc := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static").Rule("cc")
cflags := cc.Args["cFlags"]
if !strings.Contains(cflags, " -Imy_include ") {
t.Errorf("cflags for libsystem must contain -Imy_include, but was %#v.", cflags)
}
}

View File

@@ -87,15 +87,16 @@ func (p *prebuiltLibraryLinker) linkerProps() []interface{} {
func (p *prebuiltLibraryLinker) link(ctx ModuleContext,
flags Flags, deps PathDeps, objs Objects) android.Path {
p.libraryDecorator.exportIncludes(ctx)
p.libraryDecorator.reexportDirs(deps.ReexportedDirs...)
p.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...)
p.libraryDecorator.reexportFlags(deps.ReexportedFlags...)
p.libraryDecorator.reexportDeps(deps.ReexportedDeps...)
p.libraryDecorator.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...)
// TODO(ccross): verify shared library dependencies
if len(p.properties.Srcs) > 0 {
p.libraryDecorator.exportIncludes(ctx)
p.libraryDecorator.reexportDirs(deps.ReexportedDirs...)
p.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...)
p.libraryDecorator.reexportFlags(deps.ReexportedFlags...)
p.libraryDecorator.reexportDeps(deps.ReexportedDeps...)
p.libraryDecorator.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...)
builderFlags := flagsToBuilderFlags(flags)
in := p.Prebuilt.SingleSourcePath(ctx)