blob: 1244b13c70960bd000b7477dcb0acb35f7b2d7f2 [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
312 vndkLibrariesLock.Lock()
313 defer vndkLibrariesLock.Unlock()
314
Jooyung Han097087b2019-10-22 19:32:18 +0900315 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
316 m.Properties.MustUseVendorVariant = true
317 }
Jooyung Han0302a842019-10-30 18:43:49 +0900318 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
319 vndkUsingCoreVariantLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900320 }
Jooyung Han0302a842019-10-30 18:43:49 +0900321
Inseob Kim1f086e22019-05-09 13:29:15 +0900322 if m.vndkdep.isVndkSp() {
Jooyung Han0302a842019-10-30 18:43:49 +0900323 vndkSpLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900324 } else {
Jooyung Han0302a842019-10-30 18:43:49 +0900325 vndkCoreLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900326 }
327 if !Bool(m.VendorProperties.Vendor_available) {
Jooyung Han0302a842019-10-30 18:43:49 +0900328 vndkPrivateLibraries(mctx.Config())[name] = filename
Inseob Kim1f086e22019-05-09 13:29:15 +0900329 }
330}
331
Jooyung Han31c470b2019-10-18 16:26:59 +0900332func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
333 if !m.Enabled() {
334 return false
335 }
336
Jooyung Han87a7f302019-10-29 05:18:21 +0900337 if !mctx.Device() {
338 return false
339 }
340
Jooyung Han31c470b2019-10-18 16:26:59 +0900341 if m.Target().NativeBridge == android.NativeBridgeEnabled {
342 return false
343 }
344
345 // prebuilt vndk modules should match with device
346 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
347 // When b/142675459 is landed, remove following check
348 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.matchesWithDevice(mctx.DeviceConfig()) {
349 return false
350 }
351
352 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900353 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
354 if mctx.DeviceConfig().VndkVersion() == "" {
355 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
356 if mctx.ModuleName() == "libz" {
357 return false
358 }
359 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.isVndkSp()
360 }
361
Justin Yun5f7f7e82019-11-18 19:52:14 +0900362 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900363 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000364 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900365 }
366 return false
367}
368
Inseob Kim1f086e22019-05-09 13:29:15 +0900369// gather list of vndk-core, vndk-sp, and ll-ndk libs
370func VndkMutator(mctx android.BottomUpMutatorContext) {
371 m, ok := mctx.Module().(*Module)
372 if !ok {
373 return
374 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900375 if !m.Enabled() {
376 return
377 }
Justin Yun7390ea32019-09-08 11:34:06 +0900378 if m.Target().NativeBridge == android.NativeBridgeEnabled {
379 // Skip native_bridge modules
380 return
381 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900382
383 if _, ok := m.linker.(*llndkStubDecorator); ok {
384 processLlndkLibrary(mctx, m)
385 return
386 }
387
388 lib, is_lib := m.linker.(*libraryDecorator)
389 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
390
Inseob Kim64c43952019-08-26 16:52:35 +0900391 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
392 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900393 processVndkLibrary(mctx, m)
394 return
395 }
396 }
397}
398
399func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900400 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900401 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900402}
403
Jooyung Han2216fb12019-11-06 16:46:15 +0900404type vndkLibrariesTxt struct {
405 android.ModuleBase
406 outputFile android.OutputPath
407}
408
Jooyung Han39edb6c2019-11-06 16:53:07 +0900409var _ android.PrebuiltEtcModule = &vndkLibrariesTxt{}
410var _ android.OutputFileProducer = &vndkLibrariesTxt{}
411
Jooyung Han2216fb12019-11-06 16:46:15 +0900412// vndk_libraries_txt is a special kind of module type in that it name is one of
413// - llndk.libraries.txt
414// - vndkcore.libraries.txt
415// - vndksp.libraries.txt
416// - vndkprivate.libraries.txt
417// - vndkcorevariant.libraries.txt
418// A module behaves like a prebuilt_etc but its content is generated by soong.
419// By being a soong module, these files can be referenced by other soong modules.
420// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900421func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900422 m := &vndkLibrariesTxt{}
423 android.InitAndroidModule(m)
424 return m
425}
426
427func insertVndkVersion(filename string, vndkVersion string) string {
428 if index := strings.LastIndex(filename, "."); index != -1 {
429 return filename[:index] + "." + vndkVersion + filename[index:]
430 }
431 return filename
432}
433
434func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
435 var list []string
436 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900437 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900438 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
439 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
440 continue
441 }
442 list = append(list, filename)
443 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900444 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900445 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900446 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900447 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900448 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900449 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900450 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900451 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
452 default:
453 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
454 return
455 }
456
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900457 var filename string
458 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
459 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
460 } else {
461 filename = txt.Name()
462 }
463
Jooyung Han2216fb12019-11-06 16:46:15 +0900464 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
465 ctx.Build(pctx, android.BuildParams{
466 Rule: android.WriteFile,
467 Output: txt.outputFile,
468 Description: "Writing " + txt.outputFile.String(),
469 Args: map[string]string{
470 "content": strings.Join(list, "\\n"),
471 },
472 })
473
474 installPath := android.PathForModuleInstall(ctx, "etc")
475 ctx.InstallFile(installPath, filename, txt.outputFile)
476}
477
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900478func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
479 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900480 Class: "ETC",
481 OutputFile: android.OptionalPathForPath(txt.outputFile),
482 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
483 func(entries *android.AndroidMkEntries) {
484 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
485 },
486 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900487 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900488}
489
Jooyung Han39edb6c2019-11-06 16:53:07 +0900490func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
491 return txt.outputFile
492}
493
494func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
495 return android.Paths{txt.outputFile}, nil
496}
497
498func (txt *vndkLibrariesTxt) SubDir() string {
499 return ""
500}
501
Inseob Kim1f086e22019-05-09 13:29:15 +0900502func VndkSnapshotSingleton() android.Singleton {
503 return &vndkSnapshotSingleton{}
504}
505
Jooyung Han0302a842019-10-30 18:43:49 +0900506type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900507 vndkLibrariesFile android.OutputPath
508 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900509}
Inseob Kim1f086e22019-05-09 13:29:15 +0900510
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900511func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
512 if m.Target().NativeBridge == android.NativeBridgeEnabled {
513 return nil, "", false
514 }
515 if !m.inVendor() || !m.installable() || m.isSnapshotPrebuilt() {
516 return nil, "", false
517 }
518 l, ok := m.linker.(snapshotLibraryInterface)
519 if !ok || !l.shared() {
520 return nil, "", false
521 }
522 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
523 if m.isVndkSp() {
524 return l, "vndk-sp", true
525 } else {
526 return l, "vndk-core", true
527 }
528 }
529
530 return nil, "", false
531}
532
Inseob Kim1f086e22019-05-09 13:29:15 +0900533func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900534 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
535 c.buildVndkLibrariesTxtFiles(ctx)
536
Inseob Kim1f086e22019-05-09 13:29:15 +0900537 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
538 if ctx.DeviceConfig().VndkVersion() != "current" {
539 return
540 }
541
542 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
543 return
544 }
545
546 if ctx.DeviceConfig().BoardVndkRuntimeDisable() {
547 return
548 }
549
Inseob Kim242ef0c2019-10-22 20:15:20 +0900550 var snapshotOutputs android.Paths
551
552 /*
553 VNDK snapshot zipped artifacts directory structure:
554 {SNAPSHOT_ARCH}/
555 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
556 shared/
557 vndk-core/
558 (VNDK-core libraries, e.g. libbinder.so)
559 vndk-sp/
560 (VNDK-SP libraries, e.g. libc++.so)
561 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
562 shared/
563 vndk-core/
564 (VNDK-core libraries, e.g. libbinder.so)
565 vndk-sp/
566 (VNDK-SP libraries, e.g. libc++.so)
567 binder32/
568 (This directory is newly introduced in v28 (Android P) to hold
569 prebuilts built for 32-bit binder interface.)
570 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
571 ...
572 configs/
573 (various *.txt configuration files)
574 include/
575 (header files of same directory structure with source tree)
576 NOTICE_FILES/
577 (notice files of libraries, e.g. libcutils.so.txt)
578 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900579
580 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900581 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900582
Inseob Kim242ef0c2019-10-22 20:15:20 +0900583 configsDir := filepath.Join(snapshotArchDir, "configs")
584 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
585 includeDir := filepath.Join(snapshotArchDir, "include")
586
Inseob Kim242ef0c2019-10-22 20:15:20 +0900587 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900588 noticeBuilt := make(map[string]bool)
589
Inseob Kim242ef0c2019-10-22 20:15:20 +0900590 // paths of VNDK modules for GPL license checking
591 modulePaths := make(map[string]string)
592
593 // actual module names of .so files
594 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
595 moduleNames := make(map[string]string)
596
Inseob Kim8471cda2019-11-15 09:59:12 +0900597 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900598
Inseob Kim8471cda2019-11-15 09:59:12 +0900599 installVndkSnapshotLib := func(m *Module, l snapshotLibraryInterface, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900600 var ret android.Paths
601
Inseob Kim8471cda2019-11-15 09:59:12 +0900602 targetArch := "arch-" + m.Target().Arch.ArchType.String()
603 if m.Target().Arch.ArchVariant != "" {
604 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900605 }
Inseob Kimae553032019-05-14 18:52:49 +0900606
Inseob Kim8471cda2019-11-15 09:59:12 +0900607 libPath := m.outputFile.Path()
608 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
609 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
610
Inseob Kimae553032019-05-14 18:52:49 +0900611 if ctx.Config().VndkSnapshotBuildArtifacts() {
612 prop := struct {
613 ExportedDirs []string `json:",omitempty"`
614 ExportedSystemDirs []string `json:",omitempty"`
615 ExportedFlags []string `json:",omitempty"`
616 RelativeInstallPath string `json:",omitempty"`
617 }{}
618 prop.ExportedFlags = l.exportedFlags()
Jiyong Park74955042019-10-22 20:19:51 +0900619 prop.ExportedDirs = l.exportedDirs().Strings()
620 prop.ExportedSystemDirs = l.exportedSystemDirs().Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900621 prop.RelativeInstallPath = m.RelativeInstallPath()
622
Inseob Kim242ef0c2019-10-22 20:15:20 +0900623 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900624
625 j, err := json.Marshal(prop)
626 if err != nil {
627 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900628 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900629 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900630 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900631 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900632 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900633 }
634
Inseob Kim1f086e22019-05-09 13:29:15 +0900635 ctx.VisitAllModules(func(module android.Module) {
636 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900637 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900638 return
639 }
640
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900641 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m)
Inseob Kimae553032019-05-14 18:52:49 +0900642 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200643 return
644 }
645
Inseob Kim8471cda2019-11-15 09:59:12 +0900646 // install .so files for appropriate modules.
647 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Inseob Kim242ef0c2019-10-22 20:15:20 +0900648 libs, ok := installVndkSnapshotLib(m, l, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900649 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900650 return
651 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900652 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900653
Inseob Kim8471cda2019-11-15 09:59:12 +0900654 // These are for generating module_names.txt and module_paths.txt
655 stem := m.outputFile.Path().Base()
656 moduleNames[stem] = ctx.ModuleName(m)
657 modulePaths[stem] = ctx.ModuleDir(m)
658
Bob Badoura75b0572020-02-18 20:21:55 -0800659 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900660 noticeName := stem + ".txt"
661 // skip already copied notice file
662 if _, ok := noticeBuilt[noticeName]; !ok {
663 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800664 snapshotOutputs = append(snapshotOutputs, combineNotices(
665 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900666 }
667 }
668
669 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900670 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900671 }
672 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900673
Inseob Kim8471cda2019-11-15 09:59:12 +0900674 // install all headers after removing duplicates
675 for _, header := range android.FirstUniquePaths(headers) {
676 snapshotOutputs = append(snapshotOutputs, copyFile(
677 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900678 }
679
Jooyung Han39edb6c2019-11-06 16:53:07 +0900680 // install *.libraries.txt except vndkcorevariant.libraries.txt
681 ctx.VisitAllModules(func(module android.Module) {
682 m, ok := module.(*vndkLibrariesTxt)
683 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
684 return
685 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900686 snapshotOutputs = append(snapshotOutputs, copyFile(
687 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900688 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900689
Inseob Kim242ef0c2019-10-22 20:15:20 +0900690 /*
691 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900692
Inseob Kim242ef0c2019-10-22 20:15:20 +0900693 {key1} {value1}
694 {key2} {value2}
695 ...
696 */
697 installMapListFile := func(m map[string]string, path string) android.OutputPath {
698 var txtBuilder strings.Builder
699 for idx, k := range android.SortedStringKeys(m) {
700 if idx > 0 {
701 txtBuilder.WriteString("\\n")
702 }
703 txtBuilder.WriteString(k)
704 txtBuilder.WriteString(" ")
705 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900706 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900707 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900708 }
709
Inseob Kim242ef0c2019-10-22 20:15:20 +0900710 /*
711 module_paths.txt contains paths on which VNDK modules are defined.
712 e.g.,
713 libbase.so system/core/base
714 libc.so bionic/libc
715 ...
716 */
717 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
718
719 /*
720 module_names.txt contains names as which VNDK modules are defined,
721 because output filename and module name can be different with stem and suffix properties.
722
723 e.g.,
724 libcutils.so libcutils
725 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
726 ...
727 */
728 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
729
730 // All artifacts are ready. Sort them to normalize ninja and then zip.
731 sort.Slice(snapshotOutputs, func(i, j int) bool {
732 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
733 })
734
735 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
736 zipRule := android.NewRuleBuilder()
737
Inseob Kim8471cda2019-11-15 09:59:12 +0900738 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900739 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
740 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900741 Text("tr").
742 FlagWithArg("-d ", "\\'").
743 FlagWithRspFileInputList("< ", snapshotOutputs).
744 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900745
746 zipRule.Temporary(snapshotOutputList)
747
748 zipRule.Command().
749 BuiltTool(ctx, "soong_zip").
750 FlagWithOutput("-o ", zipPath).
751 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
752 FlagWithInput("-l ", snapshotOutputList)
753
754 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900755 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900756 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900757}
Jooyung Han097087b2019-10-22 19:32:18 +0900758
Jooyung Han0302a842019-10-30 18:43:49 +0900759func getVndkFileName(m *Module) (string, error) {
760 if library, ok := m.linker.(*libraryDecorator); ok {
761 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
762 }
763 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
764 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
765 }
766 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900767}
768
769func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900770 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900771 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
772 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
773 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900774
Jooyung Han2216fb12019-11-06 16:46:15 +0900775 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900776 // Since each target have different set of libclang_rt.* files,
777 // keep the common set of files in vndk.libraries.txt
778 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900779 filterOutLibClangRt := func(libList []string) (filtered []string) {
780 for _, lib := range libList {
781 if !strings.HasPrefix(lib, "libclang_rt.") {
782 filtered = append(filtered, lib)
783 }
784 }
785 return
786 }
787 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
788 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
789 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
790 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900791 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
792 ctx.Build(pctx, android.BuildParams{
793 Rule: android.WriteFile,
794 Output: c.vndkLibrariesFile,
795 Description: "Writing " + c.vndkLibrariesFile.String(),
796 Args: map[string]string{
797 "content": strings.Join(merged, "\\n"),
798 },
799 })
Jooyung Han0302a842019-10-30 18:43:49 +0900800}
Jooyung Han097087b2019-10-22 19:32:18 +0900801
Jooyung Han0302a842019-10-30 18:43:49 +0900802func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
803 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
804 // they been moved to an apex.
805 movedToApexLlndkLibraries := []string{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900806 for lib := range llndkLibraries(ctx.Config()) {
Jooyung Han0302a842019-10-30 18:43:49 +0900807 // Skip bionic libs, they are handled in different manner
808 if android.DirectlyInAnyApex(&notOnHostContext{}, lib) && !isBionic(lib) {
809 movedToApexLlndkLibraries = append(movedToApexLlndkLibraries, lib)
810 }
811 }
812 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES", strings.Join(movedToApexLlndkLibraries, " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900813
814 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
815 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
816 // Therefore, by removing the library here, we cause it to only be installed if libc
817 // depends on it.
818 installedLlndkLibraries := []string{}
819 for lib := range llndkLibraries(ctx.Config()) {
820 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
821 continue
822 }
823 installedLlndkLibraries = append(installedLlndkLibraries, lib)
824 }
825 sort.Strings(installedLlndkLibraries)
826 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
827
Jooyung Han0302a842019-10-30 18:43:49 +0900828 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
829 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
830 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
831 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
832
Jooyung Han0302a842019-10-30 18:43:49 +0900833 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900834 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900835}