Install VNDK snapshot libraries for system build

When BOARD_VNDK_VERSION := <VNDK version>, or
PRODUCT_EXTRA_VNDK_VERSIONS includes the needed <VNDK version> list,
the prebuilt VNDK libs in prebuilts/vndk/ directory will be
installed.

Each prebuilt VNDK module uses "vndk_prebuilt_shared" for shared
VNDK/VNDK-SP libs.

Following is the sample configuration of a vndk snapshot module:
vndk_prebuilt_shared {
    name: "libfoo",
    version: "27",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    arch: {
        arm64: {
            srcs: ["arm/lib64/libfoo.so"],
        },
        arm: {
            srcs: ["arm/lib/libfoo.so"],
        },
    },
}

The Android.bp for the snapshot modules will be auto-generated by a
script.

Bug: 38304393
Bug: 65377115
Bug: 68123344
Test: set BOARD_VNDK_VERSION := 27
      copy a snapshot for v27
      build with make command

Change-Id: Ib93107530dbabb4a24583f4d6e4f0c513c9adfec
This commit is contained in:
Justin Yun 2017-11-17 12:10:28 +09:00
parent 5760c9a12c
commit 7154928c93
7 changed files with 178 additions and 8 deletions

View file

@ -135,6 +135,7 @@ bootstrap_go_package {
"cc/tidy.go", "cc/tidy.go",
"cc/util.go", "cc/util.go",
"cc/vndk.go", "cc/vndk.go",
"cc/vndk_prebuilt.go",
"cc/cmakelists.go", "cc/cmakelists.go",
"cc/compiler.go", "cc/compiler.go",

View file

@ -632,11 +632,12 @@ func (c *deviceConfig) VendorPath() string {
return "vendor" return "vendor"
} }
func (c *deviceConfig) CompileVndk() bool { func (c *deviceConfig) VndkVersion() string {
if c.config.ProductVariables.DeviceVndkVersion == nil { return String(c.config.ProductVariables.DeviceVndkVersion)
return false }
}
return *c.config.ProductVariables.DeviceVndkVersion == "current" func (c *deviceConfig) ExtraVndkVersions() []string {
return c.config.ProductVariables.ExtraVndkVersions
} }
func (c *deviceConfig) BtConfigIncludeDir() string { func (c *deviceConfig) BtConfigIncludeDir() string {

View file

@ -192,6 +192,8 @@ type productVariables struct {
DeviceKernelHeaders []string `json:",omitempty"` DeviceKernelHeaders []string `json:",omitempty"`
DistDir *string `json:",omitempty"` DistDir *string `json:",omitempty"`
ExtraVndkVersions []string `json:",omitempty"`
} }
func boolPtr(v bool) *bool { func boolPtr(v bool) *bool {

View file

@ -348,3 +348,24 @@ func (c *llndkStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Androi
fmt.Fprintln(w, "LOCAL_USE_VNDK := true") fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
}) })
} }
func (c *vndkPrebuiltLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
ret.Class = "SHARED_LIBRARIES"
ret.SubName = vndkSuffix + c.version()
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
c.libraryDecorator.androidMkWriteExportedFlags(w)
path := c.path.RelPathString()
dir, file := filepath.Split(path)
stem := strings.TrimSuffix(file, filepath.Ext(file))
fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+filepath.Ext(file))
fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir))
fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
})
}

View file

@ -1372,7 +1372,7 @@ func vendorMutator(mctx android.BottomUpMutatorContext) {
if genrule, ok := mctx.Module().(*genrule.Module); ok { if genrule, ok := mctx.Module().(*genrule.Module); ok {
if props, ok := genrule.Extra.(*VendorProperties); ok { if props, ok := genrule.Extra.(*VendorProperties); ok {
if !mctx.DeviceConfig().CompileVndk() { if mctx.DeviceConfig().VndkVersion() == "" {
mctx.CreateVariations(coreMode) mctx.CreateVariations(coreMode)
} else if Bool(props.Vendor_available) { } else if Bool(props.Vendor_available) {
mctx.CreateVariations(coreMode, vendorMode) mctx.CreateVariations(coreMode, vendorMode)
@ -1408,7 +1408,7 @@ func vendorMutator(mctx android.BottomUpMutatorContext) {
} }
} }
if !mctx.DeviceConfig().CompileVndk() { if mctx.DeviceConfig().VndkVersion() == "" {
// If the device isn't compiling against the VNDK, we always // If the device isn't compiling against the VNDK, we always
// use the core mode. // use the core mode.
mctx.CreateVariations(coreMode) mctx.CreateVariations(coreMode)
@ -1419,6 +1419,12 @@ func vendorMutator(mctx android.BottomUpMutatorContext) {
} else if _, ok := m.linker.(*llndkHeadersDecorator); ok { } else if _, ok := m.linker.(*llndkHeadersDecorator); ok {
// ... and LL-NDK headers as well // ... and LL-NDK headers as well
mctx.CreateVariations(vendorMode) mctx.CreateVariations(vendorMode)
} else if _, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
// Make vendor variants only for the versions in BOARD_VNDK_VERSION and
// PRODUCT_EXTRA_VNDK_VERSIONS.
mod := mctx.CreateVariations(vendorMode)
vendor := mod[0].(*Module)
vendor.Properties.UseVndk = true
} else if m.hasVendorVariant() { } else if m.hasVendorVariant() {
// This will be available in both /system and /vendor // This will be available in both /system and /vendor
// or a /system directory that is available to vendor. // or a /system directory that is available to vendor.

View file

@ -172,6 +172,5 @@ func vndkMutator(mctx android.BottomUpMutatorContext) {
} }
} }
} }
} }
} }

140
cc/vndk_prebuilt.go Normal file
View file

@ -0,0 +1,140 @@
// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cc
import (
"strings"
"android/soong/android"
)
var (
vndkSuffix = ".vndk."
)
// Creates vndk prebuilts that include the VNDK version.
//
// Example:
//
// vndk_prebuilt_shared {
// name: "libfoo",
// version: "27.1.0",
// vendor_available: true,
// vndk: {
// enabled: true,
// },
// export_include_dirs: ["include/external/libfoo/vndk_include"],
// arch: {
// arm64: {
// srcs: ["arm/lib64/libfoo.so"],
// },
// arm: {
// srcs: ["arm/lib/libfoo.so"],
// },
// },
// }
//
type vndkPrebuiltProperties struct {
// VNDK snapshot version that is formated as {SDK_ver}.{Major}.{Minor}.
Version string
// Prebuilt files for each arch.
Srcs []string `android:"arch_variant"`
}
type vndkPrebuiltLibraryDecorator struct {
*libraryDecorator
properties vndkPrebuiltProperties
}
func (p *vndkPrebuiltLibraryDecorator) Name(name string) string {
return name + vndkSuffix + p.version()
}
func (p *vndkPrebuiltLibraryDecorator) version() string {
return p.properties.Version
}
func (p *vndkPrebuiltLibraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
p.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), vndkSuffix+p.version())
return p.libraryDecorator.linkerFlags(ctx, flags)
}
func (p *vndkPrebuiltLibraryDecorator) singleSourcePath(ctx ModuleContext) android.Path {
if len(p.properties.Srcs) == 0 {
ctx.PropertyErrorf("srcs", "missing prebuilt source file")
return nil
}
if len(p.properties.Srcs) > 1 {
ctx.PropertyErrorf("srcs", "multiple prebuilt source files")
return nil
}
return android.PathForModuleSrc(ctx, p.properties.Srcs[0])
}
func (p *vndkPrebuiltLibraryDecorator) link(ctx ModuleContext,
flags Flags, deps PathDeps, objs Objects) android.Path {
if len(p.properties.Srcs) > 0 && p.shared() {
// current VNDK prebuilts are only shared libs.
return p.singleSourcePath(ctx)
}
return nil
}
func (p *vndkPrebuiltLibraryDecorator) install(ctx ModuleContext, file android.Path) {
if p.shared() {
if ctx.Device() && ctx.useVndk() {
if ctx.isVndkSp() {
p.baseInstaller.subDir = "vndk-sp-" + p.version()
} else if ctx.isVndk() {
p.baseInstaller.subDir = "vndk-" + p.version()
}
}
p.baseInstaller.install(ctx, file)
}
}
func vndkPrebuiltSharedLibrary() *Module {
module, library := NewLibrary(android.DeviceSupported)
library.BuildOnlyShared()
module.stl = nil
module.sanitize = nil
library.StripProperties.Strip.None = BoolPtr(true)
prebuilt := &vndkPrebuiltLibraryDecorator{
libraryDecorator: library,
}
module.compiler = nil
module.linker = prebuilt
module.installer = prebuilt
module.AddProperties(
&prebuilt.properties,
)
return module
}
func vndkPrebuiltSharedFactory() android.Module {
module := vndkPrebuiltSharedLibrary()
return module.Init()
}
func init() {
android.RegisterModuleType("vndk_prebuilt_shared", vndkPrebuiltSharedFactory)
}