Merge "Create vndkproduct.libraries.txt"
This commit is contained in:
commit
47d186cd4e
|
@ -3150,6 +3150,7 @@ func TestVndkApexCurrent(t *testing.T) {
|
|||
"etc/vndkcore.libraries.VER.txt",
|
||||
"etc/vndksp.libraries.VER.txt",
|
||||
"etc/vndkprivate.libraries.VER.txt",
|
||||
"etc/vndkproduct.libraries.VER.txt",
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -3216,7 +3217,7 @@ func TestVndkApexWithPrebuilt(t *testing.T) {
|
|||
func vndkLibrariesTxtFiles(vers ...string) (result string) {
|
||||
for _, v := range vers {
|
||||
if v == "current" {
|
||||
for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
|
||||
for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
|
||||
result += `
|
||||
vndk_libraries_txt {
|
||||
name: "` + txt + `.libraries.txt",
|
||||
|
@ -3224,7 +3225,7 @@ func vndkLibrariesTxtFiles(vers ...string) (result string) {
|
|||
`
|
||||
}
|
||||
} else {
|
||||
for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
|
||||
for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
|
||||
result += `
|
||||
prebuilt_etc {
|
||||
name: "` + txt + `.libraries.` + v + `.txt",
|
||||
|
|
|
@ -60,6 +60,7 @@ func TestVndkApexForVndkLite(t *testing.T) {
|
|||
"etc/vndkcore.libraries.VER.txt",
|
||||
"etc/vndksp.libraries.VER.txt",
|
||||
"etc/vndkprivate.libraries.VER.txt",
|
||||
"etc/vndkproduct.libraries.VER.txt",
|
||||
})
|
||||
}
|
||||
|
||||
|
|
123
cc/cc_test.go
123
cc/cc_test.go
|
@ -68,6 +68,7 @@ func testCc(t *testing.T, bp string) *android.TestContext {
|
|||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||
config.TestProductVariables.ProductVndkVersion = StringPtr("current")
|
||||
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||
|
||||
return testCcWithConfig(t, config)
|
||||
|
@ -81,6 +82,15 @@ func testCcNoVndk(t *testing.T, bp string) *android.TestContext {
|
|||
return testCcWithConfig(t, config)
|
||||
}
|
||||
|
||||
func testCcNoProductVndk(t *testing.T, bp string) *android.TestContext {
|
||||
t.Helper()
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||
|
||||
return testCcWithConfig(t, config)
|
||||
}
|
||||
|
||||
func testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) {
|
||||
t.Helper()
|
||||
|
||||
|
@ -420,6 +430,9 @@ func TestVndk(t *testing.T) {
|
|||
vndk_libraries_txt {
|
||||
name: "vndkprivate.libraries.txt",
|
||||
}
|
||||
vndk_libraries_txt {
|
||||
name: "vndkproduct.libraries.txt",
|
||||
}
|
||||
vndk_libraries_txt {
|
||||
name: "vndkcorevariant.libraries.txt",
|
||||
}
|
||||
|
@ -445,7 +458,6 @@ func TestVndk(t *testing.T) {
|
|||
checkVndkModule(t, ctx, "libvndk_sp_product_private", "", true, "", productVariant)
|
||||
|
||||
// Check VNDK snapshot output.
|
||||
|
||||
snapshotDir := "vndk-snapshot"
|
||||
snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64")
|
||||
|
||||
|
@ -476,6 +488,7 @@ func TestVndk(t *testing.T) {
|
|||
checkSnapshot(t, ctx, snapshotSingleton, "vndkcore.libraries.txt", "vndkcore.libraries.txt", snapshotConfigsPath, "")
|
||||
checkSnapshot(t, ctx, snapshotSingleton, "vndksp.libraries.txt", "vndksp.libraries.txt", snapshotConfigsPath, "")
|
||||
checkSnapshot(t, ctx, snapshotSingleton, "vndkprivate.libraries.txt", "vndkprivate.libraries.txt", snapshotConfigsPath, "")
|
||||
checkSnapshot(t, ctx, snapshotSingleton, "vndkproduct.libraries.txt", "vndkproduct.libraries.txt", snapshotConfigsPath, "")
|
||||
|
||||
checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{
|
||||
"LLNDK: libc.so",
|
||||
|
@ -493,11 +506,15 @@ func TestVndk(t *testing.T) {
|
|||
"VNDK-private: libvndk-private.so",
|
||||
"VNDK-private: libvndk_sp_private-x.so",
|
||||
"VNDK-private: libvndk_sp_product_private-x.so",
|
||||
"VNDK-product: libc++.so",
|
||||
"VNDK-product: libvndk_product.so",
|
||||
"VNDK-product: libvndk_sp_product_private-x.so",
|
||||
})
|
||||
checkVndkLibrariesOutput(t, ctx, "llndk.libraries.txt", []string{"libc.so", "libdl.so", "libft2.so", "libm.so"})
|
||||
checkVndkLibrariesOutput(t, ctx, "vndkcore.libraries.txt", []string{"libvndk-private.so", "libvndk.so", "libvndk_product.so"})
|
||||
checkVndkLibrariesOutput(t, ctx, "vndksp.libraries.txt", []string{"libc++.so", "libvndk_sp-x.so", "libvndk_sp_private-x.so", "libvndk_sp_product_private-x.so"})
|
||||
checkVndkLibrariesOutput(t, ctx, "vndkprivate.libraries.txt", []string{"libft2.so", "libvndk-private.so", "libvndk_sp_private-x.so", "libvndk_sp_product_private-x.so"})
|
||||
checkVndkLibrariesOutput(t, ctx, "vndkproduct.libraries.txt", []string{"libc++.so", "libvndk_product.so", "libvndk_sp_product_private-x.so"})
|
||||
checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", nil)
|
||||
}
|
||||
|
||||
|
@ -711,6 +728,15 @@ func TestVndkWhenVndkVersionIsNotSet(t *testing.T) {
|
|||
},
|
||||
nocrt: true,
|
||||
}
|
||||
cc_library {
|
||||
name: "libvndk-private",
|
||||
vendor_available: false,
|
||||
product_available: false,
|
||||
vndk: {
|
||||
enabled: true,
|
||||
},
|
||||
nocrt: true,
|
||||
}
|
||||
`)
|
||||
|
||||
checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{
|
||||
|
@ -719,8 +745,13 @@ func TestVndkWhenVndkVersionIsNotSet(t *testing.T) {
|
|||
"LLNDK: libft2.so",
|
||||
"LLNDK: libm.so",
|
||||
"VNDK-SP: libc++.so",
|
||||
"VNDK-core: libvndk-private.so",
|
||||
"VNDK-core: libvndk.so",
|
||||
"VNDK-private: libft2.so",
|
||||
"VNDK-private: libvndk-private.so",
|
||||
"VNDK-product: libc++.so",
|
||||
"VNDK-product: libvndk-private.so",
|
||||
"VNDK-product: libvndk.so",
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -2200,7 +2231,7 @@ func TestVndkExtWithoutBoardVndkVersion(t *testing.T) {
|
|||
|
||||
func TestVndkExtWithoutProductVndkVersion(t *testing.T) {
|
||||
// This test checks the VNDK-Ext properties when PRODUCT_PRODUCT_VNDK_VERSION is not set.
|
||||
ctx := testCc(t, `
|
||||
ctx := testCcNoProductVndk(t, `
|
||||
cc_library {
|
||||
name: "libvndk",
|
||||
vendor_available: true,
|
||||
|
@ -3511,9 +3542,18 @@ func checkRuntimeLibs(t *testing.T, expected []string, module *Module) {
|
|||
}
|
||||
|
||||
const runtimeLibAndroidBp = `
|
||||
cc_library {
|
||||
name: "liball_available",
|
||||
vendor_available: true,
|
||||
product_available: true,
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
}
|
||||
cc_library {
|
||||
name: "libvendor_available1",
|
||||
vendor_available: true,
|
||||
runtime_libs: ["liball_available"],
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
|
@ -3521,18 +3561,10 @@ const runtimeLibAndroidBp = `
|
|||
cc_library {
|
||||
name: "libvendor_available2",
|
||||
vendor_available: true,
|
||||
runtime_libs: ["libvendor_available1"],
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
}
|
||||
cc_library {
|
||||
name: "libvendor_available3",
|
||||
vendor_available: true,
|
||||
runtime_libs: ["libvendor_available1"],
|
||||
runtime_libs: ["liball_available"],
|
||||
target: {
|
||||
vendor: {
|
||||
exclude_runtime_libs: ["libvendor_available1"],
|
||||
exclude_runtime_libs: ["liball_available"],
|
||||
}
|
||||
},
|
||||
no_libcrt : true,
|
||||
|
@ -3541,7 +3573,7 @@ const runtimeLibAndroidBp = `
|
|||
}
|
||||
cc_library {
|
||||
name: "libcore",
|
||||
runtime_libs: ["libvendor_available1"],
|
||||
runtime_libs: ["liball_available"],
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
|
@ -3556,7 +3588,30 @@ const runtimeLibAndroidBp = `
|
|||
cc_library {
|
||||
name: "libvendor2",
|
||||
vendor: true,
|
||||
runtime_libs: ["libvendor_available1", "libvendor1"],
|
||||
runtime_libs: ["liball_available", "libvendor1"],
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
}
|
||||
cc_library {
|
||||
name: "libproduct_available1",
|
||||
product_available: true,
|
||||
runtime_libs: ["liball_available"],
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
}
|
||||
cc_library {
|
||||
name: "libproduct1",
|
||||
product_specific: true,
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
}
|
||||
cc_library {
|
||||
name: "libproduct2",
|
||||
product_specific: true,
|
||||
runtime_libs: ["liball_available", "libproduct1"],
|
||||
no_libcrt : true,
|
||||
nocrt : true,
|
||||
system_shared_libs : [],
|
||||
|
@ -3569,32 +3624,45 @@ func TestRuntimeLibs(t *testing.T) {
|
|||
// runtime_libs for core variants use the module names without suffixes.
|
||||
variant := "android_arm64_armv8-a_shared"
|
||||
|
||||
module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
|
||||
module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available"}, module)
|
||||
|
||||
module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available"}, module)
|
||||
|
||||
module = ctx.ModuleForTests("libcore", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
|
||||
checkRuntimeLibs(t, []string{"liball_available"}, module)
|
||||
|
||||
// runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core
|
||||
// and vendor variants.
|
||||
variant = "android_vendor.VER_arm64_armv8-a_shared"
|
||||
|
||||
module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1.vendor"}, module)
|
||||
module = ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available.vendor"}, module)
|
||||
|
||||
module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1.vendor", "libvendor1"}, module)
|
||||
checkRuntimeLibs(t, []string{"liball_available.vendor", "libvendor1"}, module)
|
||||
|
||||
// runtime_libs for product variants have '.product' suffixes if the modules have both core
|
||||
// and product variants.
|
||||
variant = "android_product.VER_arm64_armv8-a_shared"
|
||||
|
||||
module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available.product"}, module)
|
||||
|
||||
module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available.product", "libproduct1"}, module)
|
||||
}
|
||||
|
||||
func TestExcludeRuntimeLibs(t *testing.T) {
|
||||
ctx := testCc(t, runtimeLibAndroidBp)
|
||||
|
||||
variant := "android_arm64_armv8-a_shared"
|
||||
module := ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
|
||||
module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available"}, module)
|
||||
|
||||
variant = "android_vendor.VER_arm64_armv8-a_shared"
|
||||
module = ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
|
||||
module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, nil, module)
|
||||
}
|
||||
|
||||
|
@ -3605,11 +3673,14 @@ func TestRuntimeLibsNoVndk(t *testing.T) {
|
|||
|
||||
variant := "android_arm64_armv8-a_shared"
|
||||
|
||||
module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
|
||||
module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available"}, module)
|
||||
|
||||
module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"libvendor_available1", "libvendor1"}, module)
|
||||
checkRuntimeLibs(t, []string{"liball_available", "libvendor1"}, module)
|
||||
|
||||
module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module)
|
||||
checkRuntimeLibs(t, []string{"liball_available", "libproduct1"}, module)
|
||||
}
|
||||
|
||||
func checkStaticLibs(t *testing.T, expected []string, module *Module) {
|
||||
|
|
|
@ -67,9 +67,8 @@ const (
|
|||
)
|
||||
|
||||
func (ctx *moduleContext) ProductSpecific() bool {
|
||||
//TODO(b/150902910): Replace HasNonSystemVariants() with HasProductVariant()
|
||||
return ctx.ModuleContext.ProductSpecific() ||
|
||||
(ctx.mod.HasNonSystemVariants() && ctx.mod.InProduct())
|
||||
(ctx.mod.HasProductVariant() && ctx.mod.InProduct())
|
||||
}
|
||||
|
||||
func (ctx *moduleContext) SocSpecific() bool {
|
||||
|
|
38
cc/vndk.go
38
cc/vndk.go
|
@ -35,6 +35,7 @@ const (
|
|||
vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
|
||||
vndkSpLibrariesTxt = "vndksp.libraries.txt"
|
||||
vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
|
||||
vndkProductLibrariesTxt = "vndkproduct.libraries.txt"
|
||||
vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
|
||||
)
|
||||
|
||||
|
@ -45,6 +46,7 @@ func VndkLibrariesTxtModules(vndkVersion string) []string {
|
|||
vndkCoreLibrariesTxt,
|
||||
vndkSpLibrariesTxt,
|
||||
vndkPrivateLibrariesTxt,
|
||||
vndkProductLibrariesTxt,
|
||||
}
|
||||
}
|
||||
// Snapshot vndks have their own *.libraries.VER.txt files.
|
||||
|
@ -54,6 +56,7 @@ func VndkLibrariesTxtModules(vndkVersion string) []string {
|
|||
insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
|
||||
insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
|
||||
insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
|
||||
insertVndkVersion(vndkProductLibrariesTxt, vndkVersion),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,10 +232,11 @@ func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
|
|||
}
|
||||
|
||||
var (
|
||||
vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires")
|
||||
vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires")
|
||||
llndkLibrariesKey = android.NewOnceKey("llndkLibrarires")
|
||||
vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires")
|
||||
vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibraries")
|
||||
vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibraries")
|
||||
llndkLibrariesKey = android.NewOnceKey("llndkLibraries")
|
||||
vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibraries")
|
||||
vndkProductLibrariesKey = android.NewOnceKey("vndkProductLibraries")
|
||||
vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries")
|
||||
vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
|
||||
vndkLibrariesLock sync.Mutex
|
||||
|
@ -262,6 +266,12 @@ func vndkPrivateLibraries(config android.Config) map[string]string {
|
|||
}).(map[string]string)
|
||||
}
|
||||
|
||||
func vndkProductLibraries(config android.Config) map[string]string {
|
||||
return config.Once(vndkProductLibrariesKey, func() interface{} {
|
||||
return make(map[string]string)
|
||||
}).(map[string]string)
|
||||
}
|
||||
|
||||
func vndkUsingCoreVariantLibraries(config android.Config) map[string]string {
|
||||
return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} {
|
||||
return make(map[string]string)
|
||||
|
@ -299,6 +309,12 @@ func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
|
|||
}
|
||||
|
||||
func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
|
||||
if m.InProduct() {
|
||||
// We may skip the steps for the product variants because they
|
||||
// are already covered by the vendor variants.
|
||||
return
|
||||
}
|
||||
|
||||
name := m.BaseModuleName()
|
||||
filename, err := getVndkFileName(m)
|
||||
if err != nil {
|
||||
|
@ -318,12 +334,6 @@ func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
|
|||
vndkLibrariesLock.Lock()
|
||||
defer vndkLibrariesLock.Unlock()
|
||||
|
||||
if m.InProduct() {
|
||||
// We may skip the other steps for the product variants because they
|
||||
// are already covered by the vendor variants.
|
||||
return
|
||||
}
|
||||
|
||||
if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
|
||||
m.Properties.MustUseVendorVariant = true
|
||||
}
|
||||
|
@ -339,6 +349,9 @@ func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
|
|||
if m.IsVndkPrivate() {
|
||||
vndkPrivateLibraries(mctx.Config())[name] = filename
|
||||
}
|
||||
if m.VendorProperties.Product_available != nil {
|
||||
vndkProductLibraries(mctx.Config())[name] = filename
|
||||
}
|
||||
}
|
||||
|
||||
// Check for modules that mustn't be VNDK
|
||||
|
@ -453,6 +466,7 @@ var _ android.OutputFileProducer = &vndkLibrariesTxt{}
|
|||
// - vndkcore.libraries.txt
|
||||
// - vndksp.libraries.txt
|
||||
// - vndkprivate.libraries.txt
|
||||
// - vndkproduct.libraries.txt
|
||||
// - vndkcorevariant.libraries.txt
|
||||
// A module behaves like a prebuilt_etc but its content is generated by soong.
|
||||
// By being a soong module, these files can be referenced by other soong modules.
|
||||
|
@ -486,6 +500,8 @@ func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleConte
|
|||
list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
|
||||
case vndkPrivateLibrariesTxt:
|
||||
list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
|
||||
case vndkProductLibrariesTxt:
|
||||
list = android.SortedStringMapValues(vndkProductLibraries(ctx.Config()))
|
||||
case vndkUsingCoreVariantLibrariesTxt:
|
||||
list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
|
||||
default:
|
||||
|
@ -807,6 +823,7 @@ func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.Singleton
|
|||
vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
|
||||
vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
|
||||
vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
|
||||
vndkproduct := android.SortedStringMapValues(vndkProductLibraries(ctx.Config()))
|
||||
|
||||
// Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
|
||||
// Since each target have different set of libclang_rt.* files,
|
||||
|
@ -824,6 +841,7 @@ func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.Singleton
|
|||
merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
|
||||
merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
|
||||
merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
|
||||
merged = append(merged, addPrefix(filterOutLibClangRt(vndkproduct), "VNDK-product: ")...)
|
||||
c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
|
||||
android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n"))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue