xref: /aosp_15_r20/build/soong/java/java_resources.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
20*333d2b36SAndroid Build Coastguard Worker	"slices"
21*333d2b36SAndroid Build Coastguard Worker	"strings"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/pathtools"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workervar resourceExcludes = []string{
29*333d2b36SAndroid Build Coastguard Worker	"**/*.java",
30*333d2b36SAndroid Build Coastguard Worker	"**/package.html",
31*333d2b36SAndroid Build Coastguard Worker	"**/overview.html",
32*333d2b36SAndroid Build Coastguard Worker	"**/.*.swp",
33*333d2b36SAndroid Build Coastguard Worker	"**/.DS_Store",
34*333d2b36SAndroid Build Coastguard Worker	"**/*~",
35*333d2b36SAndroid Build Coastguard Worker}
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workertype resourceDeps struct {
38*333d2b36SAndroid Build Coastguard Worker	dir   android.Path
39*333d2b36SAndroid Build Coastguard Worker	files android.Paths
40*333d2b36SAndroid Build Coastguard Worker}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workerfunc ResourceDirsToFiles(ctx android.BaseModuleContext,
43*333d2b36SAndroid Build Coastguard Worker	resourceDirs, excludeResourceDirs, excludeResourceFiles []string) (deps []resourceDeps) {
44*333d2b36SAndroid Build Coastguard Worker	var excludeDirs []string
45*333d2b36SAndroid Build Coastguard Worker	var excludeFiles []string
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker	for _, exclude := range excludeResourceDirs {
48*333d2b36SAndroid Build Coastguard Worker		dirs := ctx.Glob(android.PathForSource(ctx, ctx.ModuleDir()).Join(ctx, exclude).String(), nil)
49*333d2b36SAndroid Build Coastguard Worker		for _, dir := range dirs {
50*333d2b36SAndroid Build Coastguard Worker			excludeDirs = append(excludeDirs, dir.String())
51*333d2b36SAndroid Build Coastguard Worker			excludeFiles = append(excludeFiles, dir.(android.SourcePath).Join(ctx, "**/*").String())
52*333d2b36SAndroid Build Coastguard Worker		}
53*333d2b36SAndroid Build Coastguard Worker	}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	excludeFiles = append(excludeFiles, android.PathsForModuleSrc(ctx, excludeResourceFiles).Strings()...)
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	excludeFiles = append(excludeFiles, resourceExcludes...)
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	for _, resourceDir := range resourceDirs {
60*333d2b36SAndroid Build Coastguard Worker		// resourceDir may be a glob, resolve it first
61*333d2b36SAndroid Build Coastguard Worker		dirs := ctx.Glob(android.PathForSource(ctx, ctx.ModuleDir()).Join(ctx, resourceDir).String(), excludeDirs)
62*333d2b36SAndroid Build Coastguard Worker		for _, dir := range dirs {
63*333d2b36SAndroid Build Coastguard Worker			files := ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), excludeFiles)
64*333d2b36SAndroid Build Coastguard Worker			deps = append(deps, resourceDeps{
65*333d2b36SAndroid Build Coastguard Worker				dir:   dir,
66*333d2b36SAndroid Build Coastguard Worker				files: files,
67*333d2b36SAndroid Build Coastguard Worker			})
68*333d2b36SAndroid Build Coastguard Worker		}
69*333d2b36SAndroid Build Coastguard Worker	}
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Worker	return deps
72*333d2b36SAndroid Build Coastguard Worker}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Workerfunc ResourceDirsToJarArgs(ctx android.ModuleContext,
75*333d2b36SAndroid Build Coastguard Worker	resourceDirs, excludeResourceDirs, excludeResourceFiles []string) (args []string, deps android.Paths) {
76*333d2b36SAndroid Build Coastguard Worker	resDeps := ResourceDirsToFiles(ctx, resourceDirs, excludeResourceDirs, excludeResourceFiles)
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	for _, resDep := range resDeps {
79*333d2b36SAndroid Build Coastguard Worker		dir, files := resDep.dir, resDep.files
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Worker		if len(files) > 0 {
82*333d2b36SAndroid Build Coastguard Worker			args = append(args, "-C", dir.String())
83*333d2b36SAndroid Build Coastguard Worker			deps = append(deps, files...)
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker			for _, f := range files {
86*333d2b36SAndroid Build Coastguard Worker				path := f.String()
87*333d2b36SAndroid Build Coastguard Worker				if !strings.HasPrefix(path, dir.String()) {
88*333d2b36SAndroid Build Coastguard Worker					panic(fmt.Errorf("path %q does not start with %q", path, dir))
89*333d2b36SAndroid Build Coastguard Worker				}
90*333d2b36SAndroid Build Coastguard Worker				args = append(args, "-f", pathtools.MatchEscape(path))
91*333d2b36SAndroid Build Coastguard Worker			}
92*333d2b36SAndroid Build Coastguard Worker		}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	return args, deps
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker// Convert java_resources properties to arguments to soong_zip -jar, ignoring common patterns
100*333d2b36SAndroid Build Coastguard Worker// that should not be treated as resources (including *.java).
101*333d2b36SAndroid Build Coastguard Workerfunc ResourceFilesToJarArgs(ctx android.ModuleContext,
102*333d2b36SAndroid Build Coastguard Worker	res, exclude []string) (args []string, deps android.Paths) {
103*333d2b36SAndroid Build Coastguard Worker	return resourceFilesToJarArgs(ctx, res, slices.Concat(exclude, resourceExcludes))
104*333d2b36SAndroid Build Coastguard Worker}
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Workerfunc resourceFilesToJarArgs(ctx android.ModuleContext,
107*333d2b36SAndroid Build Coastguard Worker	res, exclude []string) (args []string, deps android.Paths) {
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker	files := android.PathsForModuleSrcExcludes(ctx, res, exclude)
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	args = resourcePathsToJarArgs(files)
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker	return args, files
114*333d2b36SAndroid Build Coastguard Worker}
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Workerfunc resourcePathsToJarArgs(files android.Paths) []string {
117*333d2b36SAndroid Build Coastguard Worker	var args []string
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	lastDir := ""
120*333d2b36SAndroid Build Coastguard Worker	for i, f := range files {
121*333d2b36SAndroid Build Coastguard Worker		rel := f.Rel()
122*333d2b36SAndroid Build Coastguard Worker		path := f.String()
123*333d2b36SAndroid Build Coastguard Worker		if !strings.HasSuffix(path, rel) {
124*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Errorf("path %q does not end with %q", path, rel))
125*333d2b36SAndroid Build Coastguard Worker		}
126*333d2b36SAndroid Build Coastguard Worker		dir := filepath.Clean(strings.TrimSuffix(path, rel))
127*333d2b36SAndroid Build Coastguard Worker		if i == 0 || dir != lastDir {
128*333d2b36SAndroid Build Coastguard Worker			args = append(args, "-C", dir)
129*333d2b36SAndroid Build Coastguard Worker		}
130*333d2b36SAndroid Build Coastguard Worker		args = append(args, "-f", pathtools.MatchEscape(path))
131*333d2b36SAndroid Build Coastguard Worker		lastDir = dir
132*333d2b36SAndroid Build Coastguard Worker	}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	return args
135*333d2b36SAndroid Build Coastguard Worker}
136