Add cc_prebuilt_object.

To be used for prebuilt object support in SDK snapshots.

Test: m nothing
Bug: 148934017
Change-Id: I53d58100cc1d410c5cf5b7906de7ed6f7add2035
This commit is contained in:
Martin Stjernholm
2020-03-11 21:45:49 +00:00
parent 2812418eac
commit 0b92ac8e43
3 changed files with 70 additions and 3 deletions

View File

@@ -47,12 +47,18 @@ type ObjectLinkerProperties struct {
Linker_script *string `android:"path,arch_variant"` Linker_script *string `android:"path,arch_variant"`
} }
func newObject() *Module {
module := newBaseModule(android.HostAndDeviceSupported, android.MultilibBoth)
module.sanitize = &sanitize{}
module.stl = &stl{}
return module
}
// cc_object runs the compiler without running the linker. It is rarely // cc_object runs the compiler without running the linker. It is rarely
// necessary, but sometimes used to generate .s files from .c files to use as // necessary, but sometimes used to generate .s files from .c files to use as
// input to a cc_genrule module. // input to a cc_genrule module.
func ObjectFactory() android.Module { func ObjectFactory() android.Module {
module := newBaseModule(android.HostAndDeviceSupported, android.MultilibBoth) module := newObject()
module.sanitize = &sanitize{}
module.linker = &objectLinker{ module.linker = &objectLinker{
baseLinker: NewBaseLinker(module.sanitize), baseLinker: NewBaseLinker(module.sanitize),
} }
@@ -61,7 +67,6 @@ func ObjectFactory() android.Module {
// Clang's address-significance tables are incompatible with ld -r. // Clang's address-significance tables are incompatible with ld -r.
module.compiler.appendCflags([]string{"-fno-addrsig"}) module.compiler.appendCflags([]string{"-fno-addrsig"})
module.stl = &stl{}
return module.Init() return module.Init()
} }

View File

@@ -26,6 +26,7 @@ func RegisterPrebuiltBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("cc_prebuilt_library", PrebuiltLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_library", PrebuiltLibraryFactory)
ctx.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory)
ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory)
ctx.RegisterModuleType("cc_prebuilt_object", prebuiltObjectFactory)
ctx.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory) ctx.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory)
} }
@@ -217,6 +218,50 @@ func NewPrebuiltStaticLibrary(hod android.HostOrDeviceSupported) (*Module, *libr
return module, library return module, library
} }
type prebuiltObjectProperties struct {
Srcs []string `android:"path,arch_variant"`
}
type prebuiltObjectLinker struct {
android.Prebuilt
objectLinker
properties prebuiltObjectProperties
}
func (p *prebuiltObjectLinker) prebuilt() *android.Prebuilt {
return &p.Prebuilt
}
var _ prebuiltLinkerInterface = (*prebuiltObjectLinker)(nil)
func (p *prebuiltObjectLinker) link(ctx ModuleContext,
flags Flags, deps PathDeps, objs Objects) android.Path {
if len(p.properties.Srcs) > 0 {
return p.Prebuilt.SingleSourcePath(ctx)
}
return nil
}
func newPrebuiltObject() *Module {
module := newObject()
prebuilt := &prebuiltObjectLinker{
objectLinker: objectLinker{
baseLinker: NewBaseLinker(nil),
},
}
module.linker = prebuilt
module.AddProperties(&prebuilt.properties)
android.InitPrebuiltModule(module, &prebuilt.properties.Srcs)
android.InitSdkAwareModule(module)
return module
}
func prebuiltObjectFactory() android.Module {
module := newPrebuiltObject()
return module.Init()
}
type prebuiltBinaryLinker struct { type prebuiltBinaryLinker struct {
*binaryDecorator *binaryDecorator
prebuiltLinker prebuiltLinker

View File

@@ -73,6 +73,15 @@ func TestPrebuilt(t *testing.T) {
srcs: ["libf.so"], srcs: ["libf.so"],
}, },
} }
cc_object {
name: "crtx",
}
cc_prebuilt_object {
name: "crtx",
srcs: ["crtx.o"],
}
` `
ctx := testPrebuilt(t, bp) ctx := testPrebuilt(t, bp)
@@ -84,6 +93,7 @@ func TestPrebuilt(t *testing.T) {
libe := ctx.ModuleForTests("libe", "android_arm64_armv8-a_static").Module() libe := ctx.ModuleForTests("libe", "android_arm64_armv8-a_static").Module()
libfStatic := ctx.ModuleForTests("libf", "android_arm64_armv8-a_static").Module() libfStatic := ctx.ModuleForTests("libf", "android_arm64_armv8-a_static").Module()
libfShared := ctx.ModuleForTests("libf", "android_arm64_armv8-a_shared").Module() libfShared := ctx.ModuleForTests("libf", "android_arm64_armv8-a_shared").Module()
crtx := ctx.ModuleForTests("crtx", "android_arm64_armv8-a").Module()
prebuiltLiba := ctx.ModuleForTests("prebuilt_liba", "android_arm64_armv8-a_shared").Module() prebuiltLiba := ctx.ModuleForTests("prebuilt_liba", "android_arm64_armv8-a_shared").Module()
prebuiltLibb := ctx.ModuleForTests("prebuilt_libb", "android_arm64_armv8-a_static").Module() prebuiltLibb := ctx.ModuleForTests("prebuilt_libb", "android_arm64_armv8-a_static").Module()
@@ -91,6 +101,7 @@ func TestPrebuilt(t *testing.T) {
prebuiltLibe := ctx.ModuleForTests("prebuilt_libe", "android_arm64_armv8-a_static").Module() prebuiltLibe := ctx.ModuleForTests("prebuilt_libe", "android_arm64_armv8-a_static").Module()
prebuiltLibfStatic := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_static").Module() prebuiltLibfStatic := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_static").Module()
prebuiltLibfShared := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_shared").Module() prebuiltLibfShared := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_shared").Module()
prebuiltCrtx := ctx.ModuleForTests("prebuilt_crtx", "android_arm64_armv8-a").Module()
hasDep := func(m android.Module, wantDep android.Module) bool { hasDep := func(m android.Module, wantDep android.Module) bool {
t.Helper() t.Helper()
@@ -126,9 +137,14 @@ func TestPrebuilt(t *testing.T) {
if !hasDep(libfShared, prebuiltLibfShared) { if !hasDep(libfShared, prebuiltLibfShared) {
t.Errorf("libf shared missing dependency on prebuilt_libf") t.Errorf("libf shared missing dependency on prebuilt_libf")
} }
if !hasDep(crtx, prebuiltCrtx) {
t.Errorf("crtx missing dependency on prebuilt_crtx")
}
} }
func testPrebuilt(t *testing.T, bp string) *android.TestContext { func testPrebuilt(t *testing.T, bp string) *android.TestContext {
fs := map[string][]byte{ fs := map[string][]byte{
"liba.so": nil, "liba.so": nil,
"libb.a": nil, "libb.a": nil,
@@ -136,6 +152,7 @@ func testPrebuilt(t *testing.T, bp string) *android.TestContext {
"libe.a": nil, "libe.a": nil,
"libf.a": nil, "libf.a": nil,
"libf.so": nil, "libf.so": nil,
"crtx.o": nil,
} }
config := TestConfig(buildDir, android.Android, nil, bp, fs) config := TestConfig(buildDir, android.Android, nil, bp, fs)
ctx := CreateTestContext() ctx := CreateTestContext()