Merge changes I0668ff5a,Iff2d7063,I6f8b1e2d,I126db49d,Ic6582260

am: a35294889f

Change-Id: Ie7dd47c977104d74b8cb31481524cb22cbc46d18
This commit is contained in:
Paul Duffin
2020-01-15 18:11:36 -08:00
committed by android-build-merger
11 changed files with 168 additions and 11 deletions

View File

@@ -22,7 +22,19 @@ import (
) )
func init() { func init() {
RegisterModuleType("package", PackageFactory) RegisterPackageBuildComponents(InitRegistrationContext)
}
// Register the package module type and supporting mutators.
//
// This must be called in the correct order (relative to other methods that also
// register mutators) to match the order of mutator registration in mutator.go.
// Failing to do so will result in an unrealistic test environment.
func RegisterPackageBuildComponents(ctx RegistrationContext) {
ctx.RegisterModuleType("package", PackageFactory)
// Register mutators that are hard coded in to mutator.go.
ctx.HardCodedPreArchMutators(RegisterPackageRenamer)
} }
// The information maintained about each package. // The information maintained about each package.

View File

@@ -87,8 +87,7 @@ func testPackage(fs map[string][]byte) (*TestContext, []error) {
config := TestArchConfig(buildDir, nil, "", fs) config := TestArchConfig(buildDir, nil, "", fs)
ctx := NewTestArchContext() ctx := NewTestArchContext()
ctx.RegisterModuleType("package", PackageFactory) RegisterPackageBuildComponents(ctx)
ctx.PreArchMutators(RegisterPackageRenamer)
ctx.Register(config) ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles(".") _, errs := ctx.ParseBlueprintsFiles(".")

View File

@@ -36,6 +36,9 @@ type prebuiltDependencyTag struct {
var PrebuiltDepTag prebuiltDependencyTag var PrebuiltDepTag prebuiltDependencyTag
// Mark this tag so dependencies that use it are excluded from visibility enforcement.
func (t prebuiltDependencyTag) ExcludeFromVisibilityEnforcement() {}
type PrebuiltProperties struct { type PrebuiltProperties struct {
// When prefer is set to true the prebuilt will be used instead of any source module with // When prefer is set to true the prebuilt will be used instead of any source module with
// a matching name. // a matching name.

View File

@@ -141,10 +141,8 @@ func TestPrebuilts(t *testing.T) {
config := TestConfig(buildDir, nil, bp, fs) config := TestConfig(buildDir, nil, bp, fs)
ctx := NewTestContext() ctx := NewTestContext()
RegisterPrebuiltMutators(ctx) registerTestPrebuiltBuildComponents(ctx)
ctx.RegisterModuleType("filegroup", FileGroupFactory) ctx.RegisterModuleType("filegroup", FileGroupFactory)
ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
ctx.RegisterModuleType("source", newSourceModule)
ctx.Register(config) ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles("Android.bp") _, errs := ctx.ParseBlueprintsFiles("Android.bp")
@@ -212,6 +210,13 @@ func TestPrebuilts(t *testing.T) {
} }
} }
func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
ctx.RegisterModuleType("source", newSourceModule)
RegisterPrebuiltMutators(ctx)
}
type prebuiltModule struct { type prebuiltModule struct {
ModuleBase ModuleBase
prebuilt Prebuilt prebuilt Prebuilt

View File

@@ -127,6 +127,12 @@ type RegistrationContext interface {
RegisterModuleType(name string, factory ModuleFactory) RegisterModuleType(name string, factory ModuleFactory)
RegisterSingletonType(name string, factory SingletonFactory) RegisterSingletonType(name string, factory SingletonFactory)
PreArchMutators(f RegisterMutatorFunc) PreArchMutators(f RegisterMutatorFunc)
// Register pre arch mutators that are hard coded into mutator.go.
//
// Only registers mutators for testing, is a noop on the InitRegistrationContext.
HardCodedPreArchMutators(f RegisterMutatorFunc)
PreDepsMutators(f RegisterMutatorFunc) PreDepsMutators(f RegisterMutatorFunc)
PostDepsMutators(f RegisterMutatorFunc) PostDepsMutators(f RegisterMutatorFunc)
} }
@@ -180,6 +186,10 @@ func (ctx *initRegistrationContext) PreArchMutators(f RegisterMutatorFunc) {
PreArchMutators(f) PreArchMutators(f)
} }
func (ctx *initRegistrationContext) HardCodedPreArchMutators(f RegisterMutatorFunc) {
// Nothing to do as the mutators are hard code in preArch in mutator.go
}
func (ctx *initRegistrationContext) PreDepsMutators(f RegisterMutatorFunc) { func (ctx *initRegistrationContext) PreDepsMutators(f RegisterMutatorFunc) {
PreDepsMutators(f) PreDepsMutators(f)
} }

View File

@@ -59,6 +59,11 @@ func (ctx *TestContext) PreArchMutators(f RegisterMutatorFunc) {
ctx.preArch = append(ctx.preArch, f) ctx.preArch = append(ctx.preArch, f)
} }
func (ctx *TestContext) HardCodedPreArchMutators(f RegisterMutatorFunc) {
// Register mutator function as normal for testing.
ctx.PreArchMutators(f)
}
func (ctx *TestContext) PreDepsMutators(f RegisterMutatorFunc) { func (ctx *TestContext) PreDepsMutators(f RegisterMutatorFunc) {
ctx.preDeps = append(ctx.preDeps, f) ctx.preDeps = append(ctx.preDeps, f)
} }

View File

@@ -19,6 +19,8 @@ import (
"regexp" "regexp"
"strings" "strings"
"sync" "sync"
"github.com/google/blueprint"
) )
// Enforces visibility rules between modules. // Enforces visibility rules between modules.
@@ -190,6 +192,15 @@ func moduleToVisibilityRuleMap(ctx BaseModuleContext) *sync.Map {
}).(*sync.Map) }).(*sync.Map)
} }
// Marker interface that identifies dependencies that are excluded from visibility
// enforcement.
type ExcludeFromVisibilityEnforcementTag interface {
blueprint.DependencyTag
// Method that differentiates this interface from others.
ExcludeFromVisibilityEnforcement()
}
// The rule checker needs to be registered before defaults expansion to correctly check that // The rule checker needs to be registered before defaults expansion to correctly check that
// //visibility:xxx isn't combined with other packages in the same list in any one module. // //visibility:xxx isn't combined with other packages in the same list in any one module.
func RegisterVisibilityRuleChecker(ctx RegisterMutatorsContext) { func RegisterVisibilityRuleChecker(ctx RegisterMutatorsContext) {
@@ -389,6 +400,12 @@ func visibilityRuleEnforcer(ctx TopDownMutatorContext) {
// Visit all the dependencies making sure that this module has access to them all. // Visit all the dependencies making sure that this module has access to them all.
ctx.VisitDirectDeps(func(dep Module) { ctx.VisitDirectDeps(func(dep Module) {
// Ignore dependencies that have an ExcludeFromVisibilityEnforcementTag
tag := ctx.OtherModuleDependencyTag(dep)
if _, ok := tag.(ExcludeFromVisibilityEnforcementTag); ok {
return
}
depName := ctx.OtherModuleName(dep) depName := ctx.OtherModuleName(dep)
depDir := ctx.OtherModuleDir(dep) depDir := ctx.OtherModuleDir(dep)
depQualified := qualifiedModuleName{depDir, depName} depQualified := qualifiedModuleName{depDir, depName}

View File

@@ -853,6 +853,51 @@ var visibilityTests = []struct {
` not visible to this module`, ` not visible to this module`,
}, },
}, },
{
name: "verify that prebuilt dependencies are ignored for visibility reasons (not preferred)",
fs: map[string][]byte{
"prebuilts/Blueprints": []byte(`
prebuilt {
name: "module",
visibility: ["//top/other"],
}`),
"top/sources/source_file": nil,
"top/sources/Blueprints": []byte(`
source {
name: "module",
visibility: ["//top/other"],
}`),
"top/other/source_file": nil,
"top/other/Blueprints": []byte(`
source {
name: "other",
deps: [":module"],
}`),
},
},
{
name: "verify that prebuilt dependencies are ignored for visibility reasons (preferred)",
fs: map[string][]byte{
"prebuilts/Blueprints": []byte(`
prebuilt {
name: "module",
visibility: ["//top/other"],
prefer: true,
}`),
"top/sources/source_file": nil,
"top/sources/Blueprints": []byte(`
source {
name: "module",
visibility: ["//top/other"],
}`),
"top/other/source_file": nil,
"top/other/Blueprints": []byte(`
source {
name: "other",
deps: [":module"],
}`),
},
},
} }
func TestVisibility(t *testing.T) { func TestVisibility(t *testing.T) {
@@ -871,10 +916,12 @@ func testVisibility(buildDir string, fs map[string][]byte) (*TestContext, []erro
config := TestArchConfig(buildDir, nil, "", fs) config := TestArchConfig(buildDir, nil, "", fs)
ctx := NewTestArchContext() ctx := NewTestArchContext()
ctx.RegisterModuleType("package", PackageFactory)
ctx.RegisterModuleType("mock_library", newMockLibraryModule) ctx.RegisterModuleType("mock_library", newMockLibraryModule)
ctx.RegisterModuleType("mock_defaults", defaultsFactory) ctx.RegisterModuleType("mock_defaults", defaultsFactory)
ctx.PreArchMutators(RegisterPackageRenamer)
// Order of the following method calls is significant.
RegisterPackageBuildComponents(ctx)
registerTestPrebuiltBuildComponents(ctx)
ctx.PreArchMutators(RegisterVisibilityRuleChecker) ctx.PreArchMutators(RegisterVisibilityRuleChecker)
ctx.PreArchMutators(RegisterDefaultsPreArchMutators) ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
ctx.PreArchMutators(RegisterVisibilityRuleGatherer) ctx.PreArchMutators(RegisterVisibilityRuleGatherer)

View File

@@ -1261,3 +1261,33 @@ func TestJavaSystemModules(t *testing.T) {
} }
} }
} }
func TestJavaSystemModulesImport(t *testing.T) {
ctx, _ := testJava(t, `
java_system_modules_import {
name: "system-modules",
libs: ["system-module1", "system-module2"],
}
java_import {
name: "system-module1",
jars: ["a.jar"],
}
java_import {
name: "system-module2",
jars: ["b.jar"],
}
`)
// check the existence of the module
systemModules := ctx.ModuleForTests("system-modules", "android_common")
cmd := systemModules.Rule("jarsTosystemModules")
// make sure the command compiles against the supplied modules.
for _, module := range []string{"system-module1.jar", "system-module2.jar"} {
if !strings.Contains(cmd.Args["classpath"], module) {
t.Errorf("system modules classpath %v does not contain %q", cmd.Args["classpath"],
module)
}
}
}

View File

@@ -35,6 +35,7 @@ func init() {
func RegisterSystemModulesBuildComponents(ctx android.RegistrationContext) { func RegisterSystemModulesBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("java_system_modules", SystemModulesFactory) ctx.RegisterModuleType("java_system_modules", SystemModulesFactory)
ctx.RegisterModuleType("java_system_modules_import", systemModulesImportFactory)
} }
var ( var (
@@ -92,6 +93,9 @@ func TransformJarsToSystemModules(ctx android.ModuleContext, jars android.Paths)
return outDir, outputs.Paths() return outDir, outputs.Paths()
} }
// java_system_modules creates a system module from a set of java libraries that can
// be referenced from the system_modules property. It must contain at a minimum the
// java.base module which must include classes from java.lang amongst other java packages.
func SystemModulesFactory() android.Module { func SystemModulesFactory() android.Module {
module := &SystemModules{} module := &SystemModules{}
module.AddProperties(&module.properties) module.AddProperties(&module.properties)
@@ -157,3 +161,30 @@ func (system *SystemModules) AndroidMk() android.AndroidMkData {
}, },
} }
} }
// A prebuilt version of java_system_modules. It does not import the
// generated system module, it generates the system module from imported
// java libraries in the same way that java_system_modules does. It just
// acts as a prebuilt, i.e. can have the same base name as another module
// type and the one to use is selected at runtime.
func systemModulesImportFactory() android.Module {
module := &systemModulesImport{}
module.AddProperties(&module.properties)
android.InitPrebuiltModule(module, &module.properties.Libs)
android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
android.InitDefaultableModule(module)
return module
}
type systemModulesImport struct {
SystemModules
prebuilt android.Prebuilt
}
func (system *systemModulesImport) Name() string {
return system.prebuilt.Name(system.ModuleBase.Name())
}
func (system *systemModulesImport) Prebuilt() *android.Prebuilt {
return &system.prebuilt
}

View File

@@ -62,14 +62,12 @@ func testSdkContext(bp string, fs map[string][]byte) (*android.TestContext, andr
ctx := android.NewTestArchContext() ctx := android.NewTestArchContext()
// from android package // from android package
ctx.PreArchMutators(android.RegisterPackageRenamer) android.RegisterPackageBuildComponents(ctx)
ctx.PreArchMutators(android.RegisterVisibilityRuleChecker) ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer) ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer) ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
ctx.RegisterModuleType("package", android.PackageFactory)
// from java package // from java package
java.RegisterJavaBuildComponents(ctx) java.RegisterJavaBuildComponents(ctx)
java.RegisterAppBuildComponents(ctx) java.RegisterAppBuildComponents(ctx)