1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workervar androidResourceIgnoreFilenames = []string{ 25*333d2b36SAndroid Build Coastguard Worker ".svn", 26*333d2b36SAndroid Build Coastguard Worker ".git", 27*333d2b36SAndroid Build Coastguard Worker ".ds_store", 28*333d2b36SAndroid Build Coastguard Worker "*.scc", 29*333d2b36SAndroid Build Coastguard Worker ".*", 30*333d2b36SAndroid Build Coastguard Worker "CVS", 31*333d2b36SAndroid Build Coastguard Worker "thumbs.db", 32*333d2b36SAndroid Build Coastguard Worker "picasa.ini", 33*333d2b36SAndroid Build Coastguard Worker "*~", 34*333d2b36SAndroid Build Coastguard Worker} 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker// androidResourceGlob returns the list of files in the given directory, using the standard 37*333d2b36SAndroid Build Coastguard Worker// exclusion patterns for Android resources. 38*333d2b36SAndroid Build Coastguard Workerfunc androidResourceGlob(ctx android.EarlyModuleContext, dir android.Path) android.Paths { 39*333d2b36SAndroid Build Coastguard Worker return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames) 40*333d2b36SAndroid Build Coastguard Worker} 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workertype overlayType int 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerconst ( 45*333d2b36SAndroid Build Coastguard Worker device overlayType = iota + 1 46*333d2b36SAndroid Build Coastguard Worker product 47*333d2b36SAndroid Build Coastguard Worker) 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workertype rroDir struct { 50*333d2b36SAndroid Build Coastguard Worker path android.Path 51*333d2b36SAndroid Build Coastguard Worker overlayType overlayType 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workertype overlayGlobResult struct { 55*333d2b36SAndroid Build Coastguard Worker dir string 56*333d2b36SAndroid Build Coastguard Worker paths android.DirectorySortedPaths 57*333d2b36SAndroid Build Coastguard Worker overlayType overlayType 58*333d2b36SAndroid Build Coastguard Worker} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Workervar overlayDataKey = android.NewOnceKey("overlayDataKey") 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workertype globbedResourceDir struct { 63*333d2b36SAndroid Build Coastguard Worker dir android.Path 64*333d2b36SAndroid Build Coastguard Worker files android.Paths 65*333d2b36SAndroid Build Coastguard Worker} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Workerfunc overlayResourceGlob(ctx android.ModuleContext, a *aapt, dir android.Path) (res []globbedResourceDir, 68*333d2b36SAndroid Build Coastguard Worker rroDirs []rroDir) { 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker overlayData := ctx.Config().Once(overlayDataKey, func() interface{} { 71*333d2b36SAndroid Build Coastguard Worker var overlayData []overlayGlobResult 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker appendOverlayData := func(overlayDirs []string, t overlayType) { 74*333d2b36SAndroid Build Coastguard Worker for i := range overlayDirs { 75*333d2b36SAndroid Build Coastguard Worker // Iterate backwards through the list of overlay directories so that the later, lower-priority 76*333d2b36SAndroid Build Coastguard Worker // directories in the list show up earlier in the command line to aapt2. 77*333d2b36SAndroid Build Coastguard Worker overlay := overlayDirs[len(overlayDirs)-1-i] 78*333d2b36SAndroid Build Coastguard Worker var result overlayGlobResult 79*333d2b36SAndroid Build Coastguard Worker result.dir = overlay 80*333d2b36SAndroid Build Coastguard Worker result.overlayType = t 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker files, err := ctx.GlobWithDeps(filepath.Join(overlay, "**/*"), androidResourceIgnoreFilenames) 83*333d2b36SAndroid Build Coastguard Worker if err != nil { 84*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("failed to glob resource dir %q: %s", overlay, err.Error()) 85*333d2b36SAndroid Build Coastguard Worker continue 86*333d2b36SAndroid Build Coastguard Worker } 87*333d2b36SAndroid Build Coastguard Worker var paths android.Paths 88*333d2b36SAndroid Build Coastguard Worker for _, f := range files { 89*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(f, "/") { 90*333d2b36SAndroid Build Coastguard Worker paths = append(paths, android.PathForSource(ctx, f)) 91*333d2b36SAndroid Build Coastguard Worker } 92*333d2b36SAndroid Build Coastguard Worker } 93*333d2b36SAndroid Build Coastguard Worker result.paths = android.PathsToDirectorySortedPaths(paths) 94*333d2b36SAndroid Build Coastguard Worker overlayData = append(overlayData, result) 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker } 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker appendOverlayData(ctx.Config().DeviceResourceOverlays(), device) 99*333d2b36SAndroid Build Coastguard Worker appendOverlayData(ctx.Config().ProductResourceOverlays(), product) 100*333d2b36SAndroid Build Coastguard Worker return overlayData 101*333d2b36SAndroid Build Coastguard Worker }).([]overlayGlobResult) 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker // Runtime resource overlays (RRO) may be turned on by the product config for some modules 104*333d2b36SAndroid Build Coastguard Worker rroEnabled := a.IsRROEnforced(ctx) 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker for _, data := range overlayData { 107*333d2b36SAndroid Build Coastguard Worker files := data.paths.PathsInDirectory(filepath.Join(data.dir, dir.String())) 108*333d2b36SAndroid Build Coastguard Worker if len(files) > 0 { 109*333d2b36SAndroid Build Coastguard Worker overlayModuleDir := android.PathForSource(ctx, data.dir, dir.String()) 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker // If enforce RRO is enabled for this module and this overlay is not in the 112*333d2b36SAndroid Build Coastguard Worker // exclusion list, ignore the overlay. The list of ignored overlays will be 113*333d2b36SAndroid Build Coastguard Worker // passed to Make to be turned into an RRO package. 114*333d2b36SAndroid Build Coastguard Worker if rroEnabled && !ctx.Config().EnforceRROExcludedOverlay(overlayModuleDir.String()) { 115*333d2b36SAndroid Build Coastguard Worker rroDirs = append(rroDirs, rroDir{overlayModuleDir, data.overlayType}) 116*333d2b36SAndroid Build Coastguard Worker } else { 117*333d2b36SAndroid Build Coastguard Worker res = append(res, globbedResourceDir{ 118*333d2b36SAndroid Build Coastguard Worker dir: overlayModuleDir, 119*333d2b36SAndroid Build Coastguard Worker files: files, 120*333d2b36SAndroid Build Coastguard Worker }) 121*333d2b36SAndroid Build Coastguard Worker } 122*333d2b36SAndroid Build Coastguard Worker } 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker return res, rroDirs 126*333d2b36SAndroid Build Coastguard Worker} 127