diff --git a/android/sdk.go b/android/sdk.go index 5c7b329a9..731bdff11 100644 --- a/android/sdk.go +++ b/android/sdk.go @@ -304,10 +304,11 @@ type SdkMemberType interface { // SdkAware and be added with an SdkMemberTypeDependencyTag tag. HasTransitiveSdkMembers() bool - // Add dependencies from the SDK module to all the variants the member - // contributes to the SDK. The exact set of variants required is determined - // by the SDK and its properties. The dependencies must be added with the - // supplied tag. + // Add dependencies from the SDK module to all the module variants the member + // type contributes to the SDK. `names` is the list of module names given in + // the member type property (as returned by SdkPropertyName()) in the SDK + // module. The exact set of variants required is determined by the SDK and its + // properties. The dependencies must be added with the supplied tag. // // The BottomUpMutatorContext provided is for the SDK module. AddDependencies(mctx BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) diff --git a/cc/library_headers.go b/cc/library_headers.go index 88cf7afdd..b7ab3907c 100644 --- a/cc/library_headers.go +++ b/cc/library_headers.go @@ -29,7 +29,7 @@ var headersLibrarySdkMemberType = &librarySdkMemberType{ SupportsSdk: true, }, prebuiltModuleType: "cc_prebuilt_library_headers", - linkTypes: nil, + noOutputFiles: true, } func RegisterLibraryHeadersBuildComponents(ctx android.RegistrationContext) { diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go index 843ebb04a..69c3d18d2 100644 --- a/cc/library_sdk_member.go +++ b/cc/library_sdk_member.go @@ -18,6 +18,7 @@ import ( "path/filepath" "android/soong/android" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -53,7 +54,10 @@ type librarySdkMemberType struct { prebuiltModuleType string - // The set of link types supported, set of "static", "shared". + noOutputFiles bool // True if there are no srcs files. + + // The set of link types supported. A set of "static", "shared", or nil to + // skip link type variations. linkTypes []string } @@ -327,7 +331,7 @@ func (p *nativeLibInfoProperties) PopulateFromVariant(variant android.SdkAware) // If the library has some link types then it produces an output binary file, otherwise it // is header only. - if p.memberType.linkTypes != nil { + if !p.memberType.noOutputFiles { p.outputFile = ccModule.OutputFile().Path() } diff --git a/cc/object.go b/cc/object.go index ad31d09fc..19decec37 100644 --- a/cc/object.go +++ b/cc/object.go @@ -26,6 +26,16 @@ import ( func init() { android.RegisterModuleType("cc_object", ObjectFactory) + android.RegisterSdkMemberType(ccObjectSdkMemberType) +} + +var ccObjectSdkMemberType = &librarySdkMemberType{ + SdkMemberTypeBase: android.SdkMemberTypeBase{ + PropertyName: "native_objects", + SupportsSdk: true, + }, + prebuiltModuleType: "cc_prebuilt_object", + linkTypes: nil, } type objectLinker struct { @@ -47,12 +57,18 @@ type ObjectLinkerProperties struct { 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 // necessary, but sometimes used to generate .s files from .c files to use as // input to a cc_genrule module. func ObjectFactory() android.Module { - module := newBaseModule(android.HostAndDeviceSupported, android.MultilibBoth) - module.sanitize = &sanitize{} + module := newObject() module.linker = &objectLinker{ baseLinker: NewBaseLinker(module.sanitize), } @@ -61,7 +77,7 @@ func ObjectFactory() android.Module { // Clang's address-significance tables are incompatible with ld -r. module.compiler.appendCflags([]string{"-fno-addrsig"}) - module.stl = &stl{} + module.sdkMemberTypes = []android.SdkMemberType{ccObjectSdkMemberType} return module.Init() } diff --git a/cc/prebuilt.go b/cc/prebuilt.go index 7f21721cc..fc9cc17d3 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -26,6 +26,7 @@ func RegisterPrebuiltBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("cc_prebuilt_library", PrebuiltLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory) + ctx.RegisterModuleType("cc_prebuilt_object", prebuiltObjectFactory) ctx.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory) } @@ -217,6 +218,50 @@ func NewPrebuiltStaticLibrary(hod android.HostOrDeviceSupported) (*Module, *libr 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 { *binaryDecorator prebuiltLinker diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go index 0eca97f57..242d835e9 100644 --- a/cc/prebuilt_test.go +++ b/cc/prebuilt_test.go @@ -73,6 +73,15 @@ func TestPrebuilt(t *testing.T) { srcs: ["libf.so"], }, } + + cc_object { + name: "crtx", + } + + cc_prebuilt_object { + name: "crtx", + srcs: ["crtx.o"], + } ` ctx := testPrebuilt(t, bp) @@ -84,6 +93,7 @@ func TestPrebuilt(t *testing.T) { libe := ctx.ModuleForTests("libe", "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() + crtx := ctx.ModuleForTests("crtx", "android_arm64_armv8-a").Module() prebuiltLiba := ctx.ModuleForTests("prebuilt_liba", "android_arm64_armv8-a_shared").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() prebuiltLibfStatic := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_static").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 { t.Helper() @@ -126,9 +137,14 @@ func TestPrebuilt(t *testing.T) { if !hasDep(libfShared, prebuiltLibfShared) { 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 { + fs := map[string][]byte{ "liba.so": nil, "libb.a": nil, @@ -136,6 +152,7 @@ func testPrebuilt(t *testing.T, bp string) *android.TestContext { "libe.a": nil, "libf.a": nil, "libf.so": nil, + "crtx.o": nil, } config := TestConfig(buildDir, android.Android, nil, bp, fs) ctx := CreateTestContext() diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 6f9dc3c17..6727b4bf0 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -225,6 +225,63 @@ func TestSdkWithCc(t *testing.T) { `) } +func TestSnapshotWithObject(t *testing.T) { + result := testSdkWithCc(t, ` + sdk { + name: "mysdk", + native_objects: ["crtobj"], + } + + cc_object { + name: "crtobj", + stl: "none", + } + `) + + result.CheckSnapshot("mysdk", "", + checkAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_object { + name: "mysdk_crtobj@current", + sdk_member_name: "crtobj", + stl: "none", + arch: { + arm64: { + srcs: ["arm64/lib/crtobj.o"], + }, + arm: { + srcs: ["arm/lib/crtobj.o"], + }, + }, +} + +cc_prebuilt_object { + name: "crtobj", + prefer: false, + stl: "none", + arch: { + arm64: { + srcs: ["arm64/lib/crtobj.o"], + }, + arm: { + srcs: ["arm/lib/crtobj.o"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + native_objects: ["mysdk_crtobj@current"], +} +`), + checkAllCopyRules(` +.intermediates/crtobj/android_arm64_armv8-a/crtobj.o -> arm64/lib/crtobj.o +.intermediates/crtobj/android_arm_armv7-a-neon/crtobj.o -> arm/lib/crtobj.o +`), + ) +} + func TestSnapshotWithCcDuplicateHeaders(t *testing.T) { result := testSdkWithCc(t, ` sdk {