From 5d19e1de88b7ae9e0e9b74212881e11df57a3833 Mon Sep 17 00:00:00 2001 From: Jaewoong Jung Date: Thu, 1 Nov 2018 15:40:37 -0700 Subject: [PATCH] Export static libraries. Export static libraries through LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRARIES. This enables dependency-based NOTICE file generation. Also, add a notice property in the libwinpthread module. Bug: 36073965 Test: cc_test.go Change-Id: Ic63ca523b40acac82bbe876f7aa40ecd495907c5 --- Android.bp | 1 + android/androidmk.go | 7 ++-- android/config.go | 3 ++ cc/androidmk.go | 6 +++ cc/cc.go | 16 ++++++-- cc/cc_test.go | 92 +++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 117 insertions(+), 8 deletions(-) diff --git a/Android.bp b/Android.bp index 1b93c0d2f..ef42c84c4 100644 --- a/Android.bp +++ b/Android.bp @@ -435,6 +435,7 @@ toolchain_library { src: "prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib/libwinpthread.a", }, }, + notice: "../../prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/licenses/mingw-w64-svn-r5861/mingw-w64-libraries/winpthreads/COPYING", } toolchain_library { diff --git a/android/androidmk.go b/android/androidmk.go index 703052315..493ba97e4 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -275,9 +275,10 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Mod if amod.commonProperties.Owner != nil { fmt.Fprintln(&data.preamble, "LOCAL_MODULE_OWNER :=", *amod.commonProperties.Owner) } - if amod.commonProperties.Notice != nil { - fmt.Fprintln(&data.preamble, "LOCAL_NOTICE_FILE :=", "$(LOCAL_PATH)/"+*amod.commonProperties.Notice) - } + } + + if amod.commonProperties.Notice != nil { + fmt.Fprintln(&data.preamble, "LOCAL_NOTICE_FILE :=", "$(LOCAL_PATH)/"+*amod.commonProperties.Notice) } if host { diff --git a/android/config.go b/android/config.go index 695a2980f..928d07a8b 100644 --- a/android/config.go +++ b/android/config.go @@ -238,6 +238,9 @@ func TestArchConfig(buildDir string, env map[string]string) Config { {BuildOs, Arch{ArchType: X86_64}}, {BuildOs, Arch{ArchType: X86}}, }, + Windows: []Target{ + {Windows, Arch{ArchType: X86}}, + }, } config.BuildOsVariant = config.Targets[BuildOs][0].String() diff --git a/cc/androidmk.go b/cc/androidmk.go index 324b5bc38..69ed77183 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -70,6 +70,12 @@ func (c *Module) AndroidMk() android.AndroidMkData { if len(c.Properties.AndroidMkSharedLibs) > 0 { fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(c.Properties.AndroidMkSharedLibs, " ")) } + if len(c.Properties.AndroidMkStaticLibs) > 0 { + fmt.Fprintln(w, "LOCAL_STATIC_LIBRARIES := "+strings.Join(c.Properties.AndroidMkStaticLibs, " ")) + } + if len(c.Properties.AndroidMkWholeStaticLibs) > 0 { + fmt.Fprintln(w, "LOCAL_WHOLE_STATIC_LIBRARIES := "+strings.Join(c.Properties.AndroidMkWholeStaticLibs, " ")) + } fmt.Fprintln(w, "LOCAL_SOONG_LINK_TYPE :=", c.getMakeLinkType()) if c.useVndk() { fmt.Fprintln(w, "LOCAL_USE_VNDK := true") diff --git a/cc/cc.go b/cc/cc.go index 05695637a..66018d0f9 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -176,10 +176,12 @@ type BaseProperties struct { // Minimum sdk version supported when compiling against the ndk Sdk_version *string - AndroidMkSharedLibs []string `blueprint:"mutated"` - AndroidMkRuntimeLibs []string `blueprint:"mutated"` - HideFromMake bool `blueprint:"mutated"` - PreventInstall bool `blueprint:"mutated"` + AndroidMkSharedLibs []string `blueprint:"mutated"` + AndroidMkStaticLibs []string `blueprint:"mutated"` + AndroidMkRuntimeLibs []string `blueprint:"mutated"` + AndroidMkWholeStaticLibs []string `blueprint:"mutated"` + HideFromMake bool `blueprint:"mutated"` + PreventInstall bool `blueprint:"mutated"` UseVndk bool `blueprint:"mutated"` @@ -1479,9 +1481,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // they merely serve as Make dependencies and do not affect this lib itself. c.Properties.AndroidMkSharedLibs = append( c.Properties.AndroidMkSharedLibs, makeLibName(depName)) + case staticDepTag, staticExportDepTag, lateStaticDepTag: + c.Properties.AndroidMkStaticLibs = append( + c.Properties.AndroidMkStaticLibs, makeLibName(depName)) case runtimeDepTag: c.Properties.AndroidMkRuntimeLibs = append( c.Properties.AndroidMkRuntimeLibs, makeLibName(depName)) + case wholeStaticDepTag: + c.Properties.AndroidMkWholeStaticLibs = append( + c.Properties.AndroidMkWholeStaticLibs, makeLibName(depName)) } }) diff --git a/cc/cc_test.go b/cc/cc_test.go index fba38a29c..8e257d39c 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -55,13 +55,17 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. ctx := android.NewTestArchContext() ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(LibraryFactory)) ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(LibrarySharedFactory)) + ctx.RegisterModuleType("cc_library_static", android.ModuleFactoryAdaptor(LibraryStaticFactory)) ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(LibraryHeaderFactory)) + ctx.RegisterModuleType("cc_library_host_static", android.ModuleFactoryAdaptor(LibraryHostStaticFactory)) ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(ToolchainLibraryFactory)) ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(llndkLibraryFactory)) ctx.RegisterModuleType("llndk_headers", android.ModuleFactoryAdaptor(llndkHeadersFactory)) ctx.RegisterModuleType("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory)) ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(ObjectFactory)) ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory)) + ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(binaryFactory)) + ctx.RegisterModuleType("cc_binary_host", android.ModuleFactoryAdaptor(binaryHostFactory)) ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.BottomUp("image", imageMutator).Parallel() ctx.BottomUp("link", LinkageMutator).Parallel() @@ -122,6 +126,19 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. src: "", } + toolchain_library { + name: "libwinpthread", + vendor_available: true, + recovery_available: true, + host_supported: true, + src: "", + target: { + windows: { + enabled: true, + }, + }, + } + cc_library { name: "libc", no_libgcc: true, @@ -155,14 +172,20 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. name: "libdl", symbol_file: "", } - cc_library { + cc_library_static { name: "libc++_static", no_libgcc: true, nocrt: true, system_shared_libs: [], stl: "none", + host_supported: true, vendor_available: true, recovery_available: true, + target: { + windows: { + enabled: true, + }, + }, } cc_library { name: "libc++", @@ -193,6 +216,14 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. vendor_available: true, } + cc_object { + name: "crtbegin_dynamic", + } + + cc_object { + name: "crtend_android", + } + cc_object { name: "crtend_so", recovery_available: true, @@ -1549,6 +1580,65 @@ func TestRuntimeLibsNoVndk(t *testing.T) { checkRuntimeLibs(t, []string{"libvendor_available1", "libvendor1"}, module) } +func checkStaticLibs(t *testing.T, expected []string, module *Module) { + actual := module.Properties.AndroidMkStaticLibs + if !reflect.DeepEqual(actual, expected) { + t.Errorf("incorrect static_libs"+ + "\nactual: %v"+ + "\nexpected: %v", + actual, + expected, + ) + } +} + +const staticLibAndroidBp = ` + cc_library { + name: "lib1", + } + cc_binary { + name: "bin1", + static_libs: ["lib1"], + } + cc_library_host_static { + name: "lib2", + target: { + windows: { + enabled: true, + }, + } + } + cc_binary_host { + name: "bin2", + static_libs: ["lib2"], + stl: "libc++_static", + target: { + windows: { + enabled: true, + }, + }, + } +` + +func TestStaticLibs(t *testing.T) { + ctx := testCc(t, staticLibAndroidBp) + + // Check a device binary. + variant := "android_arm64_armv8-a_core" + module := ctx.ModuleForTests("bin1", variant).Module().(*Module) + checkStaticLibs(t, []string{"lib1", "libclang_rt.builtins-aarch64-android", "libatomic", "libgcc"}, module) + + // Check a host binary. + variant = "linux_glibc_x86_64" + module = ctx.ModuleForTests("bin2", variant).Module().(*Module) + checkStaticLibs(t, []string{"lib2", "libc++_static"}, module) + + // Check a host binary on Windows. + variant = "windows_x86" + module = ctx.ModuleForTests("bin2", variant).Module().(*Module) + checkStaticLibs(t, []string{"lib2", "libc++_static", "libwinpthread"}, module) +} + var compilerFlagsTestCases = []struct { in string out bool