blob: 8029b85bd139ca867e655a3ba30e06ca937372c3 [file] [log] [blame]
Colin Crossce75d2c2016-10-06 16:12:58 -07001// Copyright 2016 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
15package android
16
17import (
Colin Cross41955e82019-05-29 14:40:35 -070018 "fmt"
Colin Crossce75d2c2016-10-06 16:12:58 -070019 "testing"
20
21 "github.com/google/blueprint"
22)
23
24var prebuiltsTests = []struct {
25 name string
26 modules string
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000027 prebuilt []OsClass
Colin Crossce75d2c2016-10-06 16:12:58 -070028}{
29 {
30 name: "no prebuilt",
31 modules: `
32 source {
33 name: "bar",
34 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000035 prebuilt: nil,
Colin Crossce75d2c2016-10-06 16:12:58 -070036 },
37 {
38 name: "no source prebuilt not preferred",
39 modules: `
40 prebuilt {
41 name: "bar",
42 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090043 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070044 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000045 prebuilt: []OsClass{Device, Host},
Colin Crossce75d2c2016-10-06 16:12:58 -070046 },
47 {
48 name: "no source prebuilt preferred",
49 modules: `
50 prebuilt {
51 name: "bar",
52 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090053 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070054 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000055 prebuilt: []OsClass{Device, Host},
Colin Crossce75d2c2016-10-06 16:12:58 -070056 },
57 {
58 name: "prebuilt not preferred",
59 modules: `
60 source {
61 name: "bar",
62 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000063
Colin Crossce75d2c2016-10-06 16:12:58 -070064 prebuilt {
65 name: "bar",
66 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090067 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070068 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000069 prebuilt: nil,
Colin Crossce75d2c2016-10-06 16:12:58 -070070 },
71 {
72 name: "prebuilt preferred",
73 modules: `
74 source {
75 name: "bar",
76 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000077
Colin Crossce75d2c2016-10-06 16:12:58 -070078 prebuilt {
79 name: "bar",
80 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090081 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070082 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000083 prebuilt: []OsClass{Device, Host},
Colin Crossce75d2c2016-10-06 16:12:58 -070084 },
Colin Cross0d614dd2016-10-14 15:38:43 -070085 {
86 name: "prebuilt no file not preferred",
87 modules: `
88 source {
89 name: "bar",
90 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000091
Colin Cross0d614dd2016-10-14 15:38:43 -070092 prebuilt {
93 name: "bar",
94 prefer: false,
95 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000096 prebuilt: nil,
Colin Cross0d614dd2016-10-14 15:38:43 -070097 },
98 {
99 name: "prebuilt no file preferred",
100 modules: `
101 source {
102 name: "bar",
103 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000104
Colin Cross0d614dd2016-10-14 15:38:43 -0700105 prebuilt {
106 name: "bar",
107 prefer: true,
108 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000109 prebuilt: nil,
Colin Cross0d614dd2016-10-14 15:38:43 -0700110 },
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700111 {
112 name: "prebuilt file from filegroup preferred",
113 modules: `
114 filegroup {
115 name: "fg",
Jiyong Parkd4671112019-04-19 17:23:04 +0900116 srcs: ["prebuilt_file"],
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700117 }
118 prebuilt {
119 name: "bar",
120 prefer: true,
121 srcs: [":fg"],
122 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000123 prebuilt: []OsClass{Device, Host},
124 },
125 {
126 name: "prebuilt module for device only",
127 modules: `
128 source {
129 name: "bar",
130 }
131
132 prebuilt {
133 name: "bar",
134 host_supported: false,
135 prefer: true,
136 srcs: ["prebuilt_file"],
137 }`,
138 prebuilt: []OsClass{Device},
139 },
140 {
141 name: "prebuilt file for host only",
142 modules: `
143 source {
144 name: "bar",
145 }
146
147 prebuilt {
148 name: "bar",
149 prefer: true,
150 target: {
Paul Duffin69304cf2020-05-29 08:01:00 +0100151 host: {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000152 srcs: ["prebuilt_file"],
153 },
154 },
155 }`,
156 prebuilt: []OsClass{Host},
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700157 },
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700158 {
159 name: "prebuilt override not preferred",
160 modules: `
161 source {
162 name: "baz",
163 }
164
165 override_source {
166 name: "bar",
167 base: "baz",
168 }
169
170 prebuilt {
171 name: "bar",
172 prefer: false,
173 srcs: ["prebuilt_file"],
174 }`,
175 prebuilt: nil,
176 },
177 {
178 name: "prebuilt override preferred",
179 modules: `
180 source {
181 name: "baz",
182 }
183
184 override_source {
185 name: "bar",
186 base: "baz",
187 }
188
189 prebuilt {
190 name: "bar",
191 prefer: true,
192 srcs: ["prebuilt_file"],
193 }`,
194 prebuilt: []OsClass{Device, Host},
195 },
Colin Crossce75d2c2016-10-06 16:12:58 -0700196}
197
198func TestPrebuilts(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800199 fs := map[string][]byte{
200 "prebuilt_file": nil,
201 "source_file": nil,
202 }
Colin Cross0d614dd2016-10-14 15:38:43 -0700203
Colin Crossce75d2c2016-10-06 16:12:58 -0700204 for _, test := range prebuiltsTests {
205 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800206 bp := `
207 source {
208 name: "foo",
209 deps: [":bar"],
210 }
211 ` + test.modules
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000212 config := TestArchConfig(buildDir, nil, bp, fs)
Colin Cross98be1bb2019-12-13 20:41:13 -0800213
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000214 ctx := NewTestArchContext()
Paul Duffin78ac5b92020-01-14 12:42:08 +0000215 registerTestPrebuiltBuildComponents(ctx)
Colin Cross4b49b762019-11-22 15:25:03 -0800216 ctx.RegisterModuleType("filegroup", FileGroupFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800217 ctx.Register(config)
Colin Crossce75d2c2016-10-06 16:12:58 -0700218
Colin Cross98be1bb2019-12-13 20:41:13 -0800219 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
Logan Chien42039712018-03-12 16:29:17 +0800220 FailIfErrored(t, errs)
Colin Crossce75d2c2016-10-06 16:12:58 -0700221 _, errs = ctx.PrepareBuildActions(config)
Logan Chien42039712018-03-12 16:29:17 +0800222 FailIfErrored(t, errs)
Colin Crossce75d2c2016-10-06 16:12:58 -0700223
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000224 for _, variant := range ctx.ModuleVariantsForTests("foo") {
225 foo := ctx.ModuleForTests("foo", variant)
226 t.Run(foo.Module().Target().Os.Class.String(), func(t *testing.T) {
227 var dependsOnSourceModule, dependsOnPrebuiltModule bool
228 ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
229 if _, ok := m.(*sourceModule); ok {
230 dependsOnSourceModule = true
231 }
232 if p, ok := m.(*prebuiltModule); ok {
233 dependsOnPrebuiltModule = true
234 if !p.Prebuilt().properties.UsePrebuilt {
235 t.Errorf("dependency on prebuilt module not marked used")
236 }
237 }
238 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700239
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000240 deps := foo.Module().(*sourceModule).deps
241 if deps == nil || len(deps) != 1 {
242 t.Errorf("deps does not have single path, but is %v", deps)
Colin Crossc3e7fa62017-03-17 13:14:32 -0700243 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000244 var usingSourceFile, usingPrebuiltFile bool
245 if deps[0].String() == "source_file" {
246 usingSourceFile = true
247 }
248 if deps[0].String() == "prebuilt_file" {
249 usingPrebuiltFile = true
250 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700251
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000252 prebuilt := false
253 for _, os := range test.prebuilt {
254 if os == foo.Module().Target().Os.Class {
255 prebuilt = true
256 }
257 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900258
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000259 if prebuilt {
260 if !dependsOnPrebuiltModule {
261 t.Errorf("doesn't depend on prebuilt module")
262 }
263 if !usingPrebuiltFile {
264 t.Errorf("doesn't use prebuilt_file")
265 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700266
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000267 if dependsOnSourceModule {
268 t.Errorf("depends on source module")
269 }
270 if usingSourceFile {
271 t.Errorf("using source_file")
272 }
273 } else {
274 if dependsOnPrebuiltModule {
275 t.Errorf("depends on prebuilt module")
276 }
277 if usingPrebuiltFile {
278 t.Errorf("using prebuilt_file")
279 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700280
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000281 if !dependsOnSourceModule {
282 t.Errorf("doesn't depend on source module")
283 }
284 if !usingSourceFile {
285 t.Errorf("doesn't use source_file")
286 }
287 }
288 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700289 }
290 })
291 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700292}
293
Paul Duffin78ac5b92020-01-14 12:42:08 +0000294func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
295 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
296 ctx.RegisterModuleType("source", newSourceModule)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700297 ctx.RegisterModuleType("override_source", newOverrideSourceModule)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000298
299 RegisterPrebuiltMutators(ctx)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700300 ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000301}
302
Colin Crossce75d2c2016-10-06 16:12:58 -0700303type prebuiltModule struct {
304 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700305 prebuilt Prebuilt
306 properties struct {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000307 Srcs []string `android:"path,arch_variant"`
Colin Cross74d73e22017-08-02 11:05:49 -0700308 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900309 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700310}
311
Colin Cross36242852017-06-23 15:06:31 -0700312func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700313 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700314 m.AddProperties(&m.properties)
315 InitPrebuiltModule(m, &m.properties.Srcs)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000316 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Colin Cross36242852017-06-23 15:06:31 -0700317 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700318}
319
320func (p *prebuiltModule) Name() string {
321 return p.prebuilt.Name(p.ModuleBase.Name())
322}
323
Jiyong Parkd4671112019-04-19 17:23:04 +0900324func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
325 if len(p.properties.Srcs) >= 1 {
326 p.src = p.prebuilt.SingleSourcePath(ctx)
327 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700328}
329
330func (p *prebuiltModule) Prebuilt() *Prebuilt {
331 return &p.prebuilt
332}
333
Colin Cross41955e82019-05-29 14:40:35 -0700334func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
335 switch tag {
336 case "":
337 return Paths{p.src}, nil
338 default:
339 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
340 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900341}
342
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700343type sourceModuleProperties struct {
344 Deps []string `android:"path,arch_variant"`
345}
346
Colin Crossce75d2c2016-10-06 16:12:58 -0700347type sourceModule struct {
348 ModuleBase
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700349 OverridableModuleBase
350
351 properties sourceModuleProperties
Colin Crossce75d2c2016-10-06 16:12:58 -0700352 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900353 deps Paths
354 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700355}
356
Colin Cross36242852017-06-23 15:06:31 -0700357func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700358 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700359 m.AddProperties(&m.properties)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000360 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700361 InitOverridableModule(m, nil)
Colin Cross36242852017-06-23 15:06:31 -0700362 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700363}
364
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700365func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900366 // s.properties.Deps are annotated with android:path, so they are
367 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700368}
369
370func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900371 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
372 s.src = PathForModuleSrc(ctx, "source_file")
373}
374
375func (s *sourceModule) Srcs() Paths {
376 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700377}
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700378
379type overrideSourceModule struct {
380 ModuleBase
381 OverrideModuleBase
382}
383
384func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
385}
386
387func newOverrideSourceModule() Module {
388 m := &overrideSourceModule{}
389 m.AddProperties(&sourceModuleProperties{})
390
391 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
392 InitOverrideModule(m)
393 return m
394}