1// Copyright (C) 2021 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package filesystem 16 17import ( 18 "android/soong/android" 19 "android/soong/linkerconfig" 20) 21 22type systemImage struct { 23 filesystem 24 25 properties systemImageProperties 26} 27 28type systemImageProperties struct { 29 // Path to the input linker config json file. 30 Linker_config_src *string 31} 32 33// android_system_image is a specialization of android_filesystem for the 'system' partition. 34// Currently, the only difference is the inclusion of linker.config.pb file which specifies 35// the provided and the required libraries to and from APEXes. 36func systemImageFactory() android.Module { 37 module := &systemImage{} 38 module.AddProperties(&module.properties) 39 module.filesystem.buildExtraFiles = module.buildExtraFiles 40 module.filesystem.filterPackagingSpecs = module.filterPackagingSpecs 41 initFilesystemModule(&module.filesystem) 42 return module 43} 44 45func (s *systemImage) buildExtraFiles(ctx android.ModuleContext, root android.OutputPath) android.OutputPaths { 46 lc := s.buildLinkerConfigFile(ctx, root) 47 // Add more files if needed 48 return []android.OutputPath{lc} 49} 50 51func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root android.OutputPath) android.OutputPath { 52 input := android.PathForModuleSrc(ctx, android.String(s.properties.Linker_config_src)) 53 output := root.Join(ctx, "system", "etc", "linker.config.pb") 54 55 // we need "Module"s for packaging items 56 var otherModules []android.Module 57 deps := s.gatherFilteredPackagingSpecs(ctx) 58 ctx.WalkDeps(func(child, parent android.Module) bool { 59 for _, ps := range child.PackagingSpecs() { 60 if _, ok := deps[ps.RelPathInPackage()]; ok { 61 otherModules = append(otherModules, child) 62 } 63 } 64 return true 65 }) 66 67 builder := android.NewRuleBuilder(pctx, ctx) 68 linkerconfig.BuildLinkerConfig(ctx, builder, input, otherModules, output) 69 builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) 70 return output 71} 72 73// Filter the result of GatherPackagingSpecs to discard items targeting outside "system" partition. 74// Note that "apex" module installs its contents to "apex"(fake partition) as well 75// for symbol lookup by imitating "activated" paths. 76func (s *systemImage) filterPackagingSpecs(specs map[string]android.PackagingSpec) { 77 for k, ps := range specs { 78 if ps.Partition() != "system" { 79 delete(specs, k) 80 } 81 } 82} 83