blob: 4169e2129f957b6e20f2327ef9d95c302c301453 [file] [log] [blame]
Justin Yun8effde42017-06-23 19:24:43 +09001// Copyright 2017 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 cc
16
17import (
Inseob Kimae553032019-05-14 18:52:49 +090018 "encoding/json"
Martin Stjernholm257eb0c2018-10-15 13:05:27 +010019 "errors"
Jooyung Han0302a842019-10-30 18:43:49 +090020 "fmt"
Inseob Kim1f086e22019-05-09 13:29:15 +090021 "path/filepath"
Inseob Kim242ef0c2019-10-22 20:15:20 +090022 "sort"
Jiyong Parkd5b18a52017-08-03 21:22:50 +090023 "strings"
24 "sync"
25
Justin Yun8effde42017-06-23 19:24:43 +090026 "android/soong/android"
Vic Yangefd249e2018-11-12 20:19:56 -080027 "android/soong/cc/config"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070028 "android/soong/etc"
Colin Cross6e511a92020-07-27 21:26:48 -070029
30 "github.com/google/blueprint"
Justin Yun8effde42017-06-23 19:24:43 +090031)
32
Jooyung Han39edb6c2019-11-06 16:53:07 +090033const (
34 llndkLibrariesTxt = "llndk.libraries.txt"
35 vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
36 vndkSpLibrariesTxt = "vndksp.libraries.txt"
37 vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
38 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
39)
40
41func VndkLibrariesTxtModules(vndkVersion string) []string {
42 if vndkVersion == "current" {
43 return []string{
44 llndkLibrariesTxt,
45 vndkCoreLibrariesTxt,
46 vndkSpLibrariesTxt,
47 vndkPrivateLibrariesTxt,
Jooyung Han39edb6c2019-11-06 16:53:07 +090048 }
49 }
50 // Snapshot vndks have their own *.libraries.VER.txt files.
51 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
52 return []string{
53 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
54 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
55 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
56 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
57 }
58}
59
Justin Yun8effde42017-06-23 19:24:43 +090060type VndkProperties struct {
61 Vndk struct {
62 // declared as a VNDK or VNDK-SP module. The vendor variant
63 // will be installed in /system instead of /vendor partition.
64 //
Roland Levillaindfe75b32019-07-23 16:53:32 +010065 // `vendor_available` must be explicitly set to either true or
Jiyong Park82e2bf32017-08-16 14:05:54 +090066 // false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090067 Enabled *bool
68
69 // declared as a VNDK-SP module, which is a subset of VNDK.
70 //
71 // `vndk: { enabled: true }` must set together.
72 //
73 // All these modules are allowed to link to VNDK-SP or LL-NDK
74 // modules only. Other dependency will cause link-type errors.
75 //
76 // If `support_system_process` is not set or set to false,
77 // the module is VNDK-core and can link to other VNDK-core,
78 // VNDK-SP or LL-NDK modules only.
79 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +080080
81 // Extending another module
82 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +090083 }
84}
85
86type vndkdep struct {
87 Properties VndkProperties
88}
89
90func (vndk *vndkdep) props() []interface{} {
91 return []interface{}{&vndk.Properties}
92}
93
94func (vndk *vndkdep) begin(ctx BaseModuleContext) {}
95
96func (vndk *vndkdep) deps(ctx BaseModuleContext, deps Deps) Deps {
97 return deps
98}
99
100func (vndk *vndkdep) isVndk() bool {
101 return Bool(vndk.Properties.Vndk.Enabled)
102}
103
104func (vndk *vndkdep) isVndkSp() bool {
105 return Bool(vndk.Properties.Vndk.Support_system_process)
106}
107
Logan Chienf3511742017-10-31 18:04:35 +0800108func (vndk *vndkdep) isVndkExt() bool {
109 return vndk.Properties.Vndk.Extends != nil
110}
111
112func (vndk *vndkdep) getVndkExtendsModuleName() string {
113 return String(vndk.Properties.Vndk.Extends)
114}
115
Justin Yun8effde42017-06-23 19:24:43 +0900116func (vndk *vndkdep) typeName() string {
117 if !vndk.isVndk() {
118 return "native:vendor"
119 }
Logan Chienf3511742017-10-31 18:04:35 +0800120 if !vndk.isVndkExt() {
121 if !vndk.isVndkSp() {
122 return "native:vendor:vndk"
123 }
124 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900125 }
Logan Chienf3511742017-10-31 18:04:35 +0800126 if !vndk.isVndkSp() {
127 return "native:vendor:vndkext"
128 }
129 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900130}
131
Colin Cross6e511a92020-07-27 21:26:48 -0700132func (vndk *vndkdep) vndkCheckLinkType(ctx android.ModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900133 if to.linker == nil {
134 return
135 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900136 if !vndk.isVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900137 // Non-VNDK modules (those installed to /vendor, /product, or /system/product) can't depend
138 // on modules marked with vendor_available: false.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900139 violation := false
Nan Zhang0007d812017-11-07 10:57:05 -0800140 if lib, ok := to.linker.(*llndkStubDecorator); ok && !Bool(lib.Properties.Vendor_available) {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900141 violation = true
142 } else {
143 if _, ok := to.linker.(libraryInterface); ok && to.VendorProperties.Vendor_available != nil && !Bool(to.VendorProperties.Vendor_available) {
144 // Vendor_available == nil && !Bool(Vendor_available) should be okay since
Justin Yun5f7f7e82019-11-18 19:52:14 +0900145 // it means a vendor-only, or product-only library which is a valid dependency
146 // for non-VNDK modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900147 violation = true
148 }
149 }
150 if violation {
151 ctx.ModuleErrorf("Vendor module that is not VNDK should not link to %q which is marked as `vendor_available: false`", to.Name())
152 }
153 }
Justin Yun8effde42017-06-23 19:24:43 +0900154 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
155 // Check only shared libraries.
156 // Other (static and LL-NDK) libraries are allowed to link.
157 return
158 }
Ivan Lozano52767be2019-10-18 14:49:46 -0700159 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900160 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
161 vndk.typeName(), to.Name())
162 return
163 }
Logan Chienf3511742017-10-31 18:04:35 +0800164 if tag == vndkExtDepTag {
165 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
166 // and has identical vndk properties.
167 if to.vndkdep == nil || !to.vndkdep.isVndk() {
168 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
169 return
170 }
171 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
172 ctx.ModuleErrorf(
173 "`extends` refers a module %q with mismatched support_system_process",
174 to.Name())
175 return
176 }
177 if !Bool(to.VendorProperties.Vendor_available) {
178 ctx.ModuleErrorf(
179 "`extends` refers module %q which does not have `vendor_available: true`",
180 to.Name())
181 return
182 }
183 }
Justin Yun8effde42017-06-23 19:24:43 +0900184 if to.vndkdep == nil {
185 return
186 }
Logan Chienf3511742017-10-31 18:04:35 +0800187
Logan Chiend3c59a22018-03-29 14:08:15 +0800188 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100189 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
190 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
191 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800192 return
193 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800194}
Logan Chienf3511742017-10-31 18:04:35 +0800195
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100196func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800197 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
198 if from.isVndkExt() {
199 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100200 if to.isVndk() && !to.isVndkSp() {
201 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
202 }
203 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800204 }
205 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100206 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900207 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800208 if from.isVndk() {
209 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100210 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800211 }
212 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100213 if !to.isVndkSp() {
214 return errors.New("VNDK-SP must only depend on VNDK-SP")
215 }
216 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800217 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100218 if !to.isVndk() {
219 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
220 }
221 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800222 }
223 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100224 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900225}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900226
227var (
Jooyung Hana463f722019-11-01 08:45:59 +0900228 vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires")
229 vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires")
230 llndkLibrariesKey = android.NewOnceKey("llndkLibrarires")
231 vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires")
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900232 vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries")
Jooyung Hana463f722019-11-01 08:45:59 +0900233 vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
234 vndkLibrariesLock sync.Mutex
Inseob Kimae553032019-05-14 18:52:49 +0900235)
Inseob Kim1f086e22019-05-09 13:29:15 +0900236
Jooyung Han0302a842019-10-30 18:43:49 +0900237func vndkCoreLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900238 return config.Once(vndkCoreLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900239 return make(map[string]string)
240 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900241}
242
Jooyung Han0302a842019-10-30 18:43:49 +0900243func vndkSpLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900244 return config.Once(vndkSpLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900245 return make(map[string]string)
246 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900247}
248
Jooyung Han0302a842019-10-30 18:43:49 +0900249func isLlndkLibrary(baseModuleName string, config android.Config) bool {
250 _, ok := llndkLibraries(config)[baseModuleName]
251 return ok
252}
253
254func llndkLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900255 return config.Once(llndkLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900256 return make(map[string]string)
257 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900258}
259
Jooyung Han0302a842019-10-30 18:43:49 +0900260func isVndkPrivateLibrary(baseModuleName string, config android.Config) bool {
261 _, ok := vndkPrivateLibraries(config)[baseModuleName]
262 return ok
263}
264
265func vndkPrivateLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900266 return config.Once(vndkPrivateLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900267 return make(map[string]string)
268 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900269}
270
Jooyung Han0302a842019-10-30 18:43:49 +0900271func vndkUsingCoreVariantLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900272 return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900273 return make(map[string]string)
274 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900275}
276
Jooyung Han097087b2019-10-22 19:32:18 +0900277func vndkMustUseVendorVariantList(cfg android.Config) []string {
278 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900279 return config.VndkMustUseVendorVariantList
280 }).([]string)
281}
282
283// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
284// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
285func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900286 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900287 return mustUseVendorVariantList
288 })
289}
290
Inseob Kim1f086e22019-05-09 13:29:15 +0900291func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
292 lib := m.linker.(*llndkStubDecorator)
Jooyung Han0302a842019-10-30 18:43:49 +0900293 name := m.BaseModuleName()
294 filename := m.BaseModuleName() + ".so"
Inseob Kim9516ee92019-05-09 10:56:13 +0900295
Inseob Kim1f086e22019-05-09 13:29:15 +0900296 vndkLibrariesLock.Lock()
297 defer vndkLibrariesLock.Unlock()
Inseob Kim9516ee92019-05-09 10:56:13 +0900298
Jooyung Han0302a842019-10-30 18:43:49 +0900299 llndkLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900300 if !Bool(lib.Properties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900301 vndkPrivateLibraries(mctx.Config())[name] = filename
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900302 }
Colin Cross56a83212020-09-15 18:30:11 -0700303
Jooyung Han61b66e92020-03-21 14:21:46 +0000304 if mctx.OtherModuleExists(name) {
305 mctx.AddFarVariationDependencies(m.Target().Variations(), llndkImplDep, name)
306 }
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900307}
Inseob Kim1f086e22019-05-09 13:29:15 +0900308
309func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Jooyung Han0302a842019-10-30 18:43:49 +0900310 name := m.BaseModuleName()
311 filename, err := getVndkFileName(m)
312 if err != nil {
313 panic(err)
314 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900315
Jiyong Park2478e4e2020-05-18 09:30:14 +0000316 if m.HasStubsVariants() && name != "libz" {
317 // b/155456180 libz is the ONLY exception here. We don't want to make
318 // libz an LLNDK library because we in general can't guarantee that
319 // libz will behave consistently especially about the compression.
320 // i.e. the compressed output might be different across releases.
321 // As the library is an external one, it's risky to keep the compatibility
322 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900323 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
324 }
325
Inseob Kim1f086e22019-05-09 13:29:15 +0900326 vndkLibrariesLock.Lock()
327 defer vndkLibrariesLock.Unlock()
328
Jooyung Han097087b2019-10-22 19:32:18 +0900329 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
330 m.Properties.MustUseVendorVariant = true
331 }
Jooyung Han0302a842019-10-30 18:43:49 +0900332 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
333 vndkUsingCoreVariantLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900334 }
Jooyung Han0302a842019-10-30 18:43:49 +0900335
Inseob Kim1f086e22019-05-09 13:29:15 +0900336 if m.vndkdep.isVndkSp() {
Jooyung Han0302a842019-10-30 18:43:49 +0900337 vndkSpLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900338 } else {
Jooyung Han0302a842019-10-30 18:43:49 +0900339 vndkCoreLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900340 }
341 if !Bool(m.VendorProperties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900342 vndkPrivateLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900343 }
344}
345
Yo Chiang08fac0c2020-07-29 01:08:20 +0800346// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800347func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900348 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800349 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900350 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800351 if !m.Device() {
352 // Skip non-device modules
353 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900354 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900355 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800356 // Skip native_bridge modules
357 return true
358 }
359 return false
360}
361
362func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
363 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900364 return false
365 }
366
367 // prebuilt vndk modules should match with device
368 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
369 // When b/142675459 is landed, remove following check
370 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.matchesWithDevice(mctx.DeviceConfig()) {
371 return false
372 }
373
374 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900375 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
376 if mctx.DeviceConfig().VndkVersion() == "" {
377 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
378 if mctx.ModuleName() == "libz" {
379 return false
380 }
381 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.isVndkSp()
382 }
383
Justin Yun5f7f7e82019-11-18 19:52:14 +0900384 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900385 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000386 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900387 }
388 return false
389}
390
Inseob Kim1f086e22019-05-09 13:29:15 +0900391// gather list of vndk-core, vndk-sp, and ll-ndk libs
392func VndkMutator(mctx android.BottomUpMutatorContext) {
393 m, ok := mctx.Module().(*Module)
394 if !ok {
395 return
396 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800397
398 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900399 return
400 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900401
402 if _, ok := m.linker.(*llndkStubDecorator); ok {
403 processLlndkLibrary(mctx, m)
404 return
405 }
406
407 lib, is_lib := m.linker.(*libraryDecorator)
408 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
409
Inseob Kim64c43952019-08-26 16:52:35 +0900410 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
411 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900412 processVndkLibrary(mctx, m)
413 return
414 }
415 }
416}
417
418func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900419 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900420 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900421}
422
Jooyung Han2216fb12019-11-06 16:46:15 +0900423type vndkLibrariesTxt struct {
424 android.ModuleBase
425 outputFile android.OutputPath
426}
427
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700428var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900429var _ android.OutputFileProducer = &vndkLibrariesTxt{}
430
Jooyung Han2216fb12019-11-06 16:46:15 +0900431// vndk_libraries_txt is a special kind of module type in that it name is one of
432// - llndk.libraries.txt
433// - vndkcore.libraries.txt
434// - vndksp.libraries.txt
435// - vndkprivate.libraries.txt
436// - vndkcorevariant.libraries.txt
437// A module behaves like a prebuilt_etc but its content is generated by soong.
438// By being a soong module, these files can be referenced by other soong modules.
439// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900440func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900441 m := &vndkLibrariesTxt{}
442 android.InitAndroidModule(m)
443 return m
444}
445
446func insertVndkVersion(filename string, vndkVersion string) string {
447 if index := strings.LastIndex(filename, "."); index != -1 {
448 return filename[:index] + "." + vndkVersion + filename[index:]
449 }
450 return filename
451}
452
453func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
454 var list []string
455 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900456 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900457 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
458 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
459 continue
460 }
461 list = append(list, filename)
462 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900463 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900464 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900465 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900466 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900467 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900468 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900469 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900470 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
471 default:
472 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
473 return
474 }
475
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900476 var filename string
477 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
478 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
479 } else {
480 filename = txt.Name()
481 }
482
Jooyung Han2216fb12019-11-06 16:46:15 +0900483 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
484 ctx.Build(pctx, android.BuildParams{
485 Rule: android.WriteFile,
486 Output: txt.outputFile,
487 Description: "Writing " + txt.outputFile.String(),
488 Args: map[string]string{
489 "content": strings.Join(list, "\\n"),
490 },
491 })
492
493 installPath := android.PathForModuleInstall(ctx, "etc")
494 ctx.InstallFile(installPath, filename, txt.outputFile)
495}
496
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900497func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
498 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900499 Class: "ETC",
500 OutputFile: android.OptionalPathForPath(txt.outputFile),
501 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
502 func(entries *android.AndroidMkEntries) {
503 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
504 },
505 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900506 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900507}
508
Jooyung Han0703fd82020-08-26 22:11:53 +0900509// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900510func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
511 return txt.outputFile
512}
513
Jooyung Han0703fd82020-08-26 22:11:53 +0900514// PrebuiltEtcModule interface
515func (txt *vndkLibrariesTxt) BaseDir() string {
516 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900517}
518
Jooyung Han0703fd82020-08-26 22:11:53 +0900519// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900520func (txt *vndkLibrariesTxt) SubDir() string {
521 return ""
522}
523
Jooyung Han0703fd82020-08-26 22:11:53 +0900524func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
525 return android.Paths{txt.outputFile}, nil
526}
527
Inseob Kim1f086e22019-05-09 13:29:15 +0900528func VndkSnapshotSingleton() android.Singleton {
529 return &vndkSnapshotSingleton{}
530}
531
Jooyung Han0302a842019-10-30 18:43:49 +0900532type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900533 vndkLibrariesFile android.OutputPath
534 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900535}
Inseob Kim1f086e22019-05-09 13:29:15 +0900536
Colin Cross56a83212020-09-15 18:30:11 -0700537func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module,
538 apexInfo android.ApexInfo) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
539
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900540 if m.Target().NativeBridge == android.NativeBridgeEnabled {
541 return nil, "", false
542 }
Colin Cross56a83212020-09-15 18:30:11 -0700543 if !m.inVendor() || !m.installable(apexInfo) || m.isSnapshotPrebuilt() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900544 return nil, "", false
545 }
546 l, ok := m.linker.(snapshotLibraryInterface)
547 if !ok || !l.shared() {
548 return nil, "", false
549 }
550 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
551 if m.isVndkSp() {
552 return l, "vndk-sp", true
553 } else {
554 return l, "vndk-core", true
555 }
556 }
557
558 return nil, "", false
559}
560
Inseob Kim1f086e22019-05-09 13:29:15 +0900561func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900562 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
563 c.buildVndkLibrariesTxtFiles(ctx)
564
Inseob Kim1f086e22019-05-09 13:29:15 +0900565 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
566 if ctx.DeviceConfig().VndkVersion() != "current" {
567 return
568 }
569
570 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
571 return
572 }
573
Inseob Kim242ef0c2019-10-22 20:15:20 +0900574 var snapshotOutputs android.Paths
575
576 /*
577 VNDK snapshot zipped artifacts directory structure:
578 {SNAPSHOT_ARCH}/
579 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
580 shared/
581 vndk-core/
582 (VNDK-core libraries, e.g. libbinder.so)
583 vndk-sp/
584 (VNDK-SP libraries, e.g. libc++.so)
585 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
586 shared/
587 vndk-core/
588 (VNDK-core libraries, e.g. libbinder.so)
589 vndk-sp/
590 (VNDK-SP libraries, e.g. libc++.so)
591 binder32/
592 (This directory is newly introduced in v28 (Android P) to hold
593 prebuilts built for 32-bit binder interface.)
594 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
595 ...
596 configs/
597 (various *.txt configuration files)
598 include/
599 (header files of same directory structure with source tree)
600 NOTICE_FILES/
601 (notice files of libraries, e.g. libcutils.so.txt)
602 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900603
604 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900605 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900606
Inseob Kim242ef0c2019-10-22 20:15:20 +0900607 configsDir := filepath.Join(snapshotArchDir, "configs")
608 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
609 includeDir := filepath.Join(snapshotArchDir, "include")
610
Inseob Kim242ef0c2019-10-22 20:15:20 +0900611 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900612 noticeBuilt := make(map[string]bool)
613
Inseob Kim242ef0c2019-10-22 20:15:20 +0900614 // paths of VNDK modules for GPL license checking
615 modulePaths := make(map[string]string)
616
617 // actual module names of .so files
618 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
619 moduleNames := make(map[string]string)
620
Inseob Kim8471cda2019-11-15 09:59:12 +0900621 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900622
Inseob Kim8471cda2019-11-15 09:59:12 +0900623 installVndkSnapshotLib := func(m *Module, l snapshotLibraryInterface, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900624 var ret android.Paths
625
Inseob Kim8471cda2019-11-15 09:59:12 +0900626 targetArch := "arch-" + m.Target().Arch.ArchType.String()
627 if m.Target().Arch.ArchVariant != "" {
628 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900629 }
Inseob Kimae553032019-05-14 18:52:49 +0900630
Inseob Kim8471cda2019-11-15 09:59:12 +0900631 libPath := m.outputFile.Path()
632 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
633 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
634
Inseob Kimae553032019-05-14 18:52:49 +0900635 if ctx.Config().VndkSnapshotBuildArtifacts() {
636 prop := struct {
637 ExportedDirs []string `json:",omitempty"`
638 ExportedSystemDirs []string `json:",omitempty"`
639 ExportedFlags []string `json:",omitempty"`
640 RelativeInstallPath string `json:",omitempty"`
641 }{}
642 prop.ExportedFlags = l.exportedFlags()
Jiyong Park74955042019-10-22 20:19:51 +0900643 prop.ExportedDirs = l.exportedDirs().Strings()
644 prop.ExportedSystemDirs = l.exportedSystemDirs().Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900645 prop.RelativeInstallPath = m.RelativeInstallPath()
646
Inseob Kim242ef0c2019-10-22 20:15:20 +0900647 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900648
649 j, err := json.Marshal(prop)
650 if err != nil {
651 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900652 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900653 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900654 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900655 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900656 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900657 }
658
Inseob Kim1f086e22019-05-09 13:29:15 +0900659 ctx.VisitAllModules(func(module android.Module) {
660 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900661 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900662 return
663 }
664
Colin Cross56a83212020-09-15 18:30:11 -0700665 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
666
667 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900668 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200669 return
670 }
671
Inseob Kim8471cda2019-11-15 09:59:12 +0900672 // install .so files for appropriate modules.
673 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Inseob Kim242ef0c2019-10-22 20:15:20 +0900674 libs, ok := installVndkSnapshotLib(m, l, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900675 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900676 return
677 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900678 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900679
Inseob Kim8471cda2019-11-15 09:59:12 +0900680 // These are for generating module_names.txt and module_paths.txt
681 stem := m.outputFile.Path().Base()
682 moduleNames[stem] = ctx.ModuleName(m)
683 modulePaths[stem] = ctx.ModuleDir(m)
684
Bob Badoura75b0572020-02-18 20:21:55 -0800685 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900686 noticeName := stem + ".txt"
687 // skip already copied notice file
688 if _, ok := noticeBuilt[noticeName]; !ok {
689 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800690 snapshotOutputs = append(snapshotOutputs, combineNotices(
691 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900692 }
693 }
694
695 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900696 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900697 }
698 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900699
Inseob Kim8471cda2019-11-15 09:59:12 +0900700 // install all headers after removing duplicates
701 for _, header := range android.FirstUniquePaths(headers) {
702 snapshotOutputs = append(snapshotOutputs, copyFile(
703 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900704 }
705
Jooyung Han39edb6c2019-11-06 16:53:07 +0900706 // install *.libraries.txt except vndkcorevariant.libraries.txt
707 ctx.VisitAllModules(func(module android.Module) {
708 m, ok := module.(*vndkLibrariesTxt)
709 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
710 return
711 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900712 snapshotOutputs = append(snapshotOutputs, copyFile(
713 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900714 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900715
Inseob Kim242ef0c2019-10-22 20:15:20 +0900716 /*
717 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900718
Inseob Kim242ef0c2019-10-22 20:15:20 +0900719 {key1} {value1}
720 {key2} {value2}
721 ...
722 */
723 installMapListFile := func(m map[string]string, path string) android.OutputPath {
724 var txtBuilder strings.Builder
725 for idx, k := range android.SortedStringKeys(m) {
726 if idx > 0 {
727 txtBuilder.WriteString("\\n")
728 }
729 txtBuilder.WriteString(k)
730 txtBuilder.WriteString(" ")
731 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900732 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900733 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900734 }
735
Inseob Kim242ef0c2019-10-22 20:15:20 +0900736 /*
737 module_paths.txt contains paths on which VNDK modules are defined.
738 e.g.,
739 libbase.so system/core/base
740 libc.so bionic/libc
741 ...
742 */
743 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
744
745 /*
746 module_names.txt contains names as which VNDK modules are defined,
747 because output filename and module name can be different with stem and suffix properties.
748
749 e.g.,
750 libcutils.so libcutils
751 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
752 ...
753 */
754 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
755
756 // All artifacts are ready. Sort them to normalize ninja and then zip.
757 sort.Slice(snapshotOutputs, func(i, j int) bool {
758 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
759 })
760
761 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
762 zipRule := android.NewRuleBuilder()
763
Inseob Kim8471cda2019-11-15 09:59:12 +0900764 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900765 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
766 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900767 Text("tr").
768 FlagWithArg("-d ", "\\'").
769 FlagWithRspFileInputList("< ", snapshotOutputs).
770 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900771
772 zipRule.Temporary(snapshotOutputList)
773
774 zipRule.Command().
775 BuiltTool(ctx, "soong_zip").
776 FlagWithOutput("-o ", zipPath).
777 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
778 FlagWithInput("-l ", snapshotOutputList)
779
780 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900781 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900782 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900783}
Jooyung Han097087b2019-10-22 19:32:18 +0900784
Jooyung Han0302a842019-10-30 18:43:49 +0900785func getVndkFileName(m *Module) (string, error) {
786 if library, ok := m.linker.(*libraryDecorator); ok {
787 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
788 }
789 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
790 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
791 }
792 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900793}
794
795func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900796 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900797 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
798 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
799 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900800
Jooyung Han2216fb12019-11-06 16:46:15 +0900801 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900802 // Since each target have different set of libclang_rt.* files,
803 // keep the common set of files in vndk.libraries.txt
804 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900805 filterOutLibClangRt := func(libList []string) (filtered []string) {
806 for _, lib := range libList {
807 if !strings.HasPrefix(lib, "libclang_rt.") {
808 filtered = append(filtered, lib)
809 }
810 }
811 return
812 }
813 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
814 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
815 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
816 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900817 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
818 ctx.Build(pctx, android.BuildParams{
819 Rule: android.WriteFile,
820 Output: c.vndkLibrariesFile,
821 Description: "Writing " + c.vndkLibrariesFile.String(),
822 Args: map[string]string{
823 "content": strings.Join(merged, "\\n"),
824 },
825 })
Jooyung Han0302a842019-10-30 18:43:49 +0900826}
Jooyung Han097087b2019-10-22 19:32:18 +0900827
Jooyung Han0302a842019-10-30 18:43:49 +0900828func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
829 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
830 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700831 movedToApexLlndkLibraries := make(map[string]bool)
832 ctx.VisitAllModules(func(module android.Module) {
833 if m, ok := module.(*Module); ok {
834 if llndk, ok := m.linker.(*llndkStubDecorator); ok {
835 // Skip bionic libs, they are handled in different manner
836 name := m.BaseModuleName()
837 if llndk.movedToApex && !isBionic(m.BaseModuleName()) {
838 movedToApexLlndkLibraries[name] = true
839 }
840 }
Jooyung Han0302a842019-10-30 18:43:49 +0900841 }
Colin Cross56a83212020-09-15 18:30:11 -0700842 })
843
844 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
845 strings.Join(android.SortedStringKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900846
847 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
848 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
849 // Therefore, by removing the library here, we cause it to only be installed if libc
850 // depends on it.
851 installedLlndkLibraries := []string{}
852 for lib := range llndkLibraries(ctx.Config()) {
853 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
854 continue
855 }
856 installedLlndkLibraries = append(installedLlndkLibraries, lib)
857 }
858 sort.Strings(installedLlndkLibraries)
859 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
860
Jooyung Han0302a842019-10-30 18:43:49 +0900861 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
862 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
863 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
864 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
865
Jooyung Han0302a842019-10-30 18:43:49 +0900866 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900867 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900868}