Add soong build restrictions for libcore targets

Add soong build restrictions for libcore targets to stop
other targets depending on internals.

Test: cd build/soong/; ./build_test.bash --products aosp_arm
Bug: 113148576
Change-Id: I2c15924fbecaf0c2076d08de65814a6dcb790e73
This commit is contained in:
Neil Fuller 2018-10-21 17:19:10 +01:00
parent 1e30905f65
commit df5f356c86
2 changed files with 112 additions and 28 deletions

View File

@ -45,35 +45,85 @@ func registerNeverallowMutator(ctx RegisterMutatorsContext) {
ctx.BottomUp("neverallow", neverallowMutator).Parallel()
}
var neverallows = []*rule{
neverallow().
in("vendor", "device").
with("vndk.enabled", "true").
without("vendor", "true").
because("the VNDK can never contain a library that is device dependent."),
neverallow().
with("vndk.enabled", "true").
without("vendor", "true").
without("owner", "").
because("a VNDK module can never have an owner."),
neverallow().
notIn("libcore", "development", "external/apache-harmony", "external/apache-xml", "external/bouncycastle", "external/conscrypt", "external/icu", "external/okhttp", "external/wycheproof").
with("no_standard_libs", "true"),
var neverallows = createNeverAllows()
// TODO(b/67974785): always enforce the manifest
neverallow().
without("name", "libhidltransport").
with("product_variables.enforce_vintf_manifest.cflags", "*").
because("manifest enforcement should be independent of ."),
func createNeverAllows() []*rule {
rules := []*rule{}
rules = append(rules, createTrebleRules()...)
rules = append(rules, createLibcoreRules()...)
return rules
}
// TODO(b/67975799): vendor code should always use /vendor/bin/sh
neverallow().
without("name", "libc_bionic_ndk").
with("product_variables.treble_linker_namespaces.cflags", "*").
because("nothing should care if linker namespaces are enabled or not"),
func createTrebleRules() []*rule {
return []*rule{
neverallow().
in("vendor", "device").
with("vndk.enabled", "true").
without("vendor", "true").
because("the VNDK can never contain a library that is device dependent."),
neverallow().
with("vndk.enabled", "true").
without("vendor", "true").
without("owner", "").
because("a VNDK module can never have an owner."),
// Example:
// *neverallow().with("Srcs", "main.cpp"),
// TODO(b/67974785): always enforce the manifest
neverallow().
without("name", "libhidltransport").
with("product_variables.enforce_vintf_manifest.cflags", "*").
because("manifest enforcement should be independent of ."),
// TODO(b/67975799): vendor code should always use /vendor/bin/sh
neverallow().
without("name", "libc_bionic_ndk").
with("product_variables.treble_linker_namespaces.cflags", "*").
because("nothing should care if linker namespaces are enabled or not"),
// Example:
// *neverallow().with("Srcs", "main.cpp"))
}
}
func createLibcoreRules() []*rule {
var coreLibraryProjects = []string{
"libcore",
"external/apache-harmony",
"external/apache-xml",
"external/bouncycastle",
"external/conscrypt",
"external/icu",
"external/okhttp",
"external/wycheproof",
}
var coreModules = []string{
"core-all",
"core-oj",
"core-libart",
"core-simple",
"okhttp",
"bouncycastle",
"conscrypt",
"apache-xml",
}
// Core library constraints. Prevent targets adding dependencies on core
// library internals, which could lead to compatibility issues with the ART
// mainline module. They should use core.platform.api.stubs instead.
rules := []*rule{
neverallow().
notIn(append(coreLibraryProjects, "development")...).
with("no_standard_libs", "true"),
}
for _, m := range coreModules {
r := neverallow().
notIn(coreLibraryProjects...).
with("libs", m).
because("Only core libraries projects can depend on " + m)
rules = append(rules, r)
}
return rules
}
func neverallowMutator(ctx BottomUpMutatorContext) {

View File

@ -137,6 +137,17 @@ var neverallowTests = []struct {
},
expectedError: "",
},
{
name: "dependency on core-libart",
fs: map[string][]byte{
"Blueprints": []byte(`
java_library {
name: "needs_core_libart",
libs: ["core-libart"],
}`),
},
expectedError: "Only core libraries projects can depend on core-libart",
},
}
func TestNeverallow(t *testing.T) {
@ -164,6 +175,7 @@ func TestNeverallow(t *testing.T) {
func testNeverallow(t *testing.T, config Config, fs map[string][]byte) (*TestContext, []error) {
ctx := NewTestContext()
ctx.RegisterModuleType("cc_library", ModuleFactoryAdaptor(newMockCcLibraryModule))
ctx.RegisterModuleType("java_library", ModuleFactoryAdaptor(newMockJavaLibraryModule))
ctx.PostDepsMutators(registerNeverallowMutator)
ctx.Register()
@ -178,7 +190,7 @@ func testNeverallow(t *testing.T, config Config, fs map[string][]byte) (*TestCon
return ctx, errs
}
type mockProperties struct {
type mockCcLibraryProperties struct {
Vendor_available *bool
Vndk struct {
@ -200,7 +212,7 @@ type mockProperties struct {
type mockCcLibraryModule struct {
ModuleBase
properties mockProperties
properties mockCcLibraryProperties
}
func newMockCcLibraryModule() Module {
@ -215,3 +227,25 @@ func (p *mockCcLibraryModule) DepsMutator(ctx BottomUpMutatorContext) {
func (p *mockCcLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
}
type mockJavaLibraryProperties struct {
Libs []string
}
type mockJavaLibraryModule struct {
ModuleBase
properties mockJavaLibraryProperties
}
func newMockJavaLibraryModule() Module {
m := &mockJavaLibraryModule{}
m.AddProperties(&m.properties)
InitAndroidModule(m)
return m
}
func (p *mockJavaLibraryModule) DepsMutator(ctx BottomUpMutatorContext) {
}
func (p *mockJavaLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
}