blob: e5e453305f556b4aaced2398307dd37331237fad [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"
Justin Yun8effde42017-06-23 19:24:43 +090028)
29
Jooyung Han39edb6c2019-11-06 16:53:07 +090030const (
31 llndkLibrariesTxt = "llndk.libraries.txt"
32 vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
33 vndkSpLibrariesTxt = "vndksp.libraries.txt"
34 vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
35 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
36)
37
38func VndkLibrariesTxtModules(vndkVersion string) []string {
39 if vndkVersion == "current" {
40 return []string{
41 llndkLibrariesTxt,
42 vndkCoreLibrariesTxt,
43 vndkSpLibrariesTxt,
44 vndkPrivateLibrariesTxt,
Jooyung Han39edb6c2019-11-06 16:53:07 +090045 }
46 }
47 // Snapshot vndks have their own *.libraries.VER.txt files.
48 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
49 return []string{
50 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
51 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
52 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
53 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
54 }
55}
56
Justin Yun8effde42017-06-23 19:24:43 +090057type VndkProperties struct {
58 Vndk struct {
59 // declared as a VNDK or VNDK-SP module. The vendor variant
60 // will be installed in /system instead of /vendor partition.
61 //
Roland Levillaindfe75b32019-07-23 16:53:32 +010062 // `vendor_available` must be explicitly set to either true or
Jiyong Park82e2bf32017-08-16 14:05:54 +090063 // false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090064 Enabled *bool
65
66 // declared as a VNDK-SP module, which is a subset of VNDK.
67 //
68 // `vndk: { enabled: true }` must set together.
69 //
70 // All these modules are allowed to link to VNDK-SP or LL-NDK
71 // modules only. Other dependency will cause link-type errors.
72 //
73 // If `support_system_process` is not set or set to false,
74 // the module is VNDK-core and can link to other VNDK-core,
75 // VNDK-SP or LL-NDK modules only.
76 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +080077
78 // Extending another module
79 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +090080 }
81}
82
83type vndkdep struct {
84 Properties VndkProperties
85}
86
87func (vndk *vndkdep) props() []interface{} {
88 return []interface{}{&vndk.Properties}
89}
90
91func (vndk *vndkdep) begin(ctx BaseModuleContext) {}
92
93func (vndk *vndkdep) deps(ctx BaseModuleContext, deps Deps) Deps {
94 return deps
95}
96
97func (vndk *vndkdep) isVndk() bool {
98 return Bool(vndk.Properties.Vndk.Enabled)
99}
100
101func (vndk *vndkdep) isVndkSp() bool {
102 return Bool(vndk.Properties.Vndk.Support_system_process)
103}
104
Logan Chienf3511742017-10-31 18:04:35 +0800105func (vndk *vndkdep) isVndkExt() bool {
106 return vndk.Properties.Vndk.Extends != nil
107}
108
109func (vndk *vndkdep) getVndkExtendsModuleName() string {
110 return String(vndk.Properties.Vndk.Extends)
111}
112
Justin Yun8effde42017-06-23 19:24:43 +0900113func (vndk *vndkdep) typeName() string {
114 if !vndk.isVndk() {
115 return "native:vendor"
116 }
Logan Chienf3511742017-10-31 18:04:35 +0800117 if !vndk.isVndkExt() {
118 if !vndk.isVndkSp() {
119 return "native:vendor:vndk"
120 }
121 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900122 }
Logan Chienf3511742017-10-31 18:04:35 +0800123 if !vndk.isVndkSp() {
124 return "native:vendor:vndkext"
125 }
126 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900127}
128
Ivan Lozano183a3212019-10-18 14:18:45 -0700129func (vndk *vndkdep) vndkCheckLinkType(ctx android.ModuleContext, to *Module, tag DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900130 if to.linker == nil {
131 return
132 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900133 if !vndk.isVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900134 // Non-VNDK modules (those installed to /vendor, /product, or /system/product) can't depend
135 // on modules marked with vendor_available: false.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900136 violation := false
Nan Zhang0007d812017-11-07 10:57:05 -0800137 if lib, ok := to.linker.(*llndkStubDecorator); ok && !Bool(lib.Properties.Vendor_available) {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900138 violation = true
139 } else {
140 if _, ok := to.linker.(libraryInterface); ok && to.VendorProperties.Vendor_available != nil && !Bool(to.VendorProperties.Vendor_available) {
141 // Vendor_available == nil && !Bool(Vendor_available) should be okay since
Justin Yun5f7f7e82019-11-18 19:52:14 +0900142 // it means a vendor-only, or product-only library which is a valid dependency
143 // for non-VNDK modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900144 violation = true
145 }
146 }
147 if violation {
148 ctx.ModuleErrorf("Vendor module that is not VNDK should not link to %q which is marked as `vendor_available: false`", to.Name())
149 }
150 }
Justin Yun8effde42017-06-23 19:24:43 +0900151 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
152 // Check only shared libraries.
153 // Other (static and LL-NDK) libraries are allowed to link.
154 return
155 }
Ivan Lozano52767be2019-10-18 14:49:46 -0700156 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900157 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
158 vndk.typeName(), to.Name())
159 return
160 }
Logan Chienf3511742017-10-31 18:04:35 +0800161 if tag == vndkExtDepTag {
162 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
163 // and has identical vndk properties.
164 if to.vndkdep == nil || !to.vndkdep.isVndk() {
165 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
166 return
167 }
168 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
169 ctx.ModuleErrorf(
170 "`extends` refers a module %q with mismatched support_system_process",
171 to.Name())
172 return
173 }
174 if !Bool(to.VendorProperties.Vendor_available) {
175 ctx.ModuleErrorf(
176 "`extends` refers module %q which does not have `vendor_available: true`",
177 to.Name())
178 return
179 }
180 }
Justin Yun8effde42017-06-23 19:24:43 +0900181 if to.vndkdep == nil {
182 return
183 }
Logan Chienf3511742017-10-31 18:04:35 +0800184
Logan Chiend3c59a22018-03-29 14:08:15 +0800185 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100186 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
187 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
188 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800189 return
190 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800191}
Logan Chienf3511742017-10-31 18:04:35 +0800192
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100193func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800194 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
195 if from.isVndkExt() {
196 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100197 if to.isVndk() && !to.isVndkSp() {
198 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
199 }
200 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800201 }
202 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100203 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900204 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800205 if from.isVndk() {
206 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100207 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800208 }
209 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100210 if !to.isVndkSp() {
211 return errors.New("VNDK-SP must only depend on VNDK-SP")
212 }
213 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800214 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100215 if !to.isVndk() {
216 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
217 }
218 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800219 }
220 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100221 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900222}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900223
224var (
Jooyung Hana463f722019-11-01 08:45:59 +0900225 vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires")
226 vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires")
227 llndkLibrariesKey = android.NewOnceKey("llndkLibrarires")
228 vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires")
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900229 vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries")
Jooyung Hana463f722019-11-01 08:45:59 +0900230 vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
231 vndkLibrariesLock sync.Mutex
Inseob Kimae553032019-05-14 18:52:49 +0900232)
Inseob Kim1f086e22019-05-09 13:29:15 +0900233
Jooyung Han0302a842019-10-30 18:43:49 +0900234func vndkCoreLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900235 return config.Once(vndkCoreLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900236 return make(map[string]string)
237 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900238}
239
Jooyung Han0302a842019-10-30 18:43:49 +0900240func vndkSpLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900241 return config.Once(vndkSpLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900242 return make(map[string]string)
243 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900244}
245
Jooyung Han0302a842019-10-30 18:43:49 +0900246func isLlndkLibrary(baseModuleName string, config android.Config) bool {
247 _, ok := llndkLibraries(config)[baseModuleName]
248 return ok
249}
250
251func llndkLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900252 return config.Once(llndkLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900253 return make(map[string]string)
254 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900255}
256
Jooyung Han0302a842019-10-30 18:43:49 +0900257func isVndkPrivateLibrary(baseModuleName string, config android.Config) bool {
258 _, ok := vndkPrivateLibraries(config)[baseModuleName]
259 return ok
260}
261
262func vndkPrivateLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900263 return config.Once(vndkPrivateLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900264 return make(map[string]string)
265 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900266}
267
Jooyung Han0302a842019-10-30 18:43:49 +0900268func vndkUsingCoreVariantLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900269 return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900270 return make(map[string]string)
271 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900272}
273
Jooyung Han097087b2019-10-22 19:32:18 +0900274func vndkMustUseVendorVariantList(cfg android.Config) []string {
275 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900276 return config.VndkMustUseVendorVariantList
277 }).([]string)
278}
279
280// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
281// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
282func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900283 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900284 return mustUseVendorVariantList
285 })
286}
287
Inseob Kim1f086e22019-05-09 13:29:15 +0900288func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
289 lib := m.linker.(*llndkStubDecorator)
Jooyung Han0302a842019-10-30 18:43:49 +0900290 name := m.BaseModuleName()
291 filename := m.BaseModuleName() + ".so"
Inseob Kim9516ee92019-05-09 10:56:13 +0900292
Inseob Kim1f086e22019-05-09 13:29:15 +0900293 vndkLibrariesLock.Lock()
294 defer vndkLibrariesLock.Unlock()
Inseob Kim9516ee92019-05-09 10:56:13 +0900295
Jooyung Han0302a842019-10-30 18:43:49 +0900296 llndkLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900297 if !Bool(lib.Properties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900298 vndkPrivateLibraries(mctx.Config())[name] = filename
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900299 }
Jooyung Han61b66e92020-03-21 14:21:46 +0000300 if mctx.OtherModuleExists(name) {
301 mctx.AddFarVariationDependencies(m.Target().Variations(), llndkImplDep, name)
302 }
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900303}
Inseob Kim1f086e22019-05-09 13:29:15 +0900304
305func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Jooyung Han0302a842019-10-30 18:43:49 +0900306 name := m.BaseModuleName()
307 filename, err := getVndkFileName(m)
308 if err != nil {
309 panic(err)
310 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900311
Jiyong Park2478e4e2020-05-18 09:30:14 +0000312 if m.HasStubsVariants() && name != "libz" {
313 // b/155456180 libz is the ONLY exception here. We don't want to make
314 // libz an LLNDK library because we in general can't guarantee that
315 // libz will behave consistently especially about the compression.
316 // i.e. the compressed output might be different across releases.
317 // As the library is an external one, it's risky to keep the compatibility
318 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900319 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
320 }
321
Inseob Kim1f086e22019-05-09 13:29:15 +0900322 vndkLibrariesLock.Lock()
323 defer vndkLibrariesLock.Unlock()
324
Jooyung Han097087b2019-10-22 19:32:18 +0900325 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
326 m.Properties.MustUseVendorVariant = true
327 }
Jooyung Han0302a842019-10-30 18:43:49 +0900328 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
329 vndkUsingCoreVariantLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900330 }
Jooyung Han0302a842019-10-30 18:43:49 +0900331
Inseob Kim1f086e22019-05-09 13:29:15 +0900332 if m.vndkdep.isVndkSp() {
Jooyung Han0302a842019-10-30 18:43:49 +0900333 vndkSpLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900334 } else {
Jooyung Han0302a842019-10-30 18:43:49 +0900335 vndkCoreLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900336 }
337 if !Bool(m.VendorProperties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900338 vndkPrivateLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900339 }
340}
341
Jooyung Han31c470b2019-10-18 16:26:59 +0900342func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
343 if !m.Enabled() {
344 return false
345 }
346
Jooyung Han87a7f302019-10-29 05:18:21 +0900347 if !mctx.Device() {
348 return false
349 }
350
Jooyung Han31c470b2019-10-18 16:26:59 +0900351 if m.Target().NativeBridge == android.NativeBridgeEnabled {
352 return false
353 }
354
355 // prebuilt vndk modules should match with device
356 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
357 // When b/142675459 is landed, remove following check
358 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.matchesWithDevice(mctx.DeviceConfig()) {
359 return false
360 }
361
362 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900363 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
364 if mctx.DeviceConfig().VndkVersion() == "" {
365 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
366 if mctx.ModuleName() == "libz" {
367 return false
368 }
369 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.isVndkSp()
370 }
371
Justin Yun5f7f7e82019-11-18 19:52:14 +0900372 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900373 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000374 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900375 }
376 return false
377}
378
Inseob Kim1f086e22019-05-09 13:29:15 +0900379// gather list of vndk-core, vndk-sp, and ll-ndk libs
380func VndkMutator(mctx android.BottomUpMutatorContext) {
381 m, ok := mctx.Module().(*Module)
382 if !ok {
383 return
384 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900385 if !m.Enabled() {
386 return
387 }
Justin Yun7390ea32019-09-08 11:34:06 +0900388 if m.Target().NativeBridge == android.NativeBridgeEnabled {
389 // Skip native_bridge modules
390 return
391 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900392
393 if _, ok := m.linker.(*llndkStubDecorator); ok {
394 processLlndkLibrary(mctx, m)
395 return
396 }
397
398 lib, is_lib := m.linker.(*libraryDecorator)
399 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
400
Inseob Kim64c43952019-08-26 16:52:35 +0900401 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
402 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900403 processVndkLibrary(mctx, m)
404 return
405 }
406 }
407}
408
409func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900410 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900411 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900412}
413
Jooyung Han2216fb12019-11-06 16:46:15 +0900414type vndkLibrariesTxt struct {
415 android.ModuleBase
416 outputFile android.OutputPath
417}
418
Jooyung Han39edb6c2019-11-06 16:53:07 +0900419var _ android.PrebuiltEtcModule = &vndkLibrariesTxt{}
420var _ android.OutputFileProducer = &vndkLibrariesTxt{}
421
Jooyung Han2216fb12019-11-06 16:46:15 +0900422// vndk_libraries_txt is a special kind of module type in that it name is one of
423// - llndk.libraries.txt
424// - vndkcore.libraries.txt
425// - vndksp.libraries.txt
426// - vndkprivate.libraries.txt
427// - vndkcorevariant.libraries.txt
428// A module behaves like a prebuilt_etc but its content is generated by soong.
429// By being a soong module, these files can be referenced by other soong modules.
430// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900431func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900432 m := &vndkLibrariesTxt{}
433 android.InitAndroidModule(m)
434 return m
435}
436
437func insertVndkVersion(filename string, vndkVersion string) string {
438 if index := strings.LastIndex(filename, "."); index != -1 {
439 return filename[:index] + "." + vndkVersion + filename[index:]
440 }
441 return filename
442}
443
444func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
445 var list []string
446 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900447 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900448 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
449 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
450 continue
451 }
452 list = append(list, filename)
453 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900454 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900455 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900456 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900457 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900458 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900459 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900460 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900461 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
462 default:
463 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
464 return
465 }
466
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900467 var filename string
468 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
469 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
470 } else {
471 filename = txt.Name()
472 }
473
Jooyung Han2216fb12019-11-06 16:46:15 +0900474 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
475 ctx.Build(pctx, android.BuildParams{
476 Rule: android.WriteFile,
477 Output: txt.outputFile,
478 Description: "Writing " + txt.outputFile.String(),
479 Args: map[string]string{
480 "content": strings.Join(list, "\\n"),
481 },
482 })
483
484 installPath := android.PathForModuleInstall(ctx, "etc")
485 ctx.InstallFile(installPath, filename, txt.outputFile)
486}
487
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900488func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
489 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900490 Class: "ETC",
491 OutputFile: android.OptionalPathForPath(txt.outputFile),
492 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
493 func(entries *android.AndroidMkEntries) {
494 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
495 },
496 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900497 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900498}
499
Jooyung Han39edb6c2019-11-06 16:53:07 +0900500func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
501 return txt.outputFile
502}
503
504func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
505 return android.Paths{txt.outputFile}, nil
506}
507
508func (txt *vndkLibrariesTxt) SubDir() string {
509 return ""
510}
511
Inseob Kim1f086e22019-05-09 13:29:15 +0900512func VndkSnapshotSingleton() android.Singleton {
513 return &vndkSnapshotSingleton{}
514}
515
Jooyung Han0302a842019-10-30 18:43:49 +0900516type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900517 vndkLibrariesFile android.OutputPath
518 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900519}
Inseob Kim1f086e22019-05-09 13:29:15 +0900520
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900521func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
522 if m.Target().NativeBridge == android.NativeBridgeEnabled {
523 return nil, "", false
524 }
525 if !m.inVendor() || !m.installable() || m.isSnapshotPrebuilt() {
526 return nil, "", false
527 }
528 l, ok := m.linker.(snapshotLibraryInterface)
529 if !ok || !l.shared() {
530 return nil, "", false
531 }
532 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
533 if m.isVndkSp() {
534 return l, "vndk-sp", true
535 } else {
536 return l, "vndk-core", true
537 }
538 }
539
540 return nil, "", false
541}
542
Inseob Kim1f086e22019-05-09 13:29:15 +0900543func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900544 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
545 c.buildVndkLibrariesTxtFiles(ctx)
546
Inseob Kim1f086e22019-05-09 13:29:15 +0900547 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
548 if ctx.DeviceConfig().VndkVersion() != "current" {
549 return
550 }
551
552 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
553 return
554 }
555
556 if ctx.DeviceConfig().BoardVndkRuntimeDisable() {
557 return
558 }
559
Inseob Kim242ef0c2019-10-22 20:15:20 +0900560 var snapshotOutputs android.Paths
561
562 /*
563 VNDK snapshot zipped artifacts directory structure:
564 {SNAPSHOT_ARCH}/
565 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
566 shared/
567 vndk-core/
568 (VNDK-core libraries, e.g. libbinder.so)
569 vndk-sp/
570 (VNDK-SP libraries, e.g. libc++.so)
571 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
572 shared/
573 vndk-core/
574 (VNDK-core libraries, e.g. libbinder.so)
575 vndk-sp/
576 (VNDK-SP libraries, e.g. libc++.so)
577 binder32/
578 (This directory is newly introduced in v28 (Android P) to hold
579 prebuilts built for 32-bit binder interface.)
580 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
581 ...
582 configs/
583 (various *.txt configuration files)
584 include/
585 (header files of same directory structure with source tree)
586 NOTICE_FILES/
587 (notice files of libraries, e.g. libcutils.so.txt)
588 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900589
590 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900591 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900592
Inseob Kim242ef0c2019-10-22 20:15:20 +0900593 configsDir := filepath.Join(snapshotArchDir, "configs")
594 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
595 includeDir := filepath.Join(snapshotArchDir, "include")
596
Inseob Kim242ef0c2019-10-22 20:15:20 +0900597 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900598 noticeBuilt := make(map[string]bool)
599
Inseob Kim242ef0c2019-10-22 20:15:20 +0900600 // paths of VNDK modules for GPL license checking
601 modulePaths := make(map[string]string)
602
603 // actual module names of .so files
604 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
605 moduleNames := make(map[string]string)
606
Inseob Kim8471cda2019-11-15 09:59:12 +0900607 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900608
Inseob Kim8471cda2019-11-15 09:59:12 +0900609 installVndkSnapshotLib := func(m *Module, l snapshotLibraryInterface, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900610 var ret android.Paths
611
Inseob Kim8471cda2019-11-15 09:59:12 +0900612 targetArch := "arch-" + m.Target().Arch.ArchType.String()
613 if m.Target().Arch.ArchVariant != "" {
614 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900615 }
Inseob Kimae553032019-05-14 18:52:49 +0900616
Inseob Kim8471cda2019-11-15 09:59:12 +0900617 libPath := m.outputFile.Path()
618 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
619 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
620
Inseob Kimae553032019-05-14 18:52:49 +0900621 if ctx.Config().VndkSnapshotBuildArtifacts() {
622 prop := struct {
623 ExportedDirs []string `json:",omitempty"`
624 ExportedSystemDirs []string `json:",omitempty"`
625 ExportedFlags []string `json:",omitempty"`
626 RelativeInstallPath string `json:",omitempty"`
627 }{}
628 prop.ExportedFlags = l.exportedFlags()
Jiyong Park74955042019-10-22 20:19:51 +0900629 prop.ExportedDirs = l.exportedDirs().Strings()
630 prop.ExportedSystemDirs = l.exportedSystemDirs().Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900631 prop.RelativeInstallPath = m.RelativeInstallPath()
632
Inseob Kim242ef0c2019-10-22 20:15:20 +0900633 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900634
635 j, err := json.Marshal(prop)
636 if err != nil {
637 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900638 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900639 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900640 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900641 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900642 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900643 }
644
Inseob Kim1f086e22019-05-09 13:29:15 +0900645 ctx.VisitAllModules(func(module android.Module) {
646 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900647 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900648 return
649 }
650
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900651 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m)
Inseob Kimae553032019-05-14 18:52:49 +0900652 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200653 return
654 }
655
Inseob Kim8471cda2019-11-15 09:59:12 +0900656 // install .so files for appropriate modules.
657 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Inseob Kim242ef0c2019-10-22 20:15:20 +0900658 libs, ok := installVndkSnapshotLib(m, l, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900659 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900660 return
661 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900662 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900663
Inseob Kim8471cda2019-11-15 09:59:12 +0900664 // These are for generating module_names.txt and module_paths.txt
665 stem := m.outputFile.Path().Base()
666 moduleNames[stem] = ctx.ModuleName(m)
667 modulePaths[stem] = ctx.ModuleDir(m)
668
Bob Badoura75b0572020-02-18 20:21:55 -0800669 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900670 noticeName := stem + ".txt"
671 // skip already copied notice file
672 if _, ok := noticeBuilt[noticeName]; !ok {
673 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800674 snapshotOutputs = append(snapshotOutputs, combineNotices(
675 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900676 }
677 }
678
679 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900680 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900681 }
682 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900683
Inseob Kim8471cda2019-11-15 09:59:12 +0900684 // install all headers after removing duplicates
685 for _, header := range android.FirstUniquePaths(headers) {
686 snapshotOutputs = append(snapshotOutputs, copyFile(
687 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900688 }
689
Jooyung Han39edb6c2019-11-06 16:53:07 +0900690 // install *.libraries.txt except vndkcorevariant.libraries.txt
691 ctx.VisitAllModules(func(module android.Module) {
692 m, ok := module.(*vndkLibrariesTxt)
693 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
694 return
695 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900696 snapshotOutputs = append(snapshotOutputs, copyFile(
697 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900698 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900699
Inseob Kim242ef0c2019-10-22 20:15:20 +0900700 /*
701 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900702
Inseob Kim242ef0c2019-10-22 20:15:20 +0900703 {key1} {value1}
704 {key2} {value2}
705 ...
706 */
707 installMapListFile := func(m map[string]string, path string) android.OutputPath {
708 var txtBuilder strings.Builder
709 for idx, k := range android.SortedStringKeys(m) {
710 if idx > 0 {
711 txtBuilder.WriteString("\\n")
712 }
713 txtBuilder.WriteString(k)
714 txtBuilder.WriteString(" ")
715 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900716 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900717 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900718 }
719
Inseob Kim242ef0c2019-10-22 20:15:20 +0900720 /*
721 module_paths.txt contains paths on which VNDK modules are defined.
722 e.g.,
723 libbase.so system/core/base
724 libc.so bionic/libc
725 ...
726 */
727 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
728
729 /*
730 module_names.txt contains names as which VNDK modules are defined,
731 because output filename and module name can be different with stem and suffix properties.
732
733 e.g.,
734 libcutils.so libcutils
735 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
736 ...
737 */
738 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
739
740 // All artifacts are ready. Sort them to normalize ninja and then zip.
741 sort.Slice(snapshotOutputs, func(i, j int) bool {
742 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
743 })
744
745 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
746 zipRule := android.NewRuleBuilder()
747
Inseob Kim8471cda2019-11-15 09:59:12 +0900748 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900749 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
750 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900751 Text("tr").
752 FlagWithArg("-d ", "\\'").
753 FlagWithRspFileInputList("< ", snapshotOutputs).
754 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900755
756 zipRule.Temporary(snapshotOutputList)
757
758 zipRule.Command().
759 BuiltTool(ctx, "soong_zip").
760 FlagWithOutput("-o ", zipPath).
761 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
762 FlagWithInput("-l ", snapshotOutputList)
763
764 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900765 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900766 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900767}
Jooyung Han097087b2019-10-22 19:32:18 +0900768
Jooyung Han0302a842019-10-30 18:43:49 +0900769func getVndkFileName(m *Module) (string, error) {
770 if library, ok := m.linker.(*libraryDecorator); ok {
771 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
772 }
773 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
774 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
775 }
776 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900777}
778
779func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900780 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900781 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
782 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
783 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900784
Jooyung Han2216fb12019-11-06 16:46:15 +0900785 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900786 // Since each target have different set of libclang_rt.* files,
787 // keep the common set of files in vndk.libraries.txt
788 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900789 filterOutLibClangRt := func(libList []string) (filtered []string) {
790 for _, lib := range libList {
791 if !strings.HasPrefix(lib, "libclang_rt.") {
792 filtered = append(filtered, lib)
793 }
794 }
795 return
796 }
797 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
798 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
799 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
800 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900801 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
802 ctx.Build(pctx, android.BuildParams{
803 Rule: android.WriteFile,
804 Output: c.vndkLibrariesFile,
805 Description: "Writing " + c.vndkLibrariesFile.String(),
806 Args: map[string]string{
807 "content": strings.Join(merged, "\\n"),
808 },
809 })
Jooyung Han0302a842019-10-30 18:43:49 +0900810}
Jooyung Han097087b2019-10-22 19:32:18 +0900811
Jooyung Han0302a842019-10-30 18:43:49 +0900812func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
813 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
814 // they been moved to an apex.
815 movedToApexLlndkLibraries := []string{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900816 for lib := range llndkLibraries(ctx.Config()) {
Jooyung Han0302a842019-10-30 18:43:49 +0900817 // Skip bionic libs, they are handled in different manner
818 if android.DirectlyInAnyApex(&notOnHostContext{}, lib) && !isBionic(lib) {
819 movedToApexLlndkLibraries = append(movedToApexLlndkLibraries, lib)
820 }
821 }
822 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES", strings.Join(movedToApexLlndkLibraries, " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900823
824 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
825 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
826 // Therefore, by removing the library here, we cause it to only be installed if libc
827 // depends on it.
828 installedLlndkLibraries := []string{}
829 for lib := range llndkLibraries(ctx.Config()) {
830 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
831 continue
832 }
833 installedLlndkLibraries = append(installedLlndkLibraries, lib)
834 }
835 sort.Strings(installedLlndkLibraries)
836 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
837
Jooyung Han0302a842019-10-30 18:43:49 +0900838 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
839 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
840 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
841 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
842
Jooyung Han0302a842019-10-30 18:43:49 +0900843 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900844 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900845}