| // Copyright 2021 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| package snapshot |
| |
| import ( |
| "android/soong/android" |
| "path/filepath" |
| ) |
| |
| // Interface for modules which can be captured in the snapshot. |
| type SnapshotModuleInterfaceBase interface{} |
| |
| // Defines the specifics of different images to which the snapshot process is applicable, e.g., |
| // vendor, recovery, ramdisk. |
| type SnapshotImage interface { |
| // Returns true if a snapshot should be generated for this image. |
| shouldGenerateSnapshot(ctx android.SingletonContext) bool |
| |
| // Function that returns true if the module is included in this image. |
| // Using a function return instead of a value to prevent early |
| // evalution of a function that may be not be defined. |
| InImage(m SnapshotModuleInterfaceBase) func() bool |
| |
| // Returns true if a dir under source tree is an SoC-owned proprietary |
| // directory, such as device/, vendor/, etc. |
| // |
| // For a given snapshot (e.g., vendor, recovery, etc.) if |
| // isProprietaryPath(dir, deviceConfig) returns true, then the module in dir |
| // will be built from sources. |
| IsProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool |
| |
| // Whether a given module has been explicitly excluded from the |
| // snapshot, e.g., using the exclude_from_vendor_snapshot or |
| // exclude_from_recovery_snapshot properties. |
| ExcludeFromSnapshot(m SnapshotModuleInterfaceBase) bool |
| |
| // Returns true if the build is using a snapshot for this image. |
| IsUsingSnapshot(cfg android.DeviceConfig) bool |
| |
| // Returns a version of which the snapshot should be used in this target. |
| // This will only be meaningful when isUsingSnapshot is true. |
| TargetSnapshotVersion(cfg android.DeviceConfig) string |
| |
| // Whether to exclude a given module from the directed snapshot or not. |
| // If the makefile variable DIRECTED_{IMAGE}_SNAPSHOT is true, directed snapshot is turned on, |
| // and only modules listed in {IMAGE}_SNAPSHOT_MODULES will be captured. |
| ExcludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool |
| |
| // Returns target image name |
| ImageName() string |
| } |
| |
| type directoryMap map[string]bool |
| |
| var ( |
| // Modules under following directories are ignored. They are OEM's and vendor's |
| // proprietary modules(device/, kernel/, vendor/, and hardware/). |
| defaultDirectoryExcludedMap = directoryMap{ |
| "device": true, |
| "hardware": true, |
| "kernel": true, |
| "vendor": true, |
| } |
| |
| // Modules under following directories are included as they are in AOSP, |
| // although hardware/ and kernel/ are normally for vendor's own. |
| defaultDirectoryIncludedMap = directoryMap{ |
| "kernel/configs": true, |
| "kernel/prebuilts": true, |
| "kernel/tests": true, |
| "hardware/interfaces": true, |
| "hardware/libhardware": true, |
| "hardware/libhardware_legacy": true, |
| "hardware/ril": true, |
| } |
| ) |
| |
| func isDirectoryExcluded(dir string, excludedMap directoryMap, includedMap directoryMap) bool { |
| if dir == "." || dir == "/" { |
| return false |
| } |
| if includedMap[dir] { |
| return false |
| } else if excludedMap[dir] { |
| return true |
| } else if defaultDirectoryIncludedMap[dir] { |
| return false |
| } else if defaultDirectoryExcludedMap[dir] { |
| return true |
| } else { |
| return isDirectoryExcluded(filepath.Dir(dir), excludedMap, includedMap) |
| } |
| } |
| |
| // This is to be saved as .json files, which is for development/vendor_snapshot/update.py. |
| // These flags become Android.bp snapshot module properties. |
| // |
| // Attributes are optional and will be populated based on each module's need. |
| // Common attributes are defined here, languages may extend this struct to add |
| // additional attributes. |
| type SnapshotJsonFlags struct { |
| ModuleName string `json:",omitempty"` |
| RelativeInstallPath string `json:",omitempty"` |
| Filename string `json:",omitempty"` |
| ModuleStemName string `json:",omitempty"` |
| RustProcMacro bool `json:",omitempty"` |
| CrateName string `json:",omitempty"` |
| |
| // dependencies |
| Required []string `json:",omitempty"` |
| Overrides []string `json:",omitempty"` |
| |
| // license information |
| LicenseKinds []string `json:",omitempty"` |
| LicenseTexts []string `json:",omitempty"` |
| } |
| |
| func (prop *SnapshotJsonFlags) InitBaseSnapshotPropsWithName(m android.Module, name string) { |
| prop.ModuleName = name |
| |
| prop.LicenseKinds = m.EffectiveLicenseKinds() |
| prop.LicenseTexts = m.EffectiveLicenseFiles().Strings() |
| } |
| |
| func (prop *SnapshotJsonFlags) InitBaseSnapshotProps(m android.Module) { |
| prop.InitBaseSnapshotPropsWithName(m, m.Name()) |
| } |