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:
parent
1e30905f65
commit
df5f356c86
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue