From 7130fabd20530f4809320e38a994f1aba2d39ad7 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Thu, 28 May 2020 22:58:01 +0100 Subject: [PATCH] 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 --- cc/binary_sdk_member.go | 26 +++++++++++- sdk/cc_sdk_test.go | 87 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 111 insertions(+), 2 deletions(-) diff --git a/cc/binary_sdk_member.go b/cc/binary_sdk_member.go index 88ac51349..372a72e2c 100644 --- a/cc/binary_sdk_member.go +++ b/cc/binary_sdk_member.go @@ -20,6 +20,7 @@ import ( "android/soong/android" "github.com/google/blueprint" + "github.com/google/blueprint/proptools" ) 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 { - 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 { @@ -105,6 +114,10 @@ type nativeBinaryInfoProperties struct { // // This field is exported as its contents may not be arch specific. SystemSharedLibs []string + + // Arch specific flags. + StaticExecutable bool + Nocrt bool } 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.outputFile = getRequiredMemberOutputFile(ctx, ccModule) + binaryLinker := ccModule.linker.(*binaryDecorator) + p.StaticExecutable = binaryLinker.static() + p.Nocrt = Bool(binaryLinker.baseLinker.Properties.Nocrt) + if ccModule.linker != nil { specifiedDeps := specifiedDeps{} specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps) @@ -143,4 +160,11 @@ func (p *nativeBinaryInfoProperties) AddToPropertySet(ctx android.SdkMemberConte if p.SystemSharedLibs != nil { 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) + } } diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index dded15360..4a090814d 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -401,7 +401,6 @@ func TestSnapshotWithCcBinary(t *testing.T) { "Test.cpp", ], compile_multilib: "both", - stl: "none", } `) @@ -494,6 +493,7 @@ cc_prebuilt_binary { device_supported: false, host_supported: true, installable: false, + stl: "none", target: { linux_glibc: { compile_multilib: "both", @@ -518,6 +518,7 @@ cc_prebuilt_binary { prefer: false, device_supported: false, host_supported: true, + stl: "none", target: { linux_glibc: { 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) { result := testSdkWithCc(t, ` sdk {