blob: 4888dcf07ec6677b11048b983a98ac846381dceb [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 {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900353 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900354 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Jooyung Hana57af4a2020-01-23 05:36:59 +0000355 return lib.shared() && m.inVendor() && m.IsVndk() && !m.isVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900356 }
357 return false
358}
359
Inseob Kim1f086e22019-05-09 13:29:15 +0900360// gather list of vndk-core, vndk-sp, and ll-ndk libs
361func VndkMutator(mctx android.BottomUpMutatorContext) {
362 m, ok := mctx.Module().(*Module)
363 if !ok {
364 return
365 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900366 if !m.Enabled() {
367 return
368 }
Justin Yun7390ea32019-09-08 11:34:06 +0900369 if m.Target().NativeBridge == android.NativeBridgeEnabled {
370 // Skip native_bridge modules
371 return
372 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900373
374 if _, ok := m.linker.(*llndkStubDecorator); ok {
375 processLlndkLibrary(mctx, m)
376 return
377 }
378
379 lib, is_lib := m.linker.(*libraryDecorator)
380 prebuilt_lib, is_prebuilt_lib := m.linker.(*prebuiltLibraryLinker)
381
Inseob Kim64c43952019-08-26 16:52:35 +0900382 if (is_lib && lib.buildShared()) || (is_prebuilt_lib && prebuilt_lib.buildShared()) {
383 if m.vndkdep != nil && m.vndkdep.isVndk() && !m.vndkdep.isVndkExt() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900384 processVndkLibrary(mctx, m)
385 return
386 }
387 }
388}
389
390func init() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900391 android.RegisterModuleType("vndk_libraries_txt", VndkLibrariesTxtFactory)
Inseob Kim1f086e22019-05-09 13:29:15 +0900392 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900393}
394
Jooyung Han2216fb12019-11-06 16:46:15 +0900395type vndkLibrariesTxt struct {
396 android.ModuleBase
397 outputFile android.OutputPath
398}
399
Jooyung Han39edb6c2019-11-06 16:53:07 +0900400var _ android.PrebuiltEtcModule = &vndkLibrariesTxt{}
401var _ android.OutputFileProducer = &vndkLibrariesTxt{}
402
Jooyung Han2216fb12019-11-06 16:46:15 +0900403// vndk_libraries_txt is a special kind of module type in that it name is one of
404// - llndk.libraries.txt
405// - vndkcore.libraries.txt
406// - vndksp.libraries.txt
407// - vndkprivate.libraries.txt
408// - vndkcorevariant.libraries.txt
409// A module behaves like a prebuilt_etc but its content is generated by soong.
410// By being a soong module, these files can be referenced by other soong modules.
411// For example, apex_vndk can depend on these files as prebuilt.
Jooyung Han39edb6c2019-11-06 16:53:07 +0900412func VndkLibrariesTxtFactory() android.Module {
Jooyung Han2216fb12019-11-06 16:46:15 +0900413 m := &vndkLibrariesTxt{}
414 android.InitAndroidModule(m)
415 return m
416}
417
418func insertVndkVersion(filename string, vndkVersion string) string {
419 if index := strings.LastIndex(filename, "."); index != -1 {
420 return filename[:index] + "." + vndkVersion + filename[index:]
421 }
422 return filename
423}
424
425func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
426 var list []string
427 switch txt.Name() {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900428 case llndkLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900429 for _, filename := range android.SortedStringMapValues(llndkLibraries(ctx.Config())) {
430 if strings.HasPrefix(filename, "libclang_rt.hwasan-") {
431 continue
432 }
433 list = append(list, filename)
434 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900435 case vndkCoreLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900436 list = android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900437 case vndkSpLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900438 list = android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900439 case vndkPrivateLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900440 list = android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900441 case vndkUsingCoreVariantLibrariesTxt:
Jooyung Han2216fb12019-11-06 16:46:15 +0900442 list = android.SortedStringMapValues(vndkUsingCoreVariantLibraries(ctx.Config()))
443 default:
444 ctx.ModuleErrorf("name(%s) is unknown.", txt.Name())
445 return
446 }
447
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900448 var filename string
449 if txt.Name() != vndkUsingCoreVariantLibrariesTxt {
450 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
451 } else {
452 filename = txt.Name()
453 }
454
Jooyung Han2216fb12019-11-06 16:46:15 +0900455 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
456 ctx.Build(pctx, android.BuildParams{
457 Rule: android.WriteFile,
458 Output: txt.outputFile,
459 Description: "Writing " + txt.outputFile.String(),
460 Args: map[string]string{
461 "content": strings.Join(list, "\\n"),
462 },
463 })
464
465 installPath := android.PathForModuleInstall(ctx, "etc")
466 ctx.InstallFile(installPath, filename, txt.outputFile)
467}
468
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900469func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
470 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900471 Class: "ETC",
472 OutputFile: android.OptionalPathForPath(txt.outputFile),
473 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
474 func(entries *android.AndroidMkEntries) {
475 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
476 },
477 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900478 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900479}
480
Jooyung Han39edb6c2019-11-06 16:53:07 +0900481func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
482 return txt.outputFile
483}
484
485func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
486 return android.Paths{txt.outputFile}, nil
487}
488
489func (txt *vndkLibrariesTxt) SubDir() string {
490 return ""
491}
492
Inseob Kim1f086e22019-05-09 13:29:15 +0900493func VndkSnapshotSingleton() android.Singleton {
494 return &vndkSnapshotSingleton{}
495}
496
Jooyung Han0302a842019-10-30 18:43:49 +0900497type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900498 vndkLibrariesFile android.OutputPath
499 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900500}
Inseob Kim1f086e22019-05-09 13:29:15 +0900501
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900502func isVndkSnapshotLibrary(config android.DeviceConfig, m *Module) (i snapshotLibraryInterface, vndkType string, isVndkSnapshotLib bool) {
503 if m.Target().NativeBridge == android.NativeBridgeEnabled {
504 return nil, "", false
505 }
506 if !m.inVendor() || !m.installable() || m.isSnapshotPrebuilt() {
507 return nil, "", false
508 }
509 l, ok := m.linker.(snapshotLibraryInterface)
510 if !ok || !l.shared() {
511 return nil, "", false
512 }
513 if m.VndkVersion() == config.PlatformVndkVersion() && m.IsVndk() && !m.isVndkExt() {
514 if m.isVndkSp() {
515 return l, "vndk-sp", true
516 } else {
517 return l, "vndk-core", true
518 }
519 }
520
521 return nil, "", false
522}
523
Inseob Kim1f086e22019-05-09 13:29:15 +0900524func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900525 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
526 c.buildVndkLibrariesTxtFiles(ctx)
527
Inseob Kim1f086e22019-05-09 13:29:15 +0900528 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
529 if ctx.DeviceConfig().VndkVersion() != "current" {
530 return
531 }
532
533 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
534 return
535 }
536
537 if ctx.DeviceConfig().BoardVndkRuntimeDisable() {
538 return
539 }
540
Inseob Kim242ef0c2019-10-22 20:15:20 +0900541 var snapshotOutputs android.Paths
542
543 /*
544 VNDK snapshot zipped artifacts directory structure:
545 {SNAPSHOT_ARCH}/
546 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
547 shared/
548 vndk-core/
549 (VNDK-core libraries, e.g. libbinder.so)
550 vndk-sp/
551 (VNDK-SP libraries, e.g. libc++.so)
552 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
553 shared/
554 vndk-core/
555 (VNDK-core libraries, e.g. libbinder.so)
556 vndk-sp/
557 (VNDK-SP libraries, e.g. libc++.so)
558 binder32/
559 (This directory is newly introduced in v28 (Android P) to hold
560 prebuilts built for 32-bit binder interface.)
561 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
562 ...
563 configs/
564 (various *.txt configuration files)
565 include/
566 (header files of same directory structure with source tree)
567 NOTICE_FILES/
568 (notice files of libraries, e.g. libcutils.so.txt)
569 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900570
571 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900572 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900573
Inseob Kim242ef0c2019-10-22 20:15:20 +0900574 configsDir := filepath.Join(snapshotArchDir, "configs")
575 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
576 includeDir := filepath.Join(snapshotArchDir, "include")
577
Inseob Kim242ef0c2019-10-22 20:15:20 +0900578 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900579 noticeBuilt := make(map[string]bool)
580
Inseob Kim242ef0c2019-10-22 20:15:20 +0900581 // paths of VNDK modules for GPL license checking
582 modulePaths := make(map[string]string)
583
584 // actual module names of .so files
585 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
586 moduleNames := make(map[string]string)
587
Inseob Kim8471cda2019-11-15 09:59:12 +0900588 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900589
Inseob Kim8471cda2019-11-15 09:59:12 +0900590 installVndkSnapshotLib := func(m *Module, l snapshotLibraryInterface, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900591 var ret android.Paths
592
Inseob Kim8471cda2019-11-15 09:59:12 +0900593 targetArch := "arch-" + m.Target().Arch.ArchType.String()
594 if m.Target().Arch.ArchVariant != "" {
595 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900596 }
Inseob Kimae553032019-05-14 18:52:49 +0900597
Inseob Kim8471cda2019-11-15 09:59:12 +0900598 libPath := m.outputFile.Path()
599 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
600 ret = append(ret, copyFile(ctx, libPath, snapshotLibOut))
601
Inseob Kimae553032019-05-14 18:52:49 +0900602 if ctx.Config().VndkSnapshotBuildArtifacts() {
603 prop := struct {
604 ExportedDirs []string `json:",omitempty"`
605 ExportedSystemDirs []string `json:",omitempty"`
606 ExportedFlags []string `json:",omitempty"`
607 RelativeInstallPath string `json:",omitempty"`
608 }{}
609 prop.ExportedFlags = l.exportedFlags()
Jiyong Park74955042019-10-22 20:19:51 +0900610 prop.ExportedDirs = l.exportedDirs().Strings()
611 prop.ExportedSystemDirs = l.exportedSystemDirs().Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900612 prop.RelativeInstallPath = m.RelativeInstallPath()
613
Inseob Kim242ef0c2019-10-22 20:15:20 +0900614 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900615
616 j, err := json.Marshal(prop)
617 if err != nil {
618 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900619 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900620 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900621 ret = append(ret, writeStringToFile(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900622 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900623 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900624 }
625
Inseob Kim1f086e22019-05-09 13:29:15 +0900626 ctx.VisitAllModules(func(module android.Module) {
627 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900628 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900629 return
630 }
631
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900632 l, vndkType, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m)
Inseob Kimae553032019-05-14 18:52:49 +0900633 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200634 return
635 }
636
Inseob Kim8471cda2019-11-15 09:59:12 +0900637 // install .so files for appropriate modules.
638 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Inseob Kim242ef0c2019-10-22 20:15:20 +0900639 libs, ok := installVndkSnapshotLib(m, l, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900640 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900641 return
642 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900643 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900644
Inseob Kim8471cda2019-11-15 09:59:12 +0900645 // These are for generating module_names.txt and module_paths.txt
646 stem := m.outputFile.Path().Base()
647 moduleNames[stem] = ctx.ModuleName(m)
648 modulePaths[stem] = ctx.ModuleDir(m)
649
Bob Badoura75b0572020-02-18 20:21:55 -0800650 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900651 noticeName := stem + ".txt"
652 // skip already copied notice file
653 if _, ok := noticeBuilt[noticeName]; !ok {
654 noticeBuilt[noticeName] = true
Bob Badoura75b0572020-02-18 20:21:55 -0800655 snapshotOutputs = append(snapshotOutputs, combineNotices(
656 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900657 }
658 }
659
660 if ctx.Config().VndkSnapshotBuildArtifacts() {
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900661 headers = append(headers, l.snapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900662 }
663 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900664
Inseob Kim8471cda2019-11-15 09:59:12 +0900665 // install all headers after removing duplicates
666 for _, header := range android.FirstUniquePaths(headers) {
667 snapshotOutputs = append(snapshotOutputs, copyFile(
668 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900669 }
670
Jooyung Han39edb6c2019-11-06 16:53:07 +0900671 // install *.libraries.txt except vndkcorevariant.libraries.txt
672 ctx.VisitAllModules(func(module android.Module) {
673 m, ok := module.(*vndkLibrariesTxt)
674 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
675 return
676 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900677 snapshotOutputs = append(snapshotOutputs, copyFile(
678 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900679 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900680
Inseob Kim242ef0c2019-10-22 20:15:20 +0900681 /*
682 Dump a map to a list file as:
Inseob Kim1f086e22019-05-09 13:29:15 +0900683
Inseob Kim242ef0c2019-10-22 20:15:20 +0900684 {key1} {value1}
685 {key2} {value2}
686 ...
687 */
688 installMapListFile := func(m map[string]string, path string) android.OutputPath {
689 var txtBuilder strings.Builder
690 for idx, k := range android.SortedStringKeys(m) {
691 if idx > 0 {
692 txtBuilder.WriteString("\\n")
693 }
694 txtBuilder.WriteString(k)
695 txtBuilder.WriteString(" ")
696 txtBuilder.WriteString(m[k])
Inseob Kim1f086e22019-05-09 13:29:15 +0900697 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900698 return writeStringToFile(ctx, txtBuilder.String(), path)
Inseob Kim1f086e22019-05-09 13:29:15 +0900699 }
700
Inseob Kim242ef0c2019-10-22 20:15:20 +0900701 /*
702 module_paths.txt contains paths on which VNDK modules are defined.
703 e.g.,
704 libbase.so system/core/base
705 libc.so bionic/libc
706 ...
707 */
708 snapshotOutputs = append(snapshotOutputs, installMapListFile(modulePaths, filepath.Join(configsDir, "module_paths.txt")))
709
710 /*
711 module_names.txt contains names as which VNDK modules are defined,
712 because output filename and module name can be different with stem and suffix properties.
713
714 e.g.,
715 libcutils.so libcutils
716 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
717 ...
718 */
719 snapshotOutputs = append(snapshotOutputs, installMapListFile(moduleNames, filepath.Join(configsDir, "module_names.txt")))
720
721 // All artifacts are ready. Sort them to normalize ninja and then zip.
722 sort.Slice(snapshotOutputs, func(i, j int) bool {
723 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
724 })
725
726 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
727 zipRule := android.NewRuleBuilder()
728
Inseob Kim8471cda2019-11-15 09:59:12 +0900729 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with xargs
Inseob Kim242ef0c2019-10-22 20:15:20 +0900730 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
731 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900732 Text("tr").
733 FlagWithArg("-d ", "\\'").
734 FlagWithRspFileInputList("< ", snapshotOutputs).
735 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900736
737 zipRule.Temporary(snapshotOutputList)
738
739 zipRule.Command().
740 BuiltTool(ctx, "soong_zip").
741 FlagWithOutput("-o ", zipPath).
742 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
743 FlagWithInput("-l ", snapshotOutputList)
744
745 zipRule.Build(pctx, ctx, zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900746 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900747 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900748}
Jooyung Han097087b2019-10-22 19:32:18 +0900749
Jooyung Han0302a842019-10-30 18:43:49 +0900750func getVndkFileName(m *Module) (string, error) {
751 if library, ok := m.linker.(*libraryDecorator); ok {
752 return library.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
753 }
754 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
755 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true) + ".so", nil
756 }
757 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900758}
759
760func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900761 llndk := android.SortedStringMapValues(llndkLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900762 vndkcore := android.SortedStringMapValues(vndkCoreLibraries(ctx.Config()))
763 vndksp := android.SortedStringMapValues(vndkSpLibraries(ctx.Config()))
764 vndkprivate := android.SortedStringMapValues(vndkPrivateLibraries(ctx.Config()))
Jooyung Han0302a842019-10-30 18:43:49 +0900765
Jooyung Han2216fb12019-11-06 16:46:15 +0900766 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900767 // Since each target have different set of libclang_rt.* files,
768 // keep the common set of files in vndk.libraries.txt
769 var merged []string
Jooyung Han097087b2019-10-22 19:32:18 +0900770 filterOutLibClangRt := func(libList []string) (filtered []string) {
771 for _, lib := range libList {
772 if !strings.HasPrefix(lib, "libclang_rt.") {
773 filtered = append(filtered, lib)
774 }
775 }
776 return
777 }
778 merged = append(merged, addPrefix(filterOutLibClangRt(llndk), "LLNDK: ")...)
779 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
780 merged = append(merged, addPrefix(filterOutLibClangRt(vndkcore), "VNDK-core: ")...)
781 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900782 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
783 ctx.Build(pctx, android.BuildParams{
784 Rule: android.WriteFile,
785 Output: c.vndkLibrariesFile,
786 Description: "Writing " + c.vndkLibrariesFile.String(),
787 Args: map[string]string{
788 "content": strings.Join(merged, "\\n"),
789 },
790 })
Jooyung Han0302a842019-10-30 18:43:49 +0900791}
Jooyung Han097087b2019-10-22 19:32:18 +0900792
Jooyung Han0302a842019-10-30 18:43:49 +0900793func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
794 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
795 // they been moved to an apex.
796 movedToApexLlndkLibraries := []string{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900797 for lib := range llndkLibraries(ctx.Config()) {
Jooyung Han0302a842019-10-30 18:43:49 +0900798 // Skip bionic libs, they are handled in different manner
799 if android.DirectlyInAnyApex(&notOnHostContext{}, lib) && !isBionic(lib) {
800 movedToApexLlndkLibraries = append(movedToApexLlndkLibraries, lib)
801 }
802 }
803 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES", strings.Join(movedToApexLlndkLibraries, " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900804
805 // Make uses LLNDK_LIBRARIES to determine which libraries to install.
806 // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
807 // Therefore, by removing the library here, we cause it to only be installed if libc
808 // depends on it.
809 installedLlndkLibraries := []string{}
810 for lib := range llndkLibraries(ctx.Config()) {
811 if strings.HasPrefix(lib, "libclang_rt.hwasan-") {
812 continue
813 }
814 installedLlndkLibraries = append(installedLlndkLibraries, lib)
815 }
816 sort.Strings(installedLlndkLibraries)
817 ctx.Strict("LLNDK_LIBRARIES", strings.Join(installedLlndkLibraries, " "))
818
Jooyung Han0302a842019-10-30 18:43:49 +0900819 ctx.Strict("VNDK_CORE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkCoreLibraries(ctx.Config())), " "))
820 ctx.Strict("VNDK_SAMEPROCESS_LIBRARIES", strings.Join(android.SortedStringKeys(vndkSpLibraries(ctx.Config())), " "))
821 ctx.Strict("VNDK_PRIVATE_LIBRARIES", strings.Join(android.SortedStringKeys(vndkPrivateLibraries(ctx.Config())), " "))
822 ctx.Strict("VNDK_USING_CORE_VARIANT_LIBRARIES", strings.Join(android.SortedStringKeys(vndkUsingCoreVariantLibraries(ctx.Config())), " "))
823
Jooyung Han0302a842019-10-30 18:43:49 +0900824 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900825 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900826}