Add exclude_from_vendor_snapshot property, related logic
When building a vendor snapshot, the general rule the build system uses to select a module for inclusion into the vendor snapshot is if it's a framework module. However, there are cases where a partner may modify the framework module, thereby assuming control of that module. This change adds the exclude_from_vendor_snapshot property allowing the partner to mark a module that would normally be included in the vendor snapshot for exclusion. This module is then built from source when building the vendor image against the vendor snapshot. Bug: 165705527 Test: m nothing Test: build partner code against vendor snapshot Change-Id: I6c5c15f13eeeb8f29717a4abd84b65fa72096889
This commit is contained in:
parent
3652018b83
commit
945441c09a
11
cc/cc.go
11
cc/cc.go
|
@ -280,6 +280,13 @@ type BaseProperties struct {
|
||||||
// Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
|
// Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
|
||||||
// variant to have a ".sdk" suffix.
|
// variant to have a ".sdk" suffix.
|
||||||
SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
|
SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
|
||||||
|
|
||||||
|
// Normally Soong uses the directory structure to decide which modules
|
||||||
|
// should be included (framework) or excluded (non-framework) from the
|
||||||
|
// vendor snapshot, but this property allows a partner to exclude a
|
||||||
|
// module normally thought of as a framework module from the vendor
|
||||||
|
// snapshot.
|
||||||
|
Exclude_from_vendor_snapshot *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type VendorProperties struct {
|
type VendorProperties struct {
|
||||||
|
@ -1108,6 +1115,10 @@ func (c *Module) ExportedGeneratedHeaders() android.Paths {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Module) ExcludeFromVendorSnapshot() bool {
|
||||||
|
return Bool(c.Properties.Exclude_from_vendor_snapshot)
|
||||||
|
}
|
||||||
|
|
||||||
func isBionic(name string) bool {
|
func isBionic(name string) bool {
|
||||||
switch name {
|
switch name {
|
||||||
case "libc", "libm", "libdl", "libdl_android", "linker":
|
case "libc", "libm", "libdl", "libdl_android", "linker":
|
||||||
|
|
221
cc/cc_test.go
221
cc/cc_test.go
|
@ -258,7 +258,8 @@ func checkVndkModule(t *testing.T, ctx *android.TestContext, name, subDir string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkSnapshot(t *testing.T, ctx *android.TestContext, singleton android.TestingSingleton, moduleName, snapshotFilename, subDir, variant string) {
|
func checkSnapshotIncludeExclude(t *testing.T, ctx *android.TestContext, singleton android.TestingSingleton, moduleName, snapshotFilename, subDir, variant string, include bool) {
|
||||||
|
t.Helper()
|
||||||
mod, ok := ctx.ModuleForTests(moduleName, variant).Module().(android.OutputFileProducer)
|
mod, ok := ctx.ModuleForTests(moduleName, variant).Module().(android.OutputFileProducer)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Errorf("%q must have output\n", moduleName)
|
t.Errorf("%q must have output\n", moduleName)
|
||||||
|
@ -271,12 +272,27 @@ func checkSnapshot(t *testing.T, ctx *android.TestContext, singleton android.Tes
|
||||||
}
|
}
|
||||||
snapshotPath := filepath.Join(subDir, snapshotFilename)
|
snapshotPath := filepath.Join(subDir, snapshotFilename)
|
||||||
|
|
||||||
out := singleton.Output(snapshotPath)
|
if include {
|
||||||
if out.Input.String() != outputFiles[0].String() {
|
out := singleton.Output(snapshotPath)
|
||||||
t.Errorf("The input of snapshot %q must be %q, but %q", moduleName, out.Input.String(), outputFiles[0])
|
if out.Input.String() != outputFiles[0].String() {
|
||||||
|
t.Errorf("The input of snapshot %q must be %q, but %q", moduleName, out.Input.String(), outputFiles[0])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out := singleton.MaybeOutput(snapshotPath)
|
||||||
|
if out.Rule != nil {
|
||||||
|
t.Errorf("There must be no rule for module %q output file %q", moduleName, outputFiles[0])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkSnapshot(t *testing.T, ctx *android.TestContext, singleton android.TestingSingleton, moduleName, snapshotFilename, subDir, variant string) {
|
||||||
|
checkSnapshotIncludeExclude(t, ctx, singleton, moduleName, snapshotFilename, subDir, variant, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkSnapshotExclude(t *testing.T, ctx *android.TestContext, singleton android.TestingSingleton, moduleName, snapshotFilename, subDir, variant string) {
|
||||||
|
checkSnapshotIncludeExclude(t, ctx, singleton, moduleName, snapshotFilename, subDir, variant, false)
|
||||||
|
}
|
||||||
|
|
||||||
func checkWriteFileOutput(t *testing.T, params android.TestingBuildParams, expected []string) {
|
func checkWriteFileOutput(t *testing.T, params android.TestingBuildParams, expected []string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
assertString(t, params.Rule.String(), android.WriteFile.String())
|
assertString(t, params.Rule.String(), android.WriteFile.String())
|
||||||
|
@ -1096,6 +1112,203 @@ func TestVendorSnapshotSanitizer(t *testing.T) {
|
||||||
assertString(t, staticCfiModule.outputFile.Path().Base(), "libsnapshot.cfi.a")
|
assertString(t, staticCfiModule.outputFile.Path().Base(), "libsnapshot.cfi.a")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func assertExcludeFromVendorSnapshotIs(t *testing.T, c *Module, expected bool) {
|
||||||
|
t.Helper()
|
||||||
|
if c.ExcludeFromVendorSnapshot() != expected {
|
||||||
|
t.Errorf("expected %q ExcludeFromVendorSnapshot to be %t", c.String(), expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVendorSnapshotExclude(t *testing.T) {
|
||||||
|
|
||||||
|
// This test verifies that the exclude_from_vendor_snapshot property
|
||||||
|
// makes its way from the Android.bp source file into the module data
|
||||||
|
// structure. It also verifies that modules are correctly included or
|
||||||
|
// excluded in the vendor snapshot based on their path (framework or
|
||||||
|
// vendor) and the exclude_from_vendor_snapshot property.
|
||||||
|
|
||||||
|
frameworkBp := `
|
||||||
|
cc_library_shared {
|
||||||
|
name: "libinclude",
|
||||||
|
srcs: ["src/include.cpp"],
|
||||||
|
vendor_available: true,
|
||||||
|
}
|
||||||
|
cc_library_shared {
|
||||||
|
name: "libexclude",
|
||||||
|
srcs: ["src/exclude.cpp"],
|
||||||
|
vendor: true,
|
||||||
|
exclude_from_vendor_snapshot: true,
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
vendorProprietaryBp := `
|
||||||
|
cc_library_shared {
|
||||||
|
name: "libvendor",
|
||||||
|
srcs: ["vendor.cpp"],
|
||||||
|
vendor: true,
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
depsBp := GatherRequiredDepsForTest(android.Android)
|
||||||
|
|
||||||
|
mockFS := map[string][]byte{
|
||||||
|
"deps/Android.bp": []byte(depsBp),
|
||||||
|
"framework/Android.bp": []byte(frameworkBp),
|
||||||
|
"framework/include.cpp": nil,
|
||||||
|
"framework/exclude.cpp": nil,
|
||||||
|
"device/Android.bp": []byte(vendorProprietaryBp),
|
||||||
|
"device/vendor.cpp": nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
config := TestConfig(buildDir, android.Android, nil, "", mockFS)
|
||||||
|
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||||
|
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||||
|
ctx := CreateTestContext()
|
||||||
|
ctx.Register(config)
|
||||||
|
|
||||||
|
_, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "framework/Android.bp", "device/Android.bp"})
|
||||||
|
android.FailIfErrored(t, errs)
|
||||||
|
_, errs = ctx.PrepareBuildActions(config)
|
||||||
|
android.FailIfErrored(t, errs)
|
||||||
|
|
||||||
|
// Test an include and exclude framework module.
|
||||||
|
assertExcludeFromVendorSnapshotIs(t, ctx.ModuleForTests("libinclude", coreVariant).Module().(*Module), false)
|
||||||
|
assertExcludeFromVendorSnapshotIs(t, ctx.ModuleForTests("libinclude", vendorVariant).Module().(*Module), false)
|
||||||
|
assertExcludeFromVendorSnapshotIs(t, ctx.ModuleForTests("libexclude", vendorVariant).Module().(*Module), true)
|
||||||
|
|
||||||
|
// A vendor module is excluded, but by its path, not the
|
||||||
|
// exclude_from_vendor_snapshot property.
|
||||||
|
assertExcludeFromVendorSnapshotIs(t, ctx.ModuleForTests("libvendor", vendorVariant).Module().(*Module), false)
|
||||||
|
|
||||||
|
// Verify the content of the vendor snapshot.
|
||||||
|
|
||||||
|
snapshotDir := "vendor-snapshot"
|
||||||
|
snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64")
|
||||||
|
snapshotSingleton := ctx.SingletonForTests("vendor-snapshot")
|
||||||
|
|
||||||
|
var includeJsonFiles []string
|
||||||
|
var excludeJsonFiles []string
|
||||||
|
|
||||||
|
for _, arch := range [][]string{
|
||||||
|
[]string{"arm64", "armv8-a"},
|
||||||
|
[]string{"arm", "armv7-a-neon"},
|
||||||
|
} {
|
||||||
|
archType := arch[0]
|
||||||
|
archVariant := arch[1]
|
||||||
|
archDir := fmt.Sprintf("arch-%s-%s", archType, archVariant)
|
||||||
|
|
||||||
|
sharedVariant := fmt.Sprintf("android_vendor.VER_%s_%s_shared", archType, archVariant)
|
||||||
|
sharedDir := filepath.Join(snapshotVariantPath, archDir, "shared")
|
||||||
|
|
||||||
|
// Included modules
|
||||||
|
checkSnapshot(t, ctx, snapshotSingleton, "libinclude", "libinclude.so", sharedDir, sharedVariant)
|
||||||
|
includeJsonFiles = append(includeJsonFiles, filepath.Join(sharedDir, "libinclude.so.json"))
|
||||||
|
|
||||||
|
// Excluded modules
|
||||||
|
checkSnapshotExclude(t, ctx, snapshotSingleton, "libexclude", "libexclude.so", sharedDir, sharedVariant)
|
||||||
|
excludeJsonFiles = append(excludeJsonFiles, filepath.Join(sharedDir, "libexclude.so.json"))
|
||||||
|
checkSnapshotExclude(t, ctx, snapshotSingleton, "libvendor", "libvendor.so", sharedDir, sharedVariant)
|
||||||
|
excludeJsonFiles = append(excludeJsonFiles, filepath.Join(sharedDir, "libvendor.so.json"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that each json file for an included module has a rule.
|
||||||
|
for _, jsonFile := range includeJsonFiles {
|
||||||
|
if snapshotSingleton.MaybeOutput(jsonFile).Rule == nil {
|
||||||
|
t.Errorf("include json file %q not found", jsonFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that each json file for an excluded module has no rule.
|
||||||
|
for _, jsonFile := range excludeJsonFiles {
|
||||||
|
if snapshotSingleton.MaybeOutput(jsonFile).Rule != nil {
|
||||||
|
t.Errorf("exclude json file %q found", jsonFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVendorSnapshotExcludeInVendorProprietaryPathErrors(t *testing.T) {
|
||||||
|
|
||||||
|
// This test verifies that using the exclude_from_vendor_snapshot
|
||||||
|
// property on a module in a vendor proprietary path generates an
|
||||||
|
// error. These modules are already excluded, so we prohibit using the
|
||||||
|
// property in this way, which could add to confusion.
|
||||||
|
|
||||||
|
vendorProprietaryBp := `
|
||||||
|
cc_library_shared {
|
||||||
|
name: "libvendor",
|
||||||
|
srcs: ["vendor.cpp"],
|
||||||
|
vendor: true,
|
||||||
|
exclude_from_vendor_snapshot: true,
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
depsBp := GatherRequiredDepsForTest(android.Android)
|
||||||
|
|
||||||
|
mockFS := map[string][]byte{
|
||||||
|
"deps/Android.bp": []byte(depsBp),
|
||||||
|
"device/Android.bp": []byte(vendorProprietaryBp),
|
||||||
|
"device/vendor.cpp": nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
config := TestConfig(buildDir, android.Android, nil, "", mockFS)
|
||||||
|
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||||
|
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||||
|
ctx := CreateTestContext()
|
||||||
|
ctx.Register(config)
|
||||||
|
|
||||||
|
_, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "device/Android.bp"})
|
||||||
|
android.FailIfErrored(t, errs)
|
||||||
|
|
||||||
|
_, errs = ctx.PrepareBuildActions(config)
|
||||||
|
android.CheckErrorsAgainstExpectations(t, errs, []string{
|
||||||
|
`module "libvendor\{.+,image:vendor.+,arch:arm64_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`,
|
||||||
|
`module "libvendor\{.+,image:vendor.+,arch:arm_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVendorSnapshotExcludeWithVendorAvailable(t *testing.T) {
|
||||||
|
|
||||||
|
// This test verifies that using the exclude_from_vendor_snapshot
|
||||||
|
// property on a module that is vendor available generates an error. A
|
||||||
|
// vendor available module must be captured in the vendor snapshot and
|
||||||
|
// must not built from source when building the vendor image against
|
||||||
|
// the vendor snapshot.
|
||||||
|
|
||||||
|
frameworkBp := `
|
||||||
|
cc_library_shared {
|
||||||
|
name: "libinclude",
|
||||||
|
srcs: ["src/include.cpp"],
|
||||||
|
vendor_available: true,
|
||||||
|
exclude_from_vendor_snapshot: true,
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
depsBp := GatherRequiredDepsForTest(android.Android)
|
||||||
|
|
||||||
|
mockFS := map[string][]byte{
|
||||||
|
"deps/Android.bp": []byte(depsBp),
|
||||||
|
"framework/Android.bp": []byte(frameworkBp),
|
||||||
|
"framework/include.cpp": nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
config := TestConfig(buildDir, android.Android, nil, "", mockFS)
|
||||||
|
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||||
|
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||||
|
ctx := CreateTestContext()
|
||||||
|
ctx.Register(config)
|
||||||
|
|
||||||
|
_, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "framework/Android.bp"})
|
||||||
|
android.FailIfErrored(t, errs)
|
||||||
|
|
||||||
|
_, errs = ctx.PrepareBuildActions(config)
|
||||||
|
android.CheckErrorsAgainstExpectations(t, errs, []string{
|
||||||
|
`module "libinclude\{.+,image:,arch:arm64_.+\}" may not use both "vendor_available: true" and "exclude_from_vendor_snapshot: true"`,
|
||||||
|
`module "libinclude\{.+,image:,arch:arm_.+\}" may not use both "vendor_available: true" and "exclude_from_vendor_snapshot: true"`,
|
||||||
|
`module "libinclude\{.+,image:vendor.+,arch:arm64_.+\}" may not use both "vendor_available: true" and "exclude_from_vendor_snapshot: true"`,
|
||||||
|
`module "libinclude\{.+,image:vendor.+,arch:arm_.+\}" may not use both "vendor_available: true" and "exclude_from_vendor_snapshot: true"`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestDoubleLoadableDepError(t *testing.T) {
|
func TestDoubleLoadableDepError(t *testing.T) {
|
||||||
// Check whether an error is emitted when a LLNDK depends on a non-double_loadable VNDK lib.
|
// Check whether an error is emitted when a LLNDK depends on a non-double_loadable VNDK lib.
|
||||||
testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
|
testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
|
||||||
|
|
|
@ -84,7 +84,7 @@ func (g *GenruleExtraProperties) ExtraImageVariations(ctx android.BaseModuleCont
|
||||||
// If not, we assume modules under proprietary paths are compatible for
|
// If not, we assume modules under proprietary paths are compatible for
|
||||||
// BOARD_VNDK_VERSION. The other modules are regarded as AOSP, that is
|
// BOARD_VNDK_VERSION. The other modules are regarded as AOSP, that is
|
||||||
// PLATFORM_VNDK_VERSION.
|
// PLATFORM_VNDK_VERSION.
|
||||||
if vndkVersion == "current" || !isVendorProprietaryPath(ctx.ModuleDir()) {
|
if vndkVersion == "current" || !isVendorProprietaryModule(ctx) {
|
||||||
variants = append(variants, VendorVariationPrefix+ctx.DeviceConfig().PlatformVndkVersion())
|
variants = append(variants, VendorVariationPrefix+ctx.DeviceConfig().PlatformVndkVersion())
|
||||||
} else {
|
} else {
|
||||||
variants = append(variants, VendorVariationPrefix+vndkVersion)
|
variants = append(variants, VendorVariationPrefix+vndkVersion)
|
||||||
|
|
|
@ -223,7 +223,7 @@ func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
|
||||||
// We assume that modules under proprietary paths are compatible for
|
// We assume that modules under proprietary paths are compatible for
|
||||||
// BOARD_VNDK_VERSION. The other modules are regarded as AOSP, or
|
// BOARD_VNDK_VERSION. The other modules are regarded as AOSP, or
|
||||||
// PLATFORM_VNDK_VERSION.
|
// PLATFORM_VNDK_VERSION.
|
||||||
if isVendorProprietaryPath(mctx.ModuleDir()) {
|
if isVendorProprietaryModule(mctx) {
|
||||||
vendorVariants = append(vendorVariants, boardVndkVersion)
|
vendorVariants = append(vendorVariants, boardVndkVersion)
|
||||||
} else {
|
} else {
|
||||||
vendorVariants = append(vendorVariants, platformVndkVersion)
|
vendorVariants = append(vendorVariants, platformVndkVersion)
|
||||||
|
@ -249,7 +249,7 @@ func (m *Module) ImageMutatorBegin(mctx android.BaseModuleContext) {
|
||||||
platformVndkVersion,
|
platformVndkVersion,
|
||||||
boardVndkVersion,
|
boardVndkVersion,
|
||||||
)
|
)
|
||||||
} else if isVendorProprietaryPath(mctx.ModuleDir()) {
|
} else if isVendorProprietaryModule(mctx) {
|
||||||
vendorVariants = append(vendorVariants, boardVndkVersion)
|
vendorVariants = append(vendorVariants, boardVndkVersion)
|
||||||
} else {
|
} else {
|
||||||
vendorVariants = append(vendorVariants, platformVndkVersion)
|
vendorVariants = append(vendorVariants, platformVndkVersion)
|
||||||
|
|
|
@ -738,7 +738,7 @@ func isSanitizableDependencyTag(tag blueprint.DependencyTag) bool {
|
||||||
// as vendor snapshot. Such modules must create both cfi and non-cfi variants,
|
// as vendor snapshot. Such modules must create both cfi and non-cfi variants,
|
||||||
// except for ones which explicitly disable cfi.
|
// except for ones which explicitly disable cfi.
|
||||||
func needsCfiForVendorSnapshot(mctx android.TopDownMutatorContext) bool {
|
func needsCfiForVendorSnapshot(mctx android.TopDownMutatorContext) bool {
|
||||||
if isVendorProprietaryPath(mctx.ModuleDir()) {
|
if isVendorProprietaryModule(mctx) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ func (s *snapshotMap) get(name string, arch android.ArchType) (snapshot string,
|
||||||
func isSnapshotAware(ctx android.ModuleContext, m *Module) bool {
|
func isSnapshotAware(ctx android.ModuleContext, m *Module) bool {
|
||||||
if _, _, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m); ok {
|
if _, _, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m); ok {
|
||||||
return ctx.Config().VndkSnapshotBuildArtifacts()
|
return ctx.Config().VndkSnapshotBuildArtifacts()
|
||||||
} else if isVendorSnapshotModule(m, ctx.ModuleDir()) {
|
} else if isVendorSnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir())) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -508,18 +508,46 @@ func isVendorProprietaryPath(dir string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isVendorProprietaryModule(ctx android.BaseModuleContext) bool {
|
||||||
|
|
||||||
|
// Any module in a vendor proprietary path is a vendor proprietary
|
||||||
|
// module.
|
||||||
|
|
||||||
|
if isVendorProprietaryPath(ctx.ModuleDir()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// However if the module is not in a vendor proprietary path, it may
|
||||||
|
// still be a vendor proprietary module. This happens for cc modules
|
||||||
|
// that are excluded from the vendor snapshot, and it means that the
|
||||||
|
// vendor has assumed control of the framework-provided module.
|
||||||
|
|
||||||
|
if c, ok := ctx.Module().(*Module); ok {
|
||||||
|
if c.ExcludeFromVendorSnapshot() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Determine if a module is going to be included in vendor snapshot or not.
|
// Determine if a module is going to be included in vendor snapshot or not.
|
||||||
//
|
//
|
||||||
// Targets of vendor snapshot are "vendor: true" or "vendor_available: true" modules in
|
// Targets of vendor snapshot are "vendor: true" or "vendor_available: true" modules in
|
||||||
// AOSP. They are not guaranteed to be compatible with older vendor images. (e.g. might
|
// AOSP. They are not guaranteed to be compatible with older vendor images. (e.g. might
|
||||||
// depend on newer VNDK) So they are captured as vendor snapshot To build older vendor
|
// depend on newer VNDK) So they are captured as vendor snapshot To build older vendor
|
||||||
// image and newer system image altogether.
|
// image and newer system image altogether.
|
||||||
func isVendorSnapshotModule(m *Module, moduleDir string) bool {
|
func isVendorSnapshotModule(m *Module, inVendorProprietaryPath bool) bool {
|
||||||
if !m.Enabled() || m.Properties.HideFromMake {
|
if !m.Enabled() || m.Properties.HideFromMake {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// skip proprietary modules, but include all VNDK (static)
|
// skip proprietary modules, but include all VNDK (static)
|
||||||
if isVendorProprietaryPath(moduleDir) && !m.IsVndk() {
|
if inVendorProprietaryPath && !m.IsVndk() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// If the module would be included based on its path, check to see if
|
||||||
|
// the module is marked to be excluded. If so, skip it.
|
||||||
|
if m.ExcludeFromVendorSnapshot() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if m.Target().Os.Class != android.Device {
|
if m.Target().Os.Class != android.Device {
|
||||||
|
@ -791,7 +819,25 @@ func (c *vendorSnapshotSingleton) GenerateBuildActions(ctx android.SingletonCont
|
||||||
}
|
}
|
||||||
|
|
||||||
moduleDir := ctx.ModuleDir(module)
|
moduleDir := ctx.ModuleDir(module)
|
||||||
if !isVendorSnapshotModule(m, moduleDir) {
|
inVendorProprietaryPath := isVendorProprietaryPath(moduleDir)
|
||||||
|
|
||||||
|
if m.ExcludeFromVendorSnapshot() {
|
||||||
|
if inVendorProprietaryPath {
|
||||||
|
// Error: exclude_from_vendor_snapshot applies
|
||||||
|
// to framework-path modules only.
|
||||||
|
ctx.Errorf("module %q in vendor proprietary path %q may not use \"exclude_from_vendor_snapshot: true\"", m.String(), moduleDir)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if Bool(m.VendorProperties.Vendor_available) {
|
||||||
|
// Error: may not combine "vendor_available:
|
||||||
|
// true" with "exclude_from_vendor_snapshot:
|
||||||
|
// true".
|
||||||
|
ctx.Errorf("module %q may not use both \"vendor_available: true\" and \"exclude_from_vendor_snapshot: true\"", m.String())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !isVendorSnapshotModule(m, inVendorProprietaryPath) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue