blob: 4adf9d2263281b15eab247148150fd70adbc908b [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"
Justin Yun8effde42017-06-23 19:24:43 +090029)
30
Jooyung Han39edb6c2019-11-06 16:53:07 +090031const (
32 llndkLibrariesTxt = "llndk.libraries.txt"
33 vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
34 vndkSpLibrariesTxt = "vndksp.libraries.txt"
35 vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
36 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
37)
38
39func VndkLibrariesTxtModules(vndkVersion string) []string {
40 if vndkVersion == "current" {
41 return []string{
42 llndkLibrariesTxt,
43 vndkCoreLibrariesTxt,
44 vndkSpLibrariesTxt,
45 vndkPrivateLibrariesTxt,
Jooyung Han39edb6c2019-11-06 16:53:07 +090046 }
47 }
48 // Snapshot vndks have their own *.libraries.VER.txt files.
49 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
50 return []string{
51 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
52 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
53 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
54 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
55 }
56}
57
Justin Yun8effde42017-06-23 19:24:43 +090058type VndkProperties struct {
59 Vndk struct {
60 // declared as a VNDK or VNDK-SP module. The vendor variant
61 // will be installed in /system instead of /vendor partition.
62 //
Roland Levillaindfe75b32019-07-23 16:53:32 +010063 // `vendor_available` must be explicitly set to either true or
Jiyong Park82e2bf32017-08-16 14:05:54 +090064 // false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090065 Enabled *bool
66
67 // declared as a VNDK-SP module, which is a subset of VNDK.
68 //
69 // `vndk: { enabled: true }` must set together.
70 //
71 // All these modules are allowed to link to VNDK-SP or LL-NDK
72 // modules only. Other dependency will cause link-type errors.
73 //
74 // If `support_system_process` is not set or set to false,
75 // the module is VNDK-core and can link to other VNDK-core,
76 // VNDK-SP or LL-NDK modules only.
77 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +080078
79 // Extending another module
80 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +090081 }
82}
83
84type vndkdep struct {
85 Properties VndkProperties
86}
87
88func (vndk *vndkdep) props() []interface{} {
89 return []interface{}{&vndk.Properties}
90}
91
92func (vndk *vndkdep) begin(ctx BaseModuleContext) {}
93
94func (vndk *vndkdep) deps(ctx BaseModuleContext, deps Deps) Deps {
95 return deps
96}
97
98func (vndk *vndkdep) isVndk() bool {
99 return Bool(vndk.Properties.Vndk.Enabled)
100}
101
102func (vndk *vndkdep) isVndkSp() bool {
103 return Bool(vndk.Properties.Vndk.Support_system_process)
104}
105
Logan Chienf3511742017-10-31 18:04:35 +0800106func (vndk *vndkdep) isVndkExt() bool {
107 return vndk.Properties.Vndk.Extends != nil
108}
109
110func (vndk *vndkdep) getVndkExtendsModuleName() string {
111 return String(vndk.Properties.Vndk.Extends)
112}
113
Justin Yun8effde42017-06-23 19:24:43 +0900114func (vndk *vndkdep) typeName() string {
115 if !vndk.isVndk() {
116 return "native:vendor"
117 }
Logan Chienf3511742017-10-31 18:04:35 +0800118 if !vndk.isVndkExt() {
119 if !vndk.isVndkSp() {
120 return "native:vendor:vndk"
121 }
122 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900123 }
Logan Chienf3511742017-10-31 18:04:35 +0800124 if !vndk.isVndkSp() {
125 return "native:vendor:vndkext"
126 }
127 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900128}
129
Ivan Lozano183a3212019-10-18 14:18:45 -0700130func (vndk *vndkdep) vndkCheckLinkType(ctx android.ModuleContext, to *Module, tag DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900131 if to.linker == nil {
132 return
133 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900134 if !vndk.isVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900135 // Non-VNDK modules (those installed to /vendor, /product, or /system/product) can't depend
136 // on modules marked with vendor_available: false.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900137 violation := false
Nan Zhang0007d812017-11-07 10:57:05 -0800138 if lib, ok := to.linker.(*llndkStubDecorator); ok && !Bool(lib.Properties.Vendor_available) {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900139 violation = true
140 } else {
141 if _, ok := to.linker.(libraryInterface); ok && to.VendorProperties.Vendor_available != nil && !Bool(to.VendorProperties.Vendor_available) {
142 // Vendor_available == nil && !Bool(Vendor_available) should be okay since
Justin Yun5f7f7e82019-11-18 19:52:14 +0900143 // it means a vendor-only, or product-only library which is a valid dependency
144 // for non-VNDK modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900145 violation = true
146 }
147 }
148 if violation {
149 ctx.ModuleErrorf("Vendor module that is not VNDK should not link to %q which is marked as `vendor_available: false`", to.Name())
150 }
151 }
Justin Yun8effde42017-06-23 19:24:43 +0900152 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
153 // Check only shared libraries.
154 // Other (static and LL-NDK) libraries are allowed to link.
155 return
156 }
Ivan Lozano52767be2019-10-18 14:49:46 -0700157 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900158 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
159 vndk.typeName(), to.Name())
160 return
161 }
Logan Chienf3511742017-10-31 18:04:35 +0800162 if tag == vndkExtDepTag {
163 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
164 // and has identical vndk properties.
165 if to.vndkdep == nil || !to.vndkdep.isVndk() {
166 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
167 return
168 }
169 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
170 ctx.ModuleErrorf(
171 "`extends` refers a module %q with mismatched support_system_process",
172 to.Name())
173 return
174 }
175 if !Bool(to.VendorProperties.Vendor_available) {
176 ctx.ModuleErrorf(
177 "`extends` refers module %q which does not have `vendor_available: true`",
178 to.Name())
179 return
180 }
181 }
Justin Yun8effde42017-06-23 19:24:43 +0900182 if to.vndkdep == nil {
183 return
184 }
Logan Chienf3511742017-10-31 18:04:35 +0800185
Logan Chiend3c59a22018-03-29 14:08:15 +0800186 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100187 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
188 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
189 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800190 return
191 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800192}
Logan Chienf3511742017-10-31 18:04:35 +0800193
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100194func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800195 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
196 if from.isVndkExt() {
197 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100198 if to.isVndk() && !to.isVndkSp() {
199 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
200 }
201 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800202 }
203 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100204 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900205 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800206 if from.isVndk() {
207 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100208 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800209 }
210 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100211 if !to.isVndkSp() {
212 return errors.New("VNDK-SP must only depend on VNDK-SP")
213 }
214 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800215 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100216 if !to.isVndk() {
217 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
218 }
219 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800220 }
221 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100222 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900223}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900224
225var (
Jooyung Hana463f722019-11-01 08:45:59 +0900226 vndkCoreLibrariesKey = android.NewOnceKey("vndkCoreLibrarires")
227 vndkSpLibrariesKey = android.NewOnceKey("vndkSpLibrarires")
228 llndkLibrariesKey = android.NewOnceKey("llndkLibrarires")
229 vndkPrivateLibrariesKey = android.NewOnceKey("vndkPrivateLibrarires")
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900230 vndkUsingCoreVariantLibrariesKey = android.NewOnceKey("vndkUsingCoreVariantLibraries")
Jooyung Hana463f722019-11-01 08:45:59 +0900231 vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
232 vndkLibrariesLock sync.Mutex
Inseob Kimae553032019-05-14 18:52:49 +0900233)
Inseob Kim1f086e22019-05-09 13:29:15 +0900234
Jooyung Han0302a842019-10-30 18:43:49 +0900235func vndkCoreLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900236 return config.Once(vndkCoreLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900237 return make(map[string]string)
238 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900239}
240
Jooyung Han0302a842019-10-30 18:43:49 +0900241func vndkSpLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900242 return config.Once(vndkSpLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900243 return make(map[string]string)
244 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900245}
246
Jooyung Han0302a842019-10-30 18:43:49 +0900247func isLlndkLibrary(baseModuleName string, config android.Config) bool {
248 _, ok := llndkLibraries(config)[baseModuleName]
249 return ok
250}
251
252func llndkLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900253 return config.Once(llndkLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900254 return make(map[string]string)
255 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900256}
257
Jooyung Han0302a842019-10-30 18:43:49 +0900258func isVndkPrivateLibrary(baseModuleName string, config android.Config) bool {
259 _, ok := vndkPrivateLibraries(config)[baseModuleName]
260 return ok
261}
262
263func vndkPrivateLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900264 return config.Once(vndkPrivateLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900265 return make(map[string]string)
266 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900267}
268
Jooyung Han0302a842019-10-30 18:43:49 +0900269func vndkUsingCoreVariantLibraries(config android.Config) map[string]string {
Inseob Kim9516ee92019-05-09 10:56:13 +0900270 return config.Once(vndkUsingCoreVariantLibrariesKey, func() interface{} {
Jooyung Han0302a842019-10-30 18:43:49 +0900271 return make(map[string]string)
272 }).(map[string]string)
Inseob Kim9516ee92019-05-09 10:56:13 +0900273}
274
Jooyung Han097087b2019-10-22 19:32:18 +0900275func vndkMustUseVendorVariantList(cfg android.Config) []string {
276 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900277 return config.VndkMustUseVendorVariantList
278 }).([]string)
279}
280
281// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
282// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
283func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900284 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900285 return mustUseVendorVariantList
286 })
287}
288
Inseob Kim1f086e22019-05-09 13:29:15 +0900289func processLlndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
290 lib := m.linker.(*llndkStubDecorator)
Jooyung Han0302a842019-10-30 18:43:49 +0900291 name := m.BaseModuleName()
292 filename := m.BaseModuleName() + ".so"
Inseob Kim9516ee92019-05-09 10:56:13 +0900293
Inseob Kim1f086e22019-05-09 13:29:15 +0900294 vndkLibrariesLock.Lock()
295 defer vndkLibrariesLock.Unlock()
Inseob Kim9516ee92019-05-09 10:56:13 +0900296
Jooyung Han0302a842019-10-30 18:43:49 +0900297 llndkLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900298 if !Bool(lib.Properties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900299 vndkPrivateLibraries(mctx.Config())[name] = filename
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900300 }
Jooyung Han61b66e92020-03-21 14:21:46 +0000301 if mctx.OtherModuleExists(name) {
302 mctx.AddFarVariationDependencies(m.Target().Variations(), llndkImplDep, name)
303 }
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900304}
Inseob Kim1f086e22019-05-09 13:29:15 +0900305
306func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Jooyung Han0302a842019-10-30 18:43:49 +0900307 name := m.BaseModuleName()
308 filename, err := getVndkFileName(m)
309 if err != nil {
310 panic(err)
311 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900312
Jiyong Park2478e4e2020-05-18 09:30:14 +0000313 if m.HasStubsVariants() && name != "libz" {
314 // b/155456180 libz is the ONLY exception here. We don't want to make
315 // libz an LLNDK library because we in general can't guarantee that
316 // libz will behave consistently especially about the compression.
317 // i.e. the compressed output might be different across releases.
318 // As the library is an external one, it's risky to keep the compatibility
319 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900320 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
321 }
322
Inseob Kim1f086e22019-05-09 13:29:15 +0900323 vndkLibrariesLock.Lock()
324 defer vndkLibrariesLock.Unlock()
325
Jooyung Han097087b2019-10-22 19:32:18 +0900326 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
327 m.Properties.MustUseVendorVariant = true
328 }
Jooyung Han0302a842019-10-30 18:43:49 +0900329 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
330 vndkUsingCoreVariantLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900331 }
Jooyung Han0302a842019-10-30 18:43:49 +0900332
Inseob Kim1f086e22019-05-09 13:29:15 +0900333 if m.vndkdep.isVndkSp() {
Jooyung Han0302a842019-10-30 18:43:49 +0900334 vndkSpLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900335 } else {
Jooyung Han0302a842019-10-30 18:43:49 +0900336 vndkCoreLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900337 }
338 if !Bool(m.VendorProperties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900339 vndkPrivateLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900340 }
341}
342
Yo Chiangbba545e2020-06-09 16:15:37 +0800343// Sanity check for modules that mustn't be VNDK
344func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900345 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800346 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900347 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800348 if !m.Device() {
349 // Skip non-device modules
350 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900351 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900352 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800353 // Skip native_bridge modules
354 return true
355 }
356 return false
357}
358
359func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
360 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900361 return false
362 }
363
364 // prebuilt vndk modules should match with device
365 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
366 // When b/142675459 is landed, remove following check
367 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.matchesWithDevice(mctx.DeviceConfig()) {
368 return false
369 }
370
371 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900372 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
373 if mctx.DeviceConfig().VndkVersion() == "" {
374 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
375 if mctx.ModuleName() == "libz" {
376 return false
377 }
378 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.isVndkSp()
379 }
380
Justin Yun5f7f7e82019-11-18 19:52:14 +0900381 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900382 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000383 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900384 }
385 return false
386}
387
Inseob Kim1f086e22019-05-09 13:29:15 +0900388// gather list of vndk-core, vndk-sp, and ll-ndk libs
389func VndkMutator(mctx android.BottomUpMutatorContext) {
390 m, ok := mctx.Module().(*Module)
391 if !ok {
392 return
393 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800394
395 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900396 return
397 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900398
399 if _, ok := m.linker.(*llndkStubDecorator); ok {
400 processLlndkLibrary(mctx, m)
401 return
402 }
403
404 lib, is_lib := m.linker.(*libraryDecorator)
405 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
406
Inseob Kim64c43952019-08-26 16:52:35 +0900407 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
408 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900409 processVndkLibrary(mctx, m)
410 return
411 }
412 }
413}
414
415func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900416 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900417 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900418}
419
Jooyung Han2216fb12019-11-06 16:46:15 +0900420type vndkLibrariesTxt struct {
421 android.ModuleBase
422 outputFile android.OutputPath
423}
424
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700425var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900426var _ android.OutputFileProducer = &vndkLibrariesTxt{}
427
Jooyung Han2216fb12019-11-06 16:46:15 +0900428// vndk_libraries_txt is a special kind of module type in that it name is one of
429// - llndk.libraries.txt
430// - vndkcore.libraries.txt
431// - vndksp.libraries.txt
432// - vndkprivate.libraries.txt
433// - vndkcorevariant.libraries.txt
434// A module behaves like a prebuilt_etc but its content is generated by soong.
435// By being a soong module, these files can be referenced by other soong modules.
436// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900437func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900438 m := &vndkLibrariesTxt{}
439 android.InitAndroidModule(m)
440 return m
441}
442
443func insertVndkVersion(filename string, vndkVersion string) string {
444 if index := strings.LastIndex(filename, "."); index != -1 {
445 return filename[:index] + "." + vndkVersion + filename[index:]
446 }
447 return filename
448}
449
450func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
451 var list []string
452 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900453 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900454 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
455 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
456 continue
457 }
458 list = append(list, filename)
459 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900460 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900461 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900462 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900463 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900464 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900465 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900466 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900467 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
468 default:
469 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
470 return
471 }
472
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900473 var filename string
474 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
475 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
476 } else {
477 filename = txt.Name()
478 }
479
Jooyung Han2216fb12019-11-06 16:46:15 +0900480 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
481 ctx.Build(pctx, android.BuildParams{
482 Rule: android.WriteFile,
483 Output: txt.outputFile,
484 Description: "Writing " + txt.outputFile.String(),
485 Args: map[string]string{
486 "content": strings.Join(list, "\\n"),
487 },
488 })
489
490 installPath := android.PathForModuleInstall(ctx, "etc")
491 ctx.InstallFile(installPath, filename, txt.outputFile)
492}
493
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900494func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
495 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900496 Class: "ETC",
497 OutputFile: android.OptionalPathForPath(txt.outputFile),
498 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
499 func(entries *android.AndroidMkEntries) {
500 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
501 },
502 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900503 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900504}
505
Jooyung Han39edb6c2019-11-06 16:53:07 +0900506func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
507 return txt.outputFile
508}
509
510func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
511 return android.Paths{txt.outputFile}, nil
512}
513
514func (txt *vndkLibrariesTxt) SubDir() string {
515 return ""
516}
517
Inseob Kim1f086e22019-05-09 13:29:15 +0900518func VndkSnapshotSingleton() android.Singleton {
519 return &vndkSnapshotSingleton{}
520}
521
Jooyung Han0302a842019-10-30 18:43:49 +0900522type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900523 vndkLibrariesFile android.OutputPath
524 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900525}
Inseob Kim1f086e22019-05-09 13:29:15 +0900526
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900527func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
528 if m.Target().NativeBridge == android.NativeBridgeEnabled {
529 return nil, "", false
530 }
531 if !m.inVendor() || !m.installable() || m.isSnapshotPrebuilt() {
532 return nil, "", false
533 }
534 l, ok := m.linker.(snapshotLibraryInterface)
535 if !ok || !l.shared() {
536 return nil, "", false
537 }
538 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
539 if m.isVndkSp() {
540 return l, "vndk-sp", true
541 } else {
542 return l, "vndk-core", true
543 }
544 }
545
546 return nil, "", false
547}
548
Inseob Kim1f086e22019-05-09 13:29:15 +0900549func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900550 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
551 c.buildVndkLibrariesTxtFiles(ctx)
552
Inseob Kim1f086e22019-05-09 13:29:15 +0900553 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
554 if ctx.DeviceConfig().VndkVersion() != "current" {
555 return
556 }
557
558 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
559 return
560 }
561
562 if ctx.DeviceConfig().BoardVndkRuntimeDisable() {
563 return
564 }
565
Inseob Kim242ef0c2019-10-22 20:15:20 +0900566 var snapshotOutputs android.Paths
567
568 /*
569 VNDK snapshot zipped artifacts directory structure:
570 {SNAPSHOT_ARCH}/
571 arch-{TARGET_ARCH}-{TARGET_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 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
578 shared/
579 vndk-core/
580 (VNDK-core libraries, e.g. libbinder.so)
581 vndk-sp/
582 (VNDK-SP libraries, e.g. libc++.so)
583 binder32/
584 (This directory is newly introduced in v28 (Android P) to hold
585 prebuilts built for 32-bit binder interface.)
586 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
587 ...
588 configs/
589 (various *.txt configuration files)
590 include/
591 (header files of same directory structure with source tree)
592 NOTICE_FILES/
593 (notice files of libraries, e.g. libcutils.so.txt)
594 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900595
596 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900597 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900598
Inseob Kim242ef0c2019-10-22 20:15:20 +0900599 configsDir := filepath.Join(snapshotArchDir, "configs")
600 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
601 includeDir := filepath.Join(snapshotArchDir, "include")
602
Inseob Kim242ef0c2019-10-22 20:15:20 +0900603 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900604 noticeBuilt := make(map[string]bool)
605
Inseob Kim242ef0c2019-10-22 20:15:20 +0900606 // paths of VNDK modules for GPL license checking
607 modulePaths := make(map[string]string)
608
609 // actual module names of .so files
610 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
611 moduleNames := make(map[string]string)
612
Inseob Kim8471cda2019-11-15 09:59:12 +0900613 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900614
Inseob Kim8471cda2019-11-15 09:59:12 +0900615 installVndkSnapshotLib := func(m *Module, l snapshotLibraryInterface, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900616 var ret android.Paths
617
Inseob Kim8471cda2019-11-15 09:59:12 +0900618 targetArch := "arch-" + m.Target().Arch.ArchType.String()
619 if m.Target().Arch.ArchVariant != "" {
620 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900621 }
Inseob Kimae553032019-05-14 18:52:49 +0900622
Inseob Kim8471cda2019-11-15 09:59:12 +0900623 libPath := m.outputFile.Path()
624 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
625 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
626
Inseob Kimae553032019-05-14 18:52:49 +0900627 if ctx.Config().VndkSnapshotBuildArtifacts() {
628 prop := struct {
629 ExportedDirs []string `json:",omitempty"`
630 ExportedSystemDirs []string `json:",omitempty"`
631 ExportedFlags []string `json:",omitempty"`
632 RelativeInstallPath string `json:",omitempty"`
633 }{}
634 prop.ExportedFlags = l.exportedFlags()
Jiyong Park74955042019-10-22 20:19:51 +0900635 prop.ExportedDirs = l.exportedDirs().Strings()
636 prop.ExportedSystemDirs = l.exportedSystemDirs().Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900637 prop.RelativeInstallPath = m.RelativeInstallPath()
638
Inseob Kim242ef0c2019-10-22 20:15:20 +0900639 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900640
641 j, err := json.Marshal(prop)
642 if err != nil {
643 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900644 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900645 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900646 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900647 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900648 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900649 }
650
Inseob Kim1f086e22019-05-09 13:29:15 +0900651 ctx.VisitAllModules(func(module android.Module) {
652 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900653 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900654 return
655 }
656
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900657 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m)
Inseob Kimae553032019-05-14 18:52:49 +0900658 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200659 return
660 }
661
Inseob Kim8471cda2019-11-15 09:59:12 +0900662 // install .so files for appropriate modules.
663 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Inseob Kim242ef0c2019-10-22 20:15:20 +0900664 libs, ok := installVndkSnapshotLib(m, l, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900665 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900666 return
667 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900668 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900669
Inseob Kim8471cda2019-11-15 09:59:12 +0900670 // These are for generating module_names.txt and module_paths.txt
671 stem := m.outputFile.Path().Base()
672 moduleNames[stem] = ctx.ModuleName(m)
673 modulePaths[stem] = ctx.ModuleDir(m)
674
Bob Badoura75b0572020-02-18 20:21:55 -0800675 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900676 noticeName := stem + ".txt"
677 // skip already copied notice file
678 if _, ok := noticeBuilt[noticeName]; !ok {
679 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800680 snapshotOutputs = append(snapshotOutputs, combineNotices(
681 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900682 }
683 }
684
685 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900686 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900687 }
688 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900689
Inseob Kim8471cda2019-11-15 09:59:12 +0900690 // install all headers after removing duplicates
691 for _, header := range android.FirstUniquePaths(headers) {
692 snapshotOutputs = append(snapshotOutputs, copyFile(
693 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900694 }
695
Jooyung Han39edb6c2019-11-06 16:53:07 +0900696 // install *.libraries.txt except vndkcorevariant.libraries.txt
697 ctx.VisitAllModules(func(module android.Module) {
698 m, ok := module.(*vndkLibrariesTxt)
699 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
700 return
701 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900702 snapshotOutputs = append(snapshotOutputs, copyFile(
703 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900704 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900705
Inseob Kim242ef0c2019-10-22 20:15:20 +0900706 /*
707 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900708
Inseob Kim242ef0c2019-10-22 20:15:20 +0900709 {key1} {value1}
710 {key2} {value2}
711 ...
712 */
713 installMapListFile := func(m map[string]string, path string) android.OutputPath {
714 var txtBuilder strings.Builder
715 for idx, k := range android.SortedStringKeys(m) {
716 if idx > 0 {
717 txtBuilder.WriteString("\\n")
718 }
719 txtBuilder.WriteString(k)
720 txtBuilder.WriteString(" ")
721 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900722 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900723 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900724 }
725
Inseob Kim242ef0c2019-10-22 20:15:20 +0900726 /*
727 module_paths.txt contains paths on which VNDK modules are defined.
728 e.g.,
729 libbase.so system/core/base
730 libc.so bionic/libc
731 ...
732 */
733 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
734
735 /*
736 module_names.txt contains names as which VNDK modules are defined,
737 because output filename and module name can be different with stem and suffix properties.
738
739 e.g.,
740 libcutils.so libcutils
741 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
742 ...
743 */
744 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
745
746 // All artifacts are ready. Sort them to normalize ninja and then zip.
747 sort.Slice(snapshotOutputs, func(i, j int) bool {
748 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
749 })
750
751 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
752 zipRule := android.NewRuleBuilder()
753
Inseob Kim8471cda2019-11-15 09:59:12 +0900754 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900755 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
756 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900757 Text("tr").
758 FlagWithArg("-d ", "\\'").
759 FlagWithRspFileInputList("< ", snapshotOutputs).
760 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900761
762 zipRule.Temporary(snapshotOutputList)
763
764 zipRule.Command().
765 BuiltTool(ctx, "soong_zip").
766 FlagWithOutput("-o ", zipPath).
767 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
768 FlagWithInput("-l ", snapshotOutputList)
769
770 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900771 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900772 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900773}
Jooyung Han097087b2019-10-22 19:32:18 +0900774
Jooyung Han0302a842019-10-30 18:43:49 +0900775func getVndkFileName(m *Module) (string, error) {
776 if library, ok := m.linker.(*libraryDecorator); ok {
777 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
778 }
779 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
780 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
781 }
782 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900783}
784
785func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900786 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900787 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
788 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
789 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900790
Jooyung Han2216fb12019-11-06 16:46:15 +0900791 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900792 // Since each target have different set of libclang_rt.* files,
793 // keep the common set of files in vndk.libraries.txt
794 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900795 filterOutLibClangRt := func(libList []string) (filtered []string) {
796 for _, lib := range libList {
797 if !strings.HasPrefix(lib, "libclang_rt.") {
798 filtered = append(filtered, lib)
799 }
800 }
801 return
802 }
803 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
804 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
805 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
806 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900807 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
808 ctx.Build(pctx, android.BuildParams{
809 Rule: android.WriteFile,
810 Output: c.vndkLibrariesFile,
811 Description: "Writing " + c.vndkLibrariesFile.String(),
812 Args: map[string]string{
813 "content": strings.Join(merged, "\\n"),
814 },
815 })
Jooyung Han0302a842019-10-30 18:43:49 +0900816}
Jooyung Han097087b2019-10-22 19:32:18 +0900817
Jooyung Han0302a842019-10-30 18:43:49 +0900818func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
819 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
820 // they been moved to an apex.
821 movedToApexLlndkLibraries := []string{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900822 for lib := range llndkLibraries(ctx.Config()) {
Jooyung Han0302a842019-10-30 18:43:49 +0900823 // Skip bionic libs, they are handled in different manner
824 if android.DirectlyInAnyApex(&notOnHostContext{}, lib) && !isBionic(lib) {
825 movedToApexLlndkLibraries = append(movedToApexLlndkLibraries, lib)
826 }
827 }
828 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES", strings.Join(movedToApexLlndkLibraries, " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900829
830 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
831 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
832 // Therefore, by removing the library here, we cause it to only be installed if libc
833 // depends on it.
834 installedLlndkLibraries := []string{}
835 for lib := range llndkLibraries(ctx.Config()) {
836 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
837 continue
838 }
839 installedLlndkLibraries = append(installedLlndkLibraries, lib)
840 }
841 sort.Strings(installedLlndkLibraries)
842 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
843
Jooyung Han0302a842019-10-30 18:43:49 +0900844 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
845 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
846 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
847 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
848
Jooyung Han0302a842019-10-30 18:43:49 +0900849 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900850 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900851}