xref: /aosp_15_r20/build/soong/genrule/locations.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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 genrule
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker// location is used to service $(location) and $(locations) entries in genrule commands.
24*333d2b36SAndroid Build Coastguard Workertype location interface {
25*333d2b36SAndroid Build Coastguard Worker	Paths(cmd *android.RuleBuilderCommand) []string
26*333d2b36SAndroid Build Coastguard Worker	String() string
27*333d2b36SAndroid Build Coastguard Worker}
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker// inputLocation is a $(location) result for an entry in the srcs property.
30*333d2b36SAndroid Build Coastguard Workertype inputLocation struct {
31*333d2b36SAndroid Build Coastguard Worker	paths android.Paths
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc (l inputLocation) String() string {
35*333d2b36SAndroid Build Coastguard Worker	return strings.Join(l.paths.Strings(), " ")
36*333d2b36SAndroid Build Coastguard Worker}
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Workerfunc (l inputLocation) Paths(cmd *android.RuleBuilderCommand) []string {
39*333d2b36SAndroid Build Coastguard Worker	return cmd.PathsForInputs(l.paths)
40*333d2b36SAndroid Build Coastguard Worker}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workervar _ location = inputLocation{}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker// outputLocation is a $(location) result for an entry in the out property.
45*333d2b36SAndroid Build Coastguard Workertype outputLocation struct {
46*333d2b36SAndroid Build Coastguard Worker	path android.WritablePath
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workerfunc (l outputLocation) String() string {
50*333d2b36SAndroid Build Coastguard Worker	return l.path.String()
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Workerfunc (l outputLocation) Paths(cmd *android.RuleBuilderCommand) []string {
54*333d2b36SAndroid Build Coastguard Worker	return []string{cmd.PathForOutput(l.path)}
55*333d2b36SAndroid Build Coastguard Worker}
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Workervar _ location = outputLocation{}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker// toolLocation is a $(location) result for an entry in the tools or tool_files property.
60*333d2b36SAndroid Build Coastguard Workertype toolLocation struct {
61*333d2b36SAndroid Build Coastguard Worker	paths android.Paths
62*333d2b36SAndroid Build Coastguard Worker}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Workerfunc (l toolLocation) String() string {
65*333d2b36SAndroid Build Coastguard Worker	return strings.Join(l.paths.Strings(), " ")
66*333d2b36SAndroid Build Coastguard Worker}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Workerfunc (l toolLocation) Paths(cmd *android.RuleBuilderCommand) []string {
69*333d2b36SAndroid Build Coastguard Worker	return cmd.PathsForTools(l.paths)
70*333d2b36SAndroid Build Coastguard Worker}
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Workervar _ location = toolLocation{}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker// packagedToolLocation is a $(location) result for an entry in the tools or tool_files property
75*333d2b36SAndroid Build Coastguard Worker// that has PackagingSpecs.
76*333d2b36SAndroid Build Coastguard Workertype packagedToolLocation struct {
77*333d2b36SAndroid Build Coastguard Worker	spec android.PackagingSpec
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workerfunc (l packagedToolLocation) String() string {
81*333d2b36SAndroid Build Coastguard Worker	return l.spec.FileName()
82*333d2b36SAndroid Build Coastguard Worker}
83*333d2b36SAndroid Build Coastguard Worker
84*333d2b36SAndroid Build Coastguard Workerfunc (l packagedToolLocation) Paths(cmd *android.RuleBuilderCommand) []string {
85*333d2b36SAndroid Build Coastguard Worker	return []string{cmd.PathForPackagedTool(l.spec)}
86*333d2b36SAndroid Build Coastguard Worker}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Workervar _ location = packagedToolLocation{}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker// errorLocation is a placeholder for a $(location) result that returns garbage to break the command
91*333d2b36SAndroid Build Coastguard Worker// when error reporting is delayed by ALLOW_MISSING_DEPENDENCIES=true.
92*333d2b36SAndroid Build Coastguard Workertype errorLocation struct {
93*333d2b36SAndroid Build Coastguard Worker	err string
94*333d2b36SAndroid Build Coastguard Worker}
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Workerfunc (l errorLocation) String() string {
97*333d2b36SAndroid Build Coastguard Worker	return l.err
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workerfunc (l errorLocation) Paths(cmd *android.RuleBuilderCommand) []string {
101*333d2b36SAndroid Build Coastguard Worker	return []string{l.err}
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Workervar _ location = errorLocation{}
105