xref: /aosp_15_r20/build/soong/java/android_resources.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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