Propagate flags necessary for a prebuilt of the Bionic linker.
The flags are necessary to avoid implicit dependencies on crt libs, libc, and the linker (recursively). The reason cc_prebuilt_binary react to these flags is that they can affect the install rules. Test: m nothing Test: art/test/testrunner/run_build_test_target.py art-linux-bionic-x64 on a master-art branch using snapshot built from runtime-module-sdk and runtime-module-host-exports Bug: 152255951 Change-Id: I6b2fe92d105d1f446fffd00bd3267a416f75efb7
This commit is contained in:
parent
f455d1fb0a
commit
7130fabd20
|
@ -20,6 +20,7 @@ import (
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
|
"github.com/google/blueprint/proptools"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -65,7 +66,15 @@ func (mt *binarySdkMemberType) IsInstance(module android.Module) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mt *binarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
|
func (mt *binarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
|
||||||
return ctx.SnapshotBuilder().AddPrebuiltModule(member, "cc_prebuilt_binary")
|
pbm := ctx.SnapshotBuilder().AddPrebuiltModule(member, "cc_prebuilt_binary")
|
||||||
|
|
||||||
|
ccModule := member.Variants()[0].(*Module)
|
||||||
|
|
||||||
|
if stl := ccModule.stl.Properties.Stl; stl != nil {
|
||||||
|
pbm.AddProperty("stl", proptools.String(stl))
|
||||||
|
}
|
||||||
|
|
||||||
|
return pbm
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mt *binarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
|
func (mt *binarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
|
||||||
|
@ -105,6 +114,10 @@ type nativeBinaryInfoProperties struct {
|
||||||
//
|
//
|
||||||
// This field is exported as its contents may not be arch specific.
|
// This field is exported as its contents may not be arch specific.
|
||||||
SystemSharedLibs []string
|
SystemSharedLibs []string
|
||||||
|
|
||||||
|
// Arch specific flags.
|
||||||
|
StaticExecutable bool
|
||||||
|
Nocrt bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
|
func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
|
||||||
|
@ -113,6 +126,10 @@ func (p *nativeBinaryInfoProperties) PopulateFromVariant(ctx android.SdkMemberCo
|
||||||
p.archType = ccModule.Target().Arch.ArchType.String()
|
p.archType = ccModule.Target().Arch.ArchType.String()
|
||||||
p.outputFile = getRequiredMemberOutputFile(ctx, ccModule)
|
p.outputFile = getRequiredMemberOutputFile(ctx, ccModule)
|
||||||
|
|
||||||
|
binaryLinker := ccModule.linker.(*binaryDecorator)
|
||||||
|
p.StaticExecutable = binaryLinker.static()
|
||||||
|
p.Nocrt = Bool(binaryLinker.baseLinker.Properties.Nocrt)
|
||||||
|
|
||||||
if ccModule.linker != nil {
|
if ccModule.linker != nil {
|
||||||
specifiedDeps := specifiedDeps{}
|
specifiedDeps := specifiedDeps{}
|
||||||
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps)
|
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps)
|
||||||
|
@ -143,4 +160,11 @@ func (p *nativeBinaryInfoProperties) AddToPropertySet(ctx android.SdkMemberConte
|
||||||
if p.SystemSharedLibs != nil {
|
if p.SystemSharedLibs != nil {
|
||||||
propertySet.AddPropertyWithTag("system_shared_libs", p.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
|
propertySet.AddPropertyWithTag("system_shared_libs", p.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if p.StaticExecutable {
|
||||||
|
propertySet.AddProperty("static_executable", p.StaticExecutable)
|
||||||
|
}
|
||||||
|
if p.Nocrt {
|
||||||
|
propertySet.AddProperty("nocrt", p.Nocrt)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -401,7 +401,6 @@ func TestSnapshotWithCcBinary(t *testing.T) {
|
||||||
"Test.cpp",
|
"Test.cpp",
|
||||||
],
|
],
|
||||||
compile_multilib: "both",
|
compile_multilib: "both",
|
||||||
stl: "none",
|
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
@ -494,6 +493,7 @@ cc_prebuilt_binary {
|
||||||
device_supported: false,
|
device_supported: false,
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
installable: false,
|
installable: false,
|
||||||
|
stl: "none",
|
||||||
target: {
|
target: {
|
||||||
linux_glibc: {
|
linux_glibc: {
|
||||||
compile_multilib: "both",
|
compile_multilib: "both",
|
||||||
|
@ -518,6 +518,7 @@ cc_prebuilt_binary {
|
||||||
prefer: false,
|
prefer: false,
|
||||||
device_supported: false,
|
device_supported: false,
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
|
stl: "none",
|
||||||
target: {
|
target: {
|
||||||
linux_glibc: {
|
linux_glibc: {
|
||||||
compile_multilib: "both",
|
compile_multilib: "both",
|
||||||
|
@ -557,6 +558,90 @@ module_exports_snapshot {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test that we support the necessary flags for the linker binary, which is
|
||||||
|
// special in several ways.
|
||||||
|
func TestSnapshotWithCcStaticNocrtBinary(t *testing.T) {
|
||||||
|
// b/145598135 - Generating host snapshots for anything other than linux is not supported.
|
||||||
|
SkipIfNotLinux(t)
|
||||||
|
|
||||||
|
result := testSdkWithCc(t, `
|
||||||
|
module_exports {
|
||||||
|
name: "mymodule_exports",
|
||||||
|
host_supported: true,
|
||||||
|
device_supported: false,
|
||||||
|
native_binaries: ["linker"],
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_binary {
|
||||||
|
name: "linker",
|
||||||
|
host_supported: true,
|
||||||
|
static_executable: true,
|
||||||
|
nocrt: true,
|
||||||
|
stl: "none",
|
||||||
|
srcs: [
|
||||||
|
"Test.cpp",
|
||||||
|
],
|
||||||
|
compile_multilib: "both",
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
result.CheckSnapshot("mymodule_exports", "",
|
||||||
|
checkAndroidBpContents(`
|
||||||
|
// This is auto-generated. DO NOT EDIT.
|
||||||
|
|
||||||
|
cc_prebuilt_binary {
|
||||||
|
name: "mymodule_exports_linker@current",
|
||||||
|
sdk_member_name: "linker",
|
||||||
|
device_supported: false,
|
||||||
|
host_supported: true,
|
||||||
|
installable: false,
|
||||||
|
stl: "none",
|
||||||
|
static_executable: true,
|
||||||
|
nocrt: true,
|
||||||
|
compile_multilib: "both",
|
||||||
|
arch: {
|
||||||
|
x86_64: {
|
||||||
|
srcs: ["x86_64/bin/linker"],
|
||||||
|
},
|
||||||
|
x86: {
|
||||||
|
srcs: ["x86/bin/linker"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_prebuilt_binary {
|
||||||
|
name: "linker",
|
||||||
|
prefer: false,
|
||||||
|
device_supported: false,
|
||||||
|
host_supported: true,
|
||||||
|
stl: "none",
|
||||||
|
static_executable: true,
|
||||||
|
nocrt: true,
|
||||||
|
compile_multilib: "both",
|
||||||
|
arch: {
|
||||||
|
x86_64: {
|
||||||
|
srcs: ["x86_64/bin/linker"],
|
||||||
|
},
|
||||||
|
x86: {
|
||||||
|
srcs: ["x86/bin/linker"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
module_exports_snapshot {
|
||||||
|
name: "mymodule_exports@current",
|
||||||
|
device_supported: false,
|
||||||
|
host_supported: true,
|
||||||
|
native_binaries: ["mymodule_exports_linker@current"],
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
checkAllCopyRules(`
|
||||||
|
.intermediates/linker/linux_glibc_x86_64/linker -> x86_64/bin/linker
|
||||||
|
.intermediates/linker/linux_glibc_x86/linker -> x86/bin/linker
|
||||||
|
`),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
func TestSnapshotWithCcSharedLibrary(t *testing.T) {
|
func TestSnapshotWithCcSharedLibrary(t *testing.T) {
|
||||||
result := testSdkWithCc(t, `
|
result := testSdkWithCc(t, `
|
||||||
sdk {
|
sdk {
|
||||||
|
|
Loading…
Reference in New Issue