123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- // Copyright 2018 Google Inc. All rights reserved.
- //
- // 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 java
- import (
- "path/filepath"
- "strings"
- "android/soong/android"
- )
- func init() {
- registerOverlayBuildComponents(android.InitRegistrationContext)
- }
- func registerOverlayBuildComponents(ctx android.RegistrationContext) {
- ctx.RegisterPreSingletonType("overlay", OverlaySingletonFactory)
- }
- var androidResourceIgnoreFilenames = []string{
- ".svn",
- ".git",
- ".ds_store",
- "*.scc",
- ".*",
- "CVS",
- "thumbs.db",
- "picasa.ini",
- "*~",
- }
- // androidResourceGlob returns the list of files in the given directory, using the standard
- // exclusion patterns for Android resources.
- func androidResourceGlob(ctx android.EarlyModuleContext, dir android.Path) android.Paths {
- return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames)
- }
- // androidResourceGlobList creates a rule to write the list of files in the given directory, using
- // the standard exclusion patterns for Android resources, to the given output file.
- func androidResourceGlobList(ctx android.ModuleContext, dir android.Path,
- fileListFile android.WritablePath) {
- android.GlobToListFileRule(ctx, filepath.Join(dir.String(), "**/*"),
- androidResourceIgnoreFilenames, fileListFile)
- }
- type overlayType int
- const (
- device overlayType = iota + 1
- product
- )
- type rroDir struct {
- path android.Path
- overlayType overlayType
- }
- type overlayGlobResult struct {
- dir string
- paths android.DirectorySortedPaths
- overlayType overlayType
- }
- var overlayDataKey = android.NewOnceKey("overlayDataKey")
- type globbedResourceDir struct {
- dir android.Path
- files android.Paths
- }
- func overlayResourceGlob(ctx android.ModuleContext, a *aapt, dir android.Path) (res []globbedResourceDir,
- rroDirs []rroDir) {
- overlayData := ctx.Config().Get(overlayDataKey).([]overlayGlobResult)
- // Runtime resource overlays (RRO) may be turned on by the product config for some modules
- rroEnabled := a.IsRROEnforced(ctx)
- for _, data := range overlayData {
- files := data.paths.PathsInDirectory(filepath.Join(data.dir, dir.String()))
- if len(files) > 0 {
- overlayModuleDir := android.PathForSource(ctx, data.dir, dir.String())
- // If enforce RRO is enabled for this module and this overlay is not in the
- // exclusion list, ignore the overlay. The list of ignored overlays will be
- // passed to Make to be turned into an RRO package.
- if rroEnabled && !ctx.Config().EnforceRROExcludedOverlay(overlayModuleDir.String()) {
- rroDirs = append(rroDirs, rroDir{overlayModuleDir, data.overlayType})
- } else {
- res = append(res, globbedResourceDir{
- dir: overlayModuleDir,
- files: files,
- })
- }
- }
- }
- return res, rroDirs
- }
- func OverlaySingletonFactory() android.Singleton {
- return overlaySingleton{}
- }
- type overlaySingleton struct{}
- func (overlaySingleton) GenerateBuildActions(ctx android.SingletonContext) {
- var overlayData []overlayGlobResult
- appendOverlayData := func(overlayDirs []string, t overlayType) {
- for i := range overlayDirs {
- // Iterate backwards through the list of overlay directories so that the later, lower-priority
- // directories in the list show up earlier in the command line to aapt2.
- overlay := overlayDirs[len(overlayDirs)-1-i]
- var result overlayGlobResult
- result.dir = overlay
- result.overlayType = t
- files, err := ctx.GlobWithDeps(filepath.Join(overlay, "**/*"), androidResourceIgnoreFilenames)
- if err != nil {
- ctx.Errorf("failed to glob resource dir %q: %s", overlay, err.Error())
- continue
- }
- var paths android.Paths
- for _, f := range files {
- if !strings.HasSuffix(f, "/") {
- paths = append(paths, android.PathForSource(ctx, f))
- }
- }
- result.paths = android.PathsToDirectorySortedPaths(paths)
- overlayData = append(overlayData, result)
- }
- }
- appendOverlayData(ctx.Config().DeviceResourceOverlays(), device)
- appendOverlayData(ctx.Config().ProductResourceOverlays(), product)
- ctx.Config().Once(overlayDataKey, func() interface{} {
- return overlayData
- })
- }
|