Merge changes I2ab8f6aa,I53d58100
* changes: Add SDK member support for cc_object. Add cc_prebuilt_object.
This commit is contained in:
commit
71da478f51
7 changed files with 150 additions and 10 deletions
|
@ -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)
|
||||
|
|
|
@ -29,7 +29,7 @@ var headersLibrarySdkMemberType = &librarySdkMemberType{
|
|||
SupportsSdk: true,
|
||||
},
|
||||
prebuiltModuleType: "cc_prebuilt_library_headers",
|
||||
linkTypes: nil,
|
||||
noOutputFiles: true,
|
||||
}
|
||||
|
||||
func RegisterLibraryHeadersBuildComponents(ctx android.RegistrationContext) {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
22
cc/object.go
22
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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue