Merge "Split /system and /vendor modules, allow multi-installation"

This commit is contained in:
Dan Willemsen
2017-04-12 00:06:51 +00:00
committed by Gerrit Code Review
9 changed files with 147 additions and 11 deletions

View File

@@ -26,6 +26,7 @@ import (
type AndroidMkContext interface {
Target() android.Target
subAndroidMk(*android.AndroidMkData, interface{})
vndk() bool
}
type subAndroidMkProvider interface {
@@ -56,13 +57,16 @@ func (c *Module) AndroidMk() (ret android.AndroidMkData, err error) {
if len(c.Properties.AndroidMkSharedLibs) > 0 {
fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(c.Properties.AndroidMkSharedLibs, " "))
}
if c.Target().Os == android.Android && c.Properties.Sdk_version != "" {
if c.Target().Os == android.Android && c.Properties.Sdk_version != "" && !c.vndk() {
fmt.Fprintln(w, "LOCAL_SDK_VERSION := "+c.Properties.Sdk_version)
fmt.Fprintln(w, "LOCAL_NDK_STL_VARIANT := none")
} else {
// These are already included in LOCAL_SHARED_LIBRARIES
fmt.Fprintln(w, "LOCAL_CXX_STL := none")
}
if c.vndk() {
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
}
return nil
})
@@ -74,6 +78,10 @@ func (c *Module) AndroidMk() (ret android.AndroidMkData, err error) {
c.subAndroidMk(&ret, c.linker)
c.subAndroidMk(&ret, c.installer)
if c.vndk() {
ret.SubName += ".vendor"
}
return ret, nil
}
@@ -118,6 +126,8 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An
if host {
fmt.Fprintln(w, "LOCAL_MODULE_HOST_OS :=", ctx.Target().Os.String())
fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
} else if ctx.vndk() {
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
}
library.androidMkWriteExportedFlags(w)
@@ -301,7 +311,7 @@ func (c *stubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkDa
func (c *llndkStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
ret.Class = "SHARED_LIBRARIES"
ret.SubName = llndkLibrarySuffix
ret.SubName = ".vendor"
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
c.libraryDecorator.androidMkWriteExportedFlags(w)
@@ -311,6 +321,7 @@ func (c *llndkStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Androi
fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
return nil
})

View File

@@ -108,7 +108,7 @@ func (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
deps = binary.baseLinker.linkerDeps(ctx, deps)
if ctx.toolchain().Bionic() {
if !Bool(binary.baseLinker.Properties.Nocrt) {
if !ctx.sdk() && !ctx.vndk() {
if !ctx.sdk() {
if binary.static() {
deps.CrtBegin = "crtbegin_static"
} else {

View File

@@ -35,6 +35,7 @@ func init() {
android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("link", linkageMutator).Parallel()
ctx.BottomUp("image", vendorMutator).Parallel()
ctx.BottomUp("ndk_api", ndkApiMutator).Parallel()
ctx.BottomUp("test_per_src", testPerSrcMutator).Parallel()
ctx.BottomUp("begin", beginMutator).Parallel()
@@ -143,9 +144,24 @@ type BaseProperties struct {
// cppflags, conlyflags, ldflags, or include_dirs
No_default_compiler_flags *bool
// whether this module should be allowed to install onto /vendor as
// well as /system. The two variants will be built separately, one
// like normal, and the other limited to the set of libraries and
// headers that are exposed to /vendor modules.
//
// The vendor variant may be used with a different (newer) /system,
// so it shouldn't have any unversioned runtime dependencies, or
// make assumptions about the system that may not be true in the
// future.
//
// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
Vendor_available *bool
AndroidMkSharedLibs []string `blueprint:"mutated"`
HideFromMake bool `blueprint:"mutated"`
PreventInstall bool `blueprint:"mutated"`
UseVndk bool `blueprint:"mutated"`
}
type UnusedProperties struct {
@@ -320,6 +336,10 @@ func (c *Module) isDependencyRoot() bool {
return false
}
func (c *Module) vndk() bool {
return c.Properties.UseVndk
}
type baseModuleContext struct {
android.BaseContext
moduleContextImpl
@@ -335,6 +355,12 @@ type moduleContext struct {
moduleContextImpl
}
// Vendor returns true for vendor modules so that they get installed onto the
// correct partition
func (ctx *moduleContext) Vendor() bool {
return ctx.ModuleContext.Vendor() || ctx.moduleContextImpl.mod.Properties.UseVndk
}
type moduleContextImpl struct {
mod *Module
ctx BaseModuleContext
@@ -371,7 +397,7 @@ func (ctx *moduleContextImpl) noDefaultCompilerFlags() bool {
}
func (ctx *moduleContextImpl) sdk() bool {
if ctx.ctx.Device() {
if ctx.ctx.Device() && !ctx.vndk() {
return ctx.mod.Properties.Sdk_version != ""
}
return false
@@ -389,7 +415,7 @@ func (ctx *moduleContextImpl) sdkVersion() string {
}
func (ctx *moduleContextImpl) vndk() bool {
return ctx.ctx.Os() == android.Android && ctx.ctx.Vendor() && ctx.ctx.DeviceConfig().CompileVndk()
return ctx.mod.vndk()
}
func (ctx *moduleContextImpl) selectedStl() string {
@@ -772,6 +798,10 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
// Host code is not restricted
return
}
if from.Properties.UseVndk {
// Vendor code is already limited by the vendor mutator
return
}
if from.Properties.Sdk_version == "" {
// Platform code can link to anything
return
@@ -1060,6 +1090,57 @@ func DefaultsFactory(props ...interface{}) (blueprint.Module, []interface{}) {
return android.InitDefaultsModule(module, module, props...)
}
const (
// coreMode is the variant used for framework-private libraries, or
// SDK libraries. (which framework-private libraries can use)
coreMode = "core"
// vendorMode is the variant used for /vendor code that compiles
// against the VNDK.
vendorMode = "vendor"
)
func vendorMutator(mctx android.BottomUpMutatorContext) {
if mctx.Os() != android.Android {
return
}
m, ok := mctx.Module().(*Module)
if !ok {
return
}
// Sanity check
if Bool(m.Properties.Vendor_available) && mctx.Vendor() {
mctx.PropertyErrorf("vendor_available",
"doesn't make sense at the same time as `vendor: true` or `proprietary: true`")
return
}
if !mctx.DeviceConfig().CompileVndk() {
// If the device isn't compiling against the VNDK, we always
// use the core mode.
mctx.CreateVariations(coreMode)
} else if _, ok := m.linker.(*llndkStubDecorator); ok {
// LL-NDK stubs only exist in the vendor variant, since the
// real libraries will be used in the core variant.
mctx.CreateVariations(vendorMode)
} else if Bool(m.Properties.Vendor_available) {
// This will be available in both /system and /vendor
mod := mctx.CreateVariations(coreMode, vendorMode)
mod[1].(*Module).Properties.UseVndk = true
} else if mctx.Vendor() && m.Properties.Sdk_version == "" {
// This will be available in /vendor only
mod := mctx.CreateVariations(vendorMode)
mod[0].(*Module).Properties.UseVndk = true
} else {
// This is either in /system (or similar: /data), or is a
// modules built with the NDK. Modules built with the NDK
// will be restricted using the existing link type checks.
mctx.CreateVariations(coreMode)
}
}
// lastUniqueElements returns all unique elements of a slice, keeping the last copy of each
// modifies the slice contents in place, and returns a subslice of the original slice
func lastUniqueElements(list []string) []string {

View File

@@ -113,6 +113,18 @@ type BaseCompilerProperties struct {
// release builds
Cflags []string `android:"arch_variant"`
} `android:"arch_variant"`
Target struct {
Vendor struct {
// list of source files that should only be used in the
// vendor variant of the C/C++ module.
Srcs []string
// list of source files that should not be used to
// build the vendor variant of the C/C++ module.
Exclude_srcs []string
}
}
}
func NewBaseCompiler() *baseCompiler {
@@ -429,6 +441,14 @@ func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathD
pathDeps := deps.GeneratedHeaders
pathDeps = append(pathDeps, ndkPathDeps(ctx)...)
if ctx.vndk() {
compiler.Properties.Srcs = append(compiler.Properties.Srcs,
compiler.Properties.Target.Vendor.Srcs...)
compiler.Properties.Exclude_srcs = append(compiler.Properties.Exclude_srcs,
compiler.Properties.Target.Vendor.Exclude_srcs...)
}
srcs := ctx.ExpandSources(compiler.Properties.Srcs, compiler.Properties.Exclude_srcs)
srcs = append(srcs, deps.GeneratedSources...)

View File

@@ -68,6 +68,9 @@ func (installer *baseInstaller) installDir(ctx ModuleContext) android.OutputPath
if !ctx.Host() && !ctx.Arch().Native {
subDir = filepath.Join(subDir, ctx.Arch().ArchType.String())
}
if installer.location == InstallInData && ctx.vndk() {
subDir = filepath.Join(subDir, "vendor")
}
return android.PathForModuleInstall(ctx, subDir, installer.Properties.Relative_install_path, installer.relative)
}

View File

@@ -84,6 +84,16 @@ type FlagExporterProperties struct {
// be added to the include path (using -I) for this module and any module that links
// against this module
Export_include_dirs []string `android:"arch_variant"`
Target struct {
Vendor struct {
// list of exported include directories, like
// export_include_dirs, that will be applied to the
// vendor variant of this library. This will overwrite
// any other declarations.
Export_include_dirs []string
}
}
}
func init() {
@@ -144,8 +154,16 @@ type flagExporter struct {
flagsDeps android.Paths
}
func (f *flagExporter) exportedIncludes(ctx ModuleContext) android.Paths {
if ctx.Vendor() && f.Properties.Target.Vendor.Export_include_dirs != nil {
return android.PathsForModuleSrc(ctx, f.Properties.Target.Vendor.Export_include_dirs)
} else {
return android.PathsForModuleSrc(ctx, f.Properties.Export_include_dirs)
}
}
func (f *flagExporter) exportIncludes(ctx ModuleContext, inc string) {
includeDirs := android.PathsForModuleSrc(ctx, f.Properties.Export_include_dirs)
includeDirs := f.exportedIncludes(ctx)
for _, dir := range includeDirs.Strings() {
f.flags = append(f.flags, inc+dir)
}
@@ -277,7 +295,7 @@ func (library *libraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Fla
}
func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
exportIncludeDirs := android.PathsForModuleSrc(ctx, library.flagExporter.Properties.Export_include_dirs)
exportIncludeDirs := library.flagExporter.exportedIncludes(ctx)
if len(exportIncludeDirs) > 0 {
flags.GlobalFlags = append(flags.GlobalFlags, includeDirsToFlags(exportIncludeDirs))
}
@@ -369,7 +387,7 @@ func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
deps.SharedLibs = append(deps.SharedLibs, library.Properties.Static.Shared_libs...)
} else if library.shared() {
if ctx.toolchain().Bionic() && !Bool(library.baseLinker.Properties.Nocrt) {
if !ctx.sdk() && !ctx.vndk() {
if !ctx.sdk() {
deps.CrtBegin = "crtbegin_so"
deps.CrtEnd = "crtend_so"
} else {

View File

@@ -143,7 +143,7 @@ func (linker *baseLinker) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
if linker.Properties.System_shared_libs != nil {
deps.LateSharedLibs = append(deps.LateSharedLibs,
linker.Properties.System_shared_libs...)
} else if !ctx.sdk() {
} else if !ctx.sdk() && !ctx.vndk() {
deps.LateSharedLibs = append(deps.LateSharedLibs, "libc", "libm")
}
}
@@ -154,6 +154,9 @@ func (linker *baseLinker) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
"libm",
)
}
if ctx.vndk() {
deps.LateSharedLibs = append(deps.LateSharedLibs, "libc", "libm")
}
}
if ctx.Windows() {

View File

@@ -57,8 +57,6 @@ func makeVarsProvider(ctx android.MakeVarsContext) {
} else {
ctx.Strict("BOARD_VNDK_VERSION", "")
}
ctx.Strict("VNDK_LIBRARIES", strings.Join(config.VndkLibraries(), " "))
ctx.Strict("LLNDK_LIBRARIES", strings.Join(config.LLndkLibraries(), " "))
ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS", asanCflags)
ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS", asanLdflags)