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
This commit is contained in:
Jaewoong Jung 2018-11-01 15:40:37 -07:00
parent ea058fd78c
commit 5d19e1de88
6 changed files with 117 additions and 8 deletions

View file

@ -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 {

View file

@ -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 {

View file

@ -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()

View file

@ -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")

View file

@ -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))
}
})

View file

@ -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