Merge "android_system_image only packages "system" items"
This commit is contained in:
commit
0cfe1f43f7
3 changed files with 85 additions and 5 deletions
|
@ -43,8 +43,14 @@ type filesystem struct {
|
|||
// Function that builds extra files under the root directory and returns the files
|
||||
buildExtraFiles func(ctx android.ModuleContext, root android.OutputPath) android.OutputPaths
|
||||
|
||||
// Function that filters PackagingSpecs returned by PackagingBase.GatherPackagingSpecs()
|
||||
filterPackagingSpecs func(specs map[string]android.PackagingSpec)
|
||||
|
||||
output android.OutputPath
|
||||
installDir android.InstallPath
|
||||
|
||||
// For testing. Keeps the result of CopyDepsToZip()
|
||||
entries []string
|
||||
}
|
||||
|
||||
type symlinkDefinition struct {
|
||||
|
@ -226,7 +232,7 @@ func (f *filesystem) buildRootZip(ctx android.ModuleContext) android.OutputPath
|
|||
|
||||
func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.OutputPath {
|
||||
depsZipFile := android.PathForModuleOut(ctx, "deps.zip").OutputPath
|
||||
f.CopyDepsToZip(ctx, f.GatherPackagingSpecs(ctx), depsZipFile)
|
||||
f.entries = f.CopyDepsToZip(ctx, f.gatherFilteredPackagingSpecs(ctx), depsZipFile)
|
||||
|
||||
builder := android.NewRuleBuilder(pctx, ctx)
|
||||
depsBase := proptools.StringDefault(f.properties.Base_dir, ".")
|
||||
|
@ -345,7 +351,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool)
|
|||
}
|
||||
|
||||
depsZipFile := android.PathForModuleOut(ctx, "deps.zip").OutputPath
|
||||
f.CopyDepsToZip(ctx, f.GatherPackagingSpecs(ctx), depsZipFile)
|
||||
f.entries = f.CopyDepsToZip(ctx, f.gatherFilteredPackagingSpecs(ctx), depsZipFile)
|
||||
|
||||
builder := android.NewRuleBuilder(pctx, ctx)
|
||||
depsBase := proptools.StringDefault(f.properties.Base_dir, ".")
|
||||
|
@ -434,3 +440,14 @@ func (f *filesystem) SignedOutputPath() android.Path {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Filter the result of GatherPackagingSpecs to discard items targeting outside "system" partition.
|
||||
// Note that "apex" module installs its contents to "apex"(fake partition) as well
|
||||
// for symbol lookup by imitating "activated" paths.
|
||||
func (f *filesystem) gatherFilteredPackagingSpecs(ctx android.ModuleContext) map[string]android.PackagingSpec {
|
||||
specs := f.PackagingBase.GatherPackagingSpecs(ctx)
|
||||
if f.filterPackagingSpecs != nil {
|
||||
f.filterPackagingSpecs(specs)
|
||||
}
|
||||
return specs
|
||||
}
|
||||
|
|
|
@ -74,3 +74,54 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) {
|
|||
android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar",
|
||||
output.RuleParams.Command, "libbar.so")
|
||||
}
|
||||
|
||||
func registerComponent(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("component", componentFactory)
|
||||
}
|
||||
|
||||
func componentFactory() android.Module {
|
||||
m := &component{}
|
||||
m.AddProperties(&m.properties)
|
||||
android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
|
||||
return m
|
||||
}
|
||||
|
||||
type component struct {
|
||||
android.ModuleBase
|
||||
properties struct {
|
||||
Install_copy_in_data []string
|
||||
}
|
||||
}
|
||||
|
||||
func (c *component) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
output := android.PathForModuleOut(ctx, c.Name())
|
||||
dir := android.PathForModuleInstall(ctx, "components")
|
||||
ctx.InstallFile(dir, c.Name(), output)
|
||||
|
||||
dataDir := android.PathForModuleInPartitionInstall(ctx, "data", "components")
|
||||
for _, d := range c.properties.Install_copy_in_data {
|
||||
ctx.InstallFile(dataDir, d, output)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFileSystemGathersItemsOnlyInSystemPartition(t *testing.T) {
|
||||
f := android.GroupFixturePreparers(fixture, android.FixtureRegisterWithContext(registerComponent))
|
||||
result := f.RunTestWithBp(t, `
|
||||
android_system_image {
|
||||
name: "myfilesystem",
|
||||
multilib: {
|
||||
common: {
|
||||
deps: ["foo"],
|
||||
},
|
||||
},
|
||||
linker_config_src: "linker.config.json",
|
||||
}
|
||||
component {
|
||||
name: "foo",
|
||||
install_copy_in_data: ["bar"],
|
||||
}
|
||||
`)
|
||||
|
||||
module := result.ModuleForTests("myfilesystem", "android_common").Module().(*systemImage)
|
||||
android.AssertDeepEquals(t, "entries should have foo only", []string{"components/foo"}, module.entries)
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ func systemImageFactory() android.Module {
|
|||
module := &systemImage{}
|
||||
module.AddProperties(&module.properties)
|
||||
module.filesystem.buildExtraFiles = module.buildExtraFiles
|
||||
module.filesystem.filterPackagingSpecs = module.filterPackagingSpecs
|
||||
initFilesystemModule(&module.filesystem)
|
||||
return module
|
||||
}
|
||||
|
@ -53,7 +54,7 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
|
|||
|
||||
// we need "Module"s for packaging items
|
||||
var otherModules []android.Module
|
||||
deps := s.GatherPackagingSpecs(ctx)
|
||||
deps := s.gatherFilteredPackagingSpecs(ctx)
|
||||
ctx.WalkDeps(func(child, parent android.Module) bool {
|
||||
for _, ps := range child.PackagingSpecs() {
|
||||
if _, ok := deps[ps.RelPathInPackage()]; ok {
|
||||
|
@ -68,3 +69,14 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
|
|||
builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String())
|
||||
return output
|
||||
}
|
||||
|
||||
// Filter the result of GatherPackagingSpecs to discard items targeting outside "system" partition.
|
||||
// Note that "apex" module installs its contents to "apex"(fake partition) as well
|
||||
// for symbol lookup by imitating "activated" paths.
|
||||
func (s *systemImage) filterPackagingSpecs(specs map[string]android.PackagingSpec) {
|
||||
for k, ps := range specs {
|
||||
if ps.Partition() != "system" {
|
||||
delete(specs, k)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue