github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/java/android_resources.go (about)

     1  // Copyright 2018 Google Inc. All rights reserved.
     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  
    15  package java
    16  
    17  import (
    18  	"path/filepath"
    19  	"strings"
    20  
    21  	"android/soong/android"
    22  )
    23  
    24  func init() {
    25  	android.RegisterPreSingletonType("overlay", OverlaySingletonFactory)
    26  }
    27  
    28  var androidResourceIgnoreFilenames = []string{
    29  	".svn",
    30  	".git",
    31  	".ds_store",
    32  	"*.scc",
    33  	".*",
    34  	"CVS",
    35  	"thumbs.db",
    36  	"picasa.ini",
    37  	"*~",
    38  }
    39  
    40  func androidResourceGlob(ctx android.ModuleContext, dir android.Path) android.Paths {
    41  	return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames)
    42  }
    43  
    44  type overlayGlobResult struct {
    45  	dir   string
    46  	paths android.DirectorySortedPaths
    47  
    48  	// Set to true of the product has selected that values in this overlay should not be moved to
    49  	// Runtime Resource Overlay (RRO) packages.
    50  	excludeFromRRO bool
    51  }
    52  
    53  const overlayDataKey = "overlayDataKey"
    54  
    55  type globbedResourceDir struct {
    56  	dir   android.Path
    57  	files android.Paths
    58  }
    59  
    60  func overlayResourceGlob(ctx android.ModuleContext, dir android.Path) (res []globbedResourceDir,
    61  	rroDirs android.Paths) {
    62  
    63  	overlayData := ctx.Config().Get(overlayDataKey).([]overlayGlobResult)
    64  
    65  	// Runtime resource overlays (RRO) may be turned on by the product config for some modules
    66  	rroEnabled := ctx.Config().EnforceRROForModule(ctx.ModuleName())
    67  
    68  	for _, data := range overlayData {
    69  		files := data.paths.PathsInDirectory(filepath.Join(data.dir, dir.String()))
    70  		if len(files) > 0 {
    71  			overlayModuleDir := android.PathForSource(ctx, data.dir, dir.String())
    72  			// If enforce RRO is enabled for this module and this overlay is not in the
    73  			// exclusion list, ignore the overlay.  The list of ignored overlays will be
    74  			// passed to Make to be turned into an RRO package.
    75  			if rroEnabled && !data.excludeFromRRO {
    76  				rroDirs = append(rroDirs, overlayModuleDir)
    77  			} else {
    78  				res = append(res, globbedResourceDir{
    79  					dir:   overlayModuleDir,
    80  					files: files,
    81  				})
    82  			}
    83  		}
    84  	}
    85  
    86  	return res, rroDirs
    87  }
    88  
    89  func OverlaySingletonFactory() android.Singleton {
    90  	return overlaySingleton{}
    91  }
    92  
    93  type overlaySingleton struct{}
    94  
    95  func (overlaySingleton) GenerateBuildActions(ctx android.SingletonContext) {
    96  	var overlayData []overlayGlobResult
    97  	overlayDirs := ctx.Config().ResourceOverlays()
    98  	for i := range overlayDirs {
    99  		// Iterate backwards through the list of overlay directories so that the later, lower-priority
   100  		// directories in the list show up earlier in the command line to aapt2.
   101  		overlay := overlayDirs[len(overlayDirs)-1-i]
   102  		var result overlayGlobResult
   103  		result.dir = overlay
   104  
   105  		// Mark overlays that will not have Runtime Resource Overlays enforced on them
   106  		// based on the product config
   107  		result.excludeFromRRO = ctx.Config().EnforceRROExcludedOverlay(overlay)
   108  
   109  		files, err := ctx.GlobWithDeps(filepath.Join(overlay, "**/*"), androidResourceIgnoreFilenames)
   110  		if err != nil {
   111  			ctx.Errorf("failed to glob resource dir %q: %s", overlay, err.Error())
   112  			continue
   113  		}
   114  		var paths android.Paths
   115  		for _, f := range files {
   116  			if !strings.HasSuffix(f, "/") {
   117  				paths = append(paths, android.PathForSource(ctx, f))
   118  			}
   119  		}
   120  		result.paths = android.PathsToDirectorySortedPaths(paths)
   121  		overlayData = append(overlayData, result)
   122  	}
   123  
   124  	ctx.Config().Once(overlayDataKey, func() interface{} {
   125  		return overlayData
   126  	})
   127  }