blob: 0b40076053ee150b8ef6f841007205b075a90b17 [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"
Jiyong Parkd5b18a52017-08-03 21:22:50 +090024
Justin Yun8effde42017-06-23 19:24:43 +090025 "android/soong/android"
Vic Yangefd249e2018-11-12 20:19:56 -080026 "android/soong/cc/config"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070027 "android/soong/etc"
Colin Cross6e511a92020-07-27 21:26:48 -070028
29 "github.com/google/blueprint"
Justin Yun8effde42017-06-23 19:24:43 +090030)
31
Jooyung Han39edb6c2019-11-06 16:53:07 +090032const (
33 llndkLibrariesTxt = "llndk.libraries.txt"
34 vndkCoreLibrariesTxt = "vndkcore.libraries.txt"
35 vndkSpLibrariesTxt = "vndksp.libraries.txt"
36 vndkPrivateLibrariesTxt = "vndkprivate.libraries.txt"
Justin Yun8a2600c2020-12-07 12:44:03 +090037 vndkProductLibrariesTxt = "vndkproduct.libraries.txt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090038 vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
39)
40
41func VndkLibrariesTxtModules(vndkVersion string) []string {
42 if vndkVersion == "current" {
43 return []string{
44 llndkLibrariesTxt,
45 vndkCoreLibrariesTxt,
46 vndkSpLibrariesTxt,
47 vndkPrivateLibrariesTxt,
Justin Yun8a2600c2020-12-07 12:44:03 +090048 vndkProductLibrariesTxt,
Jooyung Han39edb6c2019-11-06 16:53:07 +090049 }
50 }
51 // Snapshot vndks have their own *.libraries.VER.txt files.
52 // Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
53 return []string{
54 insertVndkVersion(llndkLibrariesTxt, vndkVersion),
55 insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
56 insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
57 insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
Justin Yun8a2600c2020-12-07 12:44:03 +090058 insertVndkVersion(vndkProductLibrariesTxt, vndkVersion),
Jooyung Han39edb6c2019-11-06 16:53:07 +090059 }
60}
61
Justin Yun8effde42017-06-23 19:24:43 +090062type VndkProperties struct {
63 Vndk struct {
64 // declared as a VNDK or VNDK-SP module. The vendor variant
65 // will be installed in /system instead of /vendor partition.
66 //
Justin Yun63e9ec72020-10-29 16:49:43 +090067 // `vendor_available` and `product_available` must be explicitly
68 // set to either true or false together with `vndk: {enabled: true}`.
Justin Yun8effde42017-06-23 19:24:43 +090069 Enabled *bool
70
71 // declared as a VNDK-SP module, which is a subset of VNDK.
72 //
73 // `vndk: { enabled: true }` must set together.
74 //
75 // All these modules are allowed to link to VNDK-SP or LL-NDK
76 // modules only. Other dependency will cause link-type errors.
77 //
78 // If `support_system_process` is not set or set to false,
79 // the module is VNDK-core and can link to other VNDK-core,
80 // VNDK-SP or LL-NDK modules only.
81 Support_system_process *bool
Logan Chienf3511742017-10-31 18:04:35 +080082
Justin Yunfd9e8042020-12-23 18:23:14 +090083 // declared as a VNDK-private module.
84 // This module still creates the vendor and product variants refering
85 // to the `vendor_available: true` and `product_available: true`
86 // properties. However, it is only available to the other VNDK modules
87 // but not to the non-VNDK vendor or product modules.
88 Private *bool
89
Logan Chienf3511742017-10-31 18:04:35 +080090 // Extending another module
91 Extends *string
Justin Yun8effde42017-06-23 19:24:43 +090092 }
93}
94
95type vndkdep struct {
96 Properties VndkProperties
97}
98
99func (vndk *vndkdep) props() []interface{} {
100 return []interface{}{&vndk.Properties}
101}
102
103func (vndk *vndkdep) begin(ctx BaseModuleContext) {}
104
105func (vndk *vndkdep) deps(ctx BaseModuleContext, deps Deps) Deps {
106 return deps
107}
108
109func (vndk *vndkdep) isVndk() bool {
110 return Bool(vndk.Properties.Vndk.Enabled)
111}
112
113func (vndk *vndkdep) isVndkSp() bool {
114 return Bool(vndk.Properties.Vndk.Support_system_process)
115}
116
Logan Chienf3511742017-10-31 18:04:35 +0800117func (vndk *vndkdep) isVndkExt() bool {
118 return vndk.Properties.Vndk.Extends != nil
119}
120
121func (vndk *vndkdep) getVndkExtendsModuleName() string {
122 return String(vndk.Properties.Vndk.Extends)
123}
124
Justin Yun8effde42017-06-23 19:24:43 +0900125func (vndk *vndkdep) typeName() string {
126 if !vndk.isVndk() {
127 return "native:vendor"
128 }
Logan Chienf3511742017-10-31 18:04:35 +0800129 if !vndk.isVndkExt() {
130 if !vndk.isVndkSp() {
131 return "native:vendor:vndk"
132 }
133 return "native:vendor:vndksp"
Justin Yun8effde42017-06-23 19:24:43 +0900134 }
Logan Chienf3511742017-10-31 18:04:35 +0800135 if !vndk.isVndkSp() {
136 return "native:vendor:vndkext"
137 }
138 return "native:vendor:vndkspext"
Justin Yun8effde42017-06-23 19:24:43 +0900139}
140
Justin Yun63e9ec72020-10-29 16:49:43 +0900141// VNDK link type check from a module with UseVndk() == true.
Jooyung Han479ca172020-10-19 18:51:07 +0900142func (vndk *vndkdep) vndkCheckLinkType(ctx android.BaseModuleContext, to *Module, tag blueprint.DependencyTag) {
Justin Yun8effde42017-06-23 19:24:43 +0900143 if to.linker == nil {
144 return
145 }
Jiyong Park82e2bf32017-08-16 14:05:54 +0900146 if !vndk.isVndk() {
Justin Yunfd9e8042020-12-23 18:23:14 +0900147 // Non-VNDK modules those installed to /vendor, /system/vendor,
148 // /product or /system/product cannot depend on VNDK-private modules
149 // that include VNDK-core-private, VNDK-SP-private and LLNDK-private.
150 if to.IsVndkPrivate() {
151 ctx.ModuleErrorf("non-VNDK module should not link to %q which has `private: true`", to.Name())
Jiyong Park82e2bf32017-08-16 14:05:54 +0900152 }
153 }
Justin Yun8effde42017-06-23 19:24:43 +0900154 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
155 // Check only shared libraries.
Colin Cross127bb8b2020-12-16 16:46:01 -0800156 // Other (static) libraries are allowed to link.
Justin Yun8effde42017-06-23 19:24:43 +0900157 return
158 }
Colin Cross127bb8b2020-12-16 16:46:01 -0800159
160 if to.IsLlndk() {
161 // LL-NDK libraries are allowed to link
162 return
163 }
164
Ivan Lozano52767be2019-10-18 14:49:46 -0700165 if !to.UseVndk() {
Justin Yun8effde42017-06-23 19:24:43 +0900166 ctx.ModuleErrorf("(%s) should not link to %q which is not a vendor-available library",
167 vndk.typeName(), to.Name())
168 return
169 }
Logan Chienf3511742017-10-31 18:04:35 +0800170 if tag == vndkExtDepTag {
171 // Ensure `extends: "name"` property refers a vndk module that has vendor_available
172 // and has identical vndk properties.
173 if to.vndkdep == nil || !to.vndkdep.isVndk() {
174 ctx.ModuleErrorf("`extends` refers a non-vndk module %q", to.Name())
175 return
176 }
177 if vndk.isVndkSp() != to.vndkdep.isVndkSp() {
178 ctx.ModuleErrorf(
179 "`extends` refers a module %q with mismatched support_system_process",
180 to.Name())
181 return
182 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900183 if to.IsVndkPrivate() {
Logan Chienf3511742017-10-31 18:04:35 +0800184 ctx.ModuleErrorf(
Justin Yunfd9e8042020-12-23 18:23:14 +0900185 "`extends` refers module %q which has `private: true`",
Justin Yun6977e8a2020-10-29 18:24:11 +0900186 to.Name())
187 return
188 }
Logan Chienf3511742017-10-31 18:04:35 +0800189 }
Justin Yun8effde42017-06-23 19:24:43 +0900190 if to.vndkdep == nil {
191 return
192 }
Logan Chienf3511742017-10-31 18:04:35 +0800193
Logan Chiend3c59a22018-03-29 14:08:15 +0800194 // Check the dependencies of VNDK shared libraries.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100195 if err := vndkIsVndkDepAllowed(vndk, to.vndkdep); err != nil {
196 ctx.ModuleErrorf("(%s) should not link to %q (%s): %v",
197 vndk.typeName(), to.Name(), to.vndkdep.typeName(), err)
Logan Chienf3511742017-10-31 18:04:35 +0800198 return
199 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800200}
Logan Chienf3511742017-10-31 18:04:35 +0800201
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100202func vndkIsVndkDepAllowed(from *vndkdep, to *vndkdep) error {
Logan Chiend3c59a22018-03-29 14:08:15 +0800203 // Check the dependencies of VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext and vendor modules.
204 if from.isVndkExt() {
205 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100206 if to.isVndk() && !to.isVndkSp() {
207 return errors.New("VNDK-SP extensions must not depend on VNDK or VNDK extensions")
208 }
209 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800210 }
211 // VNDK-Ext may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100212 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900213 }
Logan Chiend3c59a22018-03-29 14:08:15 +0800214 if from.isVndk() {
215 if to.isVndkExt() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100216 return errors.New("VNDK-core and VNDK-SP must not depend on VNDK extensions")
Logan Chiend3c59a22018-03-29 14:08:15 +0800217 }
218 if from.isVndkSp() {
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100219 if !to.isVndkSp() {
220 return errors.New("VNDK-SP must only depend on VNDK-SP")
221 }
222 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800223 }
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100224 if !to.isVndk() {
225 return errors.New("VNDK-core must only depend on VNDK-core or VNDK-SP")
226 }
227 return nil
Logan Chiend3c59a22018-03-29 14:08:15 +0800228 }
229 // Vendor modules may depend on VNDK, VNDK-Ext, VNDK-SP, VNDK-SP-Ext, or vendor libs.
Martin Stjernholm257eb0c2018-10-15 13:05:27 +0100230 return nil
Justin Yun8effde42017-06-23 19:24:43 +0900231}
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900232
Colin Cross78212242021-01-06 14:51:30 -0800233type moduleListerFunc func(ctx android.SingletonContext) (moduleNames, fileNames []string)
234
Jiyong Parkd5b18a52017-08-03 21:22:50 +0900235var (
Colin Cross203b4212021-04-26 17:19:41 -0700236 llndkLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsLLNDK && !m.Header() })
Colin Cross78212242021-01-06 14:51:30 -0800237 vndkSPLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKSP })
238 vndkCoreLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKCore })
Colin Cross203b4212021-04-26 17:19:41 -0700239 vndkPrivateLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKPrivate })
Colin Cross78212242021-01-06 14:51:30 -0800240 vndkProductLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKProduct })
241 vndkUsingCoreVariantLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKUsingCoreVariant })
Inseob Kimae553032019-05-14 18:52:49 +0900242)
Inseob Kim1f086e22019-05-09 13:29:15 +0900243
Colin Cross78212242021-01-06 14:51:30 -0800244// vndkModuleLister takes a predicate that operates on a Module and returns a moduleListerFunc
245// that produces a list of module names and output file names for which the predicate returns true.
246func vndkModuleLister(predicate func(*Module) bool) moduleListerFunc {
247 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
248 ctx.VisitAllModules(func(m android.Module) {
249 if c, ok := m.(*Module); ok && predicate(c) {
250 filename, err := getVndkFileName(c)
251 if err != nil {
252 ctx.ModuleErrorf(m, "%s", err)
253 }
254 moduleNames = append(moduleNames, ctx.ModuleName(m))
255 fileNames = append(fileNames, filename)
256 }
257 })
258 moduleNames = android.SortedUniqueStrings(moduleNames)
259 fileNames = android.SortedUniqueStrings(fileNames)
260 return
261 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900262}
263
Colin Cross78212242021-01-06 14:51:30 -0800264// vndkModuleListRemover takes a moduleListerFunc and a prefix and returns a moduleListerFunc
265// that returns the same lists as the input moduleListerFunc, but with modules with the
266// given prefix removed.
267func vndkModuleListRemover(lister moduleListerFunc, prefix string) moduleListerFunc {
268 return func(ctx android.SingletonContext) (moduleNames, fileNames []string) {
269 moduleNames, fileNames = lister(ctx)
270 filter := func(in []string) []string {
271 out := make([]string, 0, len(in))
272 for _, lib := range in {
273 if strings.HasPrefix(lib, prefix) {
274 continue
275 }
276 out = append(out, lib)
277 }
278 return out
279 }
280 return filter(moduleNames), filter(fileNames)
281 }
Inseob Kim9516ee92019-05-09 10:56:13 +0900282}
283
Colin Cross78212242021-01-06 14:51:30 -0800284var vndkMustUseVendorVariantListKey = android.NewOnceKey("vndkMustUseVendorVariantListKey")
Inseob Kim9516ee92019-05-09 10:56:13 +0900285
Jooyung Han097087b2019-10-22 19:32:18 +0900286func vndkMustUseVendorVariantList(cfg android.Config) []string {
287 return cfg.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900288 return config.VndkMustUseVendorVariantList
289 }).([]string)
290}
291
292// test may call this to override global configuration(config.VndkMustUseVendorVariantList)
293// when it is called, it must be before the first call to vndkMustUseVendorVariantList()
294func setVndkMustUseVendorVariantListForTest(config android.Config, mustUseVendorVariantList []string) {
Jooyung Hana463f722019-11-01 08:45:59 +0900295 config.Once(vndkMustUseVendorVariantListKey, func() interface{} {
Jooyung Han097087b2019-10-22 19:32:18 +0900296 return mustUseVendorVariantList
297 })
298}
299
Inseob Kim1f086e22019-05-09 13:29:15 +0900300func processVndkLibrary(mctx android.BottomUpMutatorContext, m *Module) {
Justin Yun8a2600c2020-12-07 12:44:03 +0900301 if m.InProduct() {
302 // We may skip the steps for the product variants because they
303 // are already covered by the vendor variants.
304 return
305 }
306
Jooyung Han0302a842019-10-30 18:43:49 +0900307 name := m.BaseModuleName()
Inseob Kim1f086e22019-05-09 13:29:15 +0900308
Colin Cross31076b32020-10-23 17:22:06 -0700309 if lib := m.library; lib != nil && lib.hasStubsVariants() && name != "libz" {
Jiyong Park2478e4e2020-05-18 09:30:14 +0000310 // b/155456180 libz is the ONLY exception here. We don't want to make
311 // libz an LLNDK library because we in general can't guarantee that
312 // libz will behave consistently especially about the compression.
313 // i.e. the compressed output might be different across releases.
314 // As the library is an external one, it's risky to keep the compatibility
315 // promise if it becomes an LLNDK.
Jiyong Parkea97f512020-03-31 15:31:17 +0900316 mctx.PropertyErrorf("vndk.enabled", "This library provides stubs. Shouldn't be VNDK. Consider making it as LLNDK")
317 }
318
Jooyung Han097087b2019-10-22 19:32:18 +0900319 if inList(name, vndkMustUseVendorVariantList(mctx.Config())) {
320 m.Properties.MustUseVendorVariant = true
321 }
Jooyung Han0302a842019-10-30 18:43:49 +0900322 if mctx.DeviceConfig().VndkUseCoreVariant() && !m.Properties.MustUseVendorVariant {
Colin Cross78212242021-01-06 14:51:30 -0800323 m.VendorProperties.IsVNDKUsingCoreVariant = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900324 }
Jooyung Han0302a842019-10-30 18:43:49 +0900325
Inseob Kim1f086e22019-05-09 13:29:15 +0900326 if m.vndkdep.isVndkSp() {
Colin Cross78212242021-01-06 14:51:30 -0800327 m.VendorProperties.IsVNDKSP = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900328 } else {
Colin Cross78212242021-01-06 14:51:30 -0800329 m.VendorProperties.IsVNDKCore = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900330 }
Justin Yunfd9e8042020-12-23 18:23:14 +0900331 if m.IsVndkPrivate() {
Colin Cross78212242021-01-06 14:51:30 -0800332 m.VendorProperties.IsVNDKPrivate = true
Inseob Kim1f086e22019-05-09 13:29:15 +0900333 }
Justin Yunc0d8c492021-01-07 17:45:31 +0900334 if Bool(m.VendorProperties.Product_available) {
Colin Cross78212242021-01-06 14:51:30 -0800335 m.VendorProperties.IsVNDKProduct = true
Justin Yun8a2600c2020-12-07 12:44:03 +0900336 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900337}
338
Yo Chiang08fac0c2020-07-29 01:08:20 +0800339// Check for modules that mustn't be VNDK
Yo Chiangbba545e2020-06-09 16:15:37 +0800340func shouldSkipVndkMutator(m *Module) bool {
Jooyung Han31c470b2019-10-18 16:26:59 +0900341 if !m.Enabled() {
Yo Chiangbba545e2020-06-09 16:15:37 +0800342 return true
Jooyung Han31c470b2019-10-18 16:26:59 +0900343 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800344 if !m.Device() {
345 // Skip non-device modules
346 return true
Jooyung Han87a7f302019-10-29 05:18:21 +0900347 }
Jooyung Han31c470b2019-10-18 16:26:59 +0900348 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Yo Chiangbba545e2020-06-09 16:15:37 +0800349 // Skip native_bridge modules
350 return true
351 }
352 return false
353}
354
355func IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool {
356 if shouldSkipVndkMutator(m) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900357 return false
358 }
359
360 // prebuilt vndk modules should match with device
361 // TODO(b/142675459): Use enabled: to select target device in vndk_prebuilt_shared
362 // When b/142675459 is landed, remove following check
Ivan Lozanod1dec542021-05-26 15:33:11 -0400363 if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok && !p.MatchesWithDevice(mctx.DeviceConfig()) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900364 return false
365 }
366
367 if lib, ok := m.linker.(libraryInterface); ok {
Jooyung Han73d20d02020-03-27 16:06:55 +0900368 // VNDK APEX for VNDK-Lite devices will have VNDK-SP libraries from core variants
369 if mctx.DeviceConfig().VndkVersion() == "" {
370 // b/73296261: filter out libz.so because it is considered as LLNDK for VNDK-lite devices
371 if mctx.ModuleName() == "libz" {
372 return false
373 }
Jooyung Han7d6e79b2021-06-24 01:53:43 +0900374 return m.ImageVariation().Variation == android.CoreVariation && lib.shared() && m.IsVndkSp() && !m.IsVndkExt()
Jooyung Han73d20d02020-03-27 16:06:55 +0900375 }
376
Justin Yun5f7f7e82019-11-18 19:52:14 +0900377 useCoreVariant := m.VndkVersion() == mctx.DeviceConfig().PlatformVndkVersion() &&
Jooyung Han87a7f302019-10-29 05:18:21 +0900378 mctx.DeviceConfig().VndkUseCoreVariant() && !m.MustUseVendorVariant()
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500379 return lib.shared() && m.InVendor() && m.IsVndk() && !m.IsVndkExt() && !useCoreVariant
Jooyung Han31c470b2019-10-18 16:26:59 +0900380 }
381 return false
382}
383
Inseob Kim1f086e22019-05-09 13:29:15 +0900384// gather list of vndk-core, vndk-sp, and ll-ndk libs
385func VndkMutator(mctx android.BottomUpMutatorContext) {
386 m, ok := mctx.Module().(*Module)
387 if !ok {
388 return
389 }
Yo Chiangbba545e2020-06-09 16:15:37 +0800390
391 if shouldSkipVndkMutator(m) {
Justin Yun7390ea32019-09-08 11:34:06 +0900392 return
393 }
Inseob Kim1f086e22019-05-09 13:29:15 +0900394
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800395 lib, isLib := m.linker.(*libraryDecorator)
396 prebuiltLib, isPrebuiltLib := m.linker.(*prebuiltLibraryLinker)
Inseob Kim1f086e22019-05-09 13:29:15 +0900397
Colin Cross203b4212021-04-26 17:19:41 -0700398 if m.UseVndk() && isLib && lib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800399 m.VendorProperties.IsLLNDK = true
400 m.VendorProperties.IsVNDKPrivate = Bool(lib.Properties.Llndk.Private)
401 }
Colin Cross203b4212021-04-26 17:19:41 -0700402 if m.UseVndk() && isPrebuiltLib && prebuiltLib.hasLLNDKStubs() {
Colin Cross0fb7fcd2021-03-02 11:00:07 -0800403 m.VendorProperties.IsLLNDK = true
404 m.VendorProperties.IsVNDKPrivate = Bool(prebuiltLib.Properties.Llndk.Private)
405 }
406
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800407 if (isLib && lib.buildShared()) || (isPrebuiltLib && prebuiltLib.buildShared()) {
Inseob Kim64c43952019-08-26 16:52:35 +0900408 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() {
Colin Crosse4e44bc2020-12-28 13:50:21 -0800416 RegisterVndkLibraryTxtTypes(android.InitRegistrationContext)
Inseob Kim1f086e22019-05-09 13:29:15 +0900417 android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)
Inseob Kim1f086e22019-05-09 13:29:15 +0900418}
419
Colin Crosse4e44bc2020-12-28 13:50:21 -0800420func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) {
Colin Cross78212242021-01-06 14:51:30 -0800421 ctx.RegisterSingletonModuleType("llndk_libraries_txt", llndkLibrariesTxtFactory)
422 ctx.RegisterSingletonModuleType("vndksp_libraries_txt", vndkSPLibrariesTxtFactory)
423 ctx.RegisterSingletonModuleType("vndkcore_libraries_txt", vndkCoreLibrariesTxtFactory)
424 ctx.RegisterSingletonModuleType("vndkprivate_libraries_txt", vndkPrivateLibrariesTxtFactory)
425 ctx.RegisterSingletonModuleType("vndkproduct_libraries_txt", vndkProductLibrariesTxtFactory)
426 ctx.RegisterSingletonModuleType("vndkcorevariant_libraries_txt", vndkUsingCoreVariantLibrariesTxtFactory)
Colin Crosse4e44bc2020-12-28 13:50:21 -0800427}
428
Jooyung Han2216fb12019-11-06 16:46:15 +0900429type vndkLibrariesTxt struct {
Colin Cross78212242021-01-06 14:51:30 -0800430 android.SingletonModuleBase
Colin Crosse4e44bc2020-12-28 13:50:21 -0800431
Justin Yun611e8862021-05-24 18:17:33 +0900432 lister moduleListerFunc
433 makeVarName string
434 filterOutFromMakeVar string
Colin Cross78212242021-01-06 14:51:30 -0800435
Colin Crosse4e44bc2020-12-28 13:50:21 -0800436 properties VndkLibrariesTxtProperties
437
Colin Cross78212242021-01-06 14:51:30 -0800438 outputFile android.OutputPath
439 moduleNames []string
440 fileNames []string
Jooyung Han2216fb12019-11-06 16:46:15 +0900441}
442
Colin Crosse4e44bc2020-12-28 13:50:21 -0800443type VndkLibrariesTxtProperties struct {
444 Insert_vndk_version *bool
445}
446
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700447var _ etc.PrebuiltEtcModule = &vndkLibrariesTxt{}
Jooyung Han39edb6c2019-11-06 16:53:07 +0900448var _ android.OutputFileProducer = &vndkLibrariesTxt{}
449
Colin Cross78212242021-01-06 14:51:30 -0800450// llndk_libraries_txt is a singleton module whose content is a list of LLNDK libraries
451// generated by Soong but can be referenced by other modules.
Jooyung Han2216fb12019-11-06 16:46:15 +0900452// For example, apex_vndk can depend on these files as prebuilt.
Justin Yun611e8862021-05-24 18:17:33 +0900453// Make uses LLNDK_LIBRARIES to determine which libraries to install.
454// HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN.
455// Therefore, by removing the library here, we cause it to only be installed if libc
456// depends on it.
Colin Cross78212242021-01-06 14:51:30 -0800457func llndkLibrariesTxtFactory() android.SingletonModule {
Justin Yun611e8862021-05-24 18:17:33 +0900458 return newVndkLibrariesWithMakeVarFilter(llndkLibraries, "LLNDK_LIBRARIES", "libclang_rt.hwasan-")
Colin Cross78212242021-01-06 14:51:30 -0800459}
460
461// vndksp_libraries_txt is a singleton module whose content is a list of VNDKSP libraries
462// generated by Soong but can be referenced by other modules.
463// For example, apex_vndk can depend on these files as prebuilt.
464func vndkSPLibrariesTxtFactory() android.SingletonModule {
465 return newVndkLibrariesTxt(vndkSPLibraries, "VNDK_SAMEPROCESS_LIBRARIES")
466}
467
468// vndkcore_libraries_txt is a singleton module whose content is a list of VNDK core libraries
469// generated by Soong but can be referenced by other modules.
470// For example, apex_vndk can depend on these files as prebuilt.
471func vndkCoreLibrariesTxtFactory() android.SingletonModule {
472 return newVndkLibrariesTxt(vndkCoreLibraries, "VNDK_CORE_LIBRARIES")
473}
474
475// vndkprivate_libraries_txt is a singleton module whose content is a list of VNDK private libraries
476// generated by Soong but can be referenced by other modules.
477// For example, apex_vndk can depend on these files as prebuilt.
478func vndkPrivateLibrariesTxtFactory() android.SingletonModule {
479 return newVndkLibrariesTxt(vndkPrivateLibraries, "VNDK_PRIVATE_LIBRARIES")
480}
481
482// vndkproduct_libraries_txt is a singleton module whose content is a list of VNDK product libraries
483// generated by Soong but can be referenced by other modules.
484// For example, apex_vndk can depend on these files as prebuilt.
485func vndkProductLibrariesTxtFactory() android.SingletonModule {
486 return newVndkLibrariesTxt(vndkProductLibraries, "VNDK_PRODUCT_LIBRARIES")
487}
488
489// vndkcorevariant_libraries_txt is a singleton module whose content is a list of VNDK libraries
490// that are using the core variant, generated by Soong but can be referenced by other modules.
491// For example, apex_vndk can depend on these files as prebuilt.
492func vndkUsingCoreVariantLibrariesTxtFactory() android.SingletonModule {
493 return newVndkLibrariesTxt(vndkUsingCoreVariantLibraries, "VNDK_USING_CORE_VARIANT_LIBRARIES")
494}
495
Justin Yun611e8862021-05-24 18:17:33 +0900496func newVndkLibrariesWithMakeVarFilter(lister moduleListerFunc, makeVarName string, filter string) android.SingletonModule {
Colin Cross78212242021-01-06 14:51:30 -0800497 m := &vndkLibrariesTxt{
Justin Yun611e8862021-05-24 18:17:33 +0900498 lister: lister,
499 makeVarName: makeVarName,
500 filterOutFromMakeVar: filter,
Colin Crosse4e44bc2020-12-28 13:50:21 -0800501 }
Colin Cross78212242021-01-06 14:51:30 -0800502 m.AddProperties(&m.properties)
503 android.InitAndroidModule(m)
504 return m
Jooyung Han2216fb12019-11-06 16:46:15 +0900505}
506
Justin Yun611e8862021-05-24 18:17:33 +0900507func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule {
508 return newVndkLibrariesWithMakeVarFilter(lister, makeVarName, "")
509}
510
Jooyung Han2216fb12019-11-06 16:46:15 +0900511func insertVndkVersion(filename string, vndkVersion string) string {
512 if index := strings.LastIndex(filename, "."); index != -1 {
513 return filename[:index] + "." + vndkVersion + filename[index:]
514 }
515 return filename
516}
517
Colin Crosse4e44bc2020-12-28 13:50:21 -0800518func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900519 var filename string
Colin Crosse4e44bc2020-12-28 13:50:21 -0800520 if BoolDefault(txt.properties.Insert_vndk_version, true) {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900521 filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
522 } else {
523 filename = txt.Name()
524 }
525
Jooyung Han2216fb12019-11-06 16:46:15 +0900526 txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
Jooyung Han2216fb12019-11-06 16:46:15 +0900527
528 installPath := android.PathForModuleInstall(ctx, "etc")
529 ctx.InstallFile(installPath, filename, txt.outputFile)
530}
531
Colin Cross78212242021-01-06 14:51:30 -0800532func (txt *vndkLibrariesTxt) GenerateSingletonBuildActions(ctx android.SingletonContext) {
533 txt.moduleNames, txt.fileNames = txt.lister(ctx)
534 android.WriteFileRule(ctx, txt.outputFile, strings.Join(txt.fileNames, "\n"))
535}
536
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900537func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries {
538 return []android.AndroidMkEntries{android.AndroidMkEntries{
Jooyung Han2216fb12019-11-06 16:46:15 +0900539 Class: "ETC",
540 OutputFile: android.OptionalPathForPath(txt.outputFile),
541 ExtraEntries: []android.AndroidMkExtraEntriesFunc{
Colin Crossaa255532020-07-03 13:18:24 -0700542 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900543 entries.SetString("LOCAL_MODULE_STEM", txt.outputFile.Base())
544 },
545 },
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900546 }}
Jooyung Han2216fb12019-11-06 16:46:15 +0900547}
548
Colin Cross78212242021-01-06 14:51:30 -0800549func (txt *vndkLibrariesTxt) MakeVars(ctx android.MakeVarsContext) {
Justin Yun611e8862021-05-24 18:17:33 +0900550 filter := func(modules []string, prefix string) []string {
551 if prefix == "" {
552 return modules
553 }
554 var result []string
555 for _, module := range modules {
556 if strings.HasPrefix(module, prefix) {
557 continue
558 } else {
559 result = append(result, module)
560 }
561 }
562 return result
563 }
564 ctx.Strict(txt.makeVarName, strings.Join(filter(txt.moduleNames, txt.filterOutFromMakeVar), " "))
Colin Cross78212242021-01-06 14:51:30 -0800565}
566
Jooyung Han0703fd82020-08-26 22:11:53 +0900567// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900568func (txt *vndkLibrariesTxt) OutputFile() android.OutputPath {
569 return txt.outputFile
570}
571
Jooyung Han0703fd82020-08-26 22:11:53 +0900572// PrebuiltEtcModule interface
573func (txt *vndkLibrariesTxt) BaseDir() string {
574 return "etc"
Jooyung Han39edb6c2019-11-06 16:53:07 +0900575}
576
Jooyung Han0703fd82020-08-26 22:11:53 +0900577// PrebuiltEtcModule interface
Jooyung Han39edb6c2019-11-06 16:53:07 +0900578func (txt *vndkLibrariesTxt) SubDir() string {
579 return ""
580}
581
Jooyung Han0703fd82020-08-26 22:11:53 +0900582func (txt *vndkLibrariesTxt) OutputFiles(tag string) (android.Paths, error) {
583 return android.Paths{txt.outputFile}, nil
584}
585
Inseob Kim1f086e22019-05-09 13:29:15 +0900586func VndkSnapshotSingleton() android.Singleton {
587 return &vndkSnapshotSingleton{}
588}
589
Jooyung Han0302a842019-10-30 18:43:49 +0900590type vndkSnapshotSingleton struct {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900591 vndkLibrariesFile android.OutputPath
592 vndkSnapshotZipFile android.OptionalPath
Jooyung Han0302a842019-10-30 18:43:49 +0900593}
Inseob Kim1f086e22019-05-09 13:29:15 +0900594
Ivan Lozanod7586b62021-04-01 09:49:36 -0400595func isVndkSnapshotAware(config android.DeviceConfig, m LinkableInterface,
596 apexInfo android.ApexInfo) (vndkType string, isVndkSnapshotLib bool) {
Colin Cross56a83212020-09-15 18:30:11 -0700597
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900598 if m.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400599 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900600 }
Jooyung Han261e1582020-10-20 18:54:21 +0900601 // !inVendor: There's product/vendor variants for VNDK libs. We only care about vendor variants.
602 // !installable: Snapshot only cares about "installable" modules.
Justin Yun450ae722021-04-16 19:58:18 +0900603 // !m.IsLlndk: llndk stubs are required for building against snapshots.
Ivan Lozano3a7d0002021-03-30 12:19:36 -0400604 // IsSnapshotPrebuilt: Snapshotting a snapshot doesn't make sense.
Justin Yun450ae722021-04-16 19:58:18 +0900605 // !outputFile.Valid: Snapshot requires valid output file.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400606 if !m.InVendor() || (!installable(m, apexInfo) && !m.IsLlndk()) || m.IsSnapshotPrebuilt() || !m.OutputFile().Valid() {
607 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900608 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400609 if !m.IsSnapshotLibrary() || !m.Shared() {
610 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900611 }
Justin Yun450ae722021-04-16 19:58:18 +0900612 if m.VndkVersion() == config.PlatformVndkVersion() {
613 if m.IsVndk() && !m.IsVndkExt() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400614 if m.IsVndkSp() {
615 return "vndk-sp", true
Justin Yun450ae722021-04-16 19:58:18 +0900616 } else {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400617 return "vndk-core", true
Justin Yun450ae722021-04-16 19:58:18 +0900618 }
Ivan Lozanod7586b62021-04-01 09:49:36 -0400619 } else if m.HasLlndkStubs() && m.StubsVersion() == "" {
Justin Yun450ae722021-04-16 19:58:18 +0900620 // Use default version for the snapshot.
Ivan Lozanod7586b62021-04-01 09:49:36 -0400621 return "llndk-stub", true
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900622 }
623 }
624
Ivan Lozanod7586b62021-04-01 09:49:36 -0400625 return "", false
Inseob Kimeda2e9c2020-03-03 22:06:32 +0900626}
627
Inseob Kim1f086e22019-05-09 13:29:15 +0900628func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
Jooyung Han0302a842019-10-30 18:43:49 +0900629 // build these files even if PlatformVndkVersion or BoardVndkVersion is not set
630 c.buildVndkLibrariesTxtFiles(ctx)
631
Inseob Kim1f086e22019-05-09 13:29:15 +0900632 // BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot.
633 if ctx.DeviceConfig().VndkVersion() != "current" {
634 return
635 }
636
637 if ctx.DeviceConfig().PlatformVndkVersion() == "" {
638 return
639 }
640
Inseob Kim242ef0c2019-10-22 20:15:20 +0900641 var snapshotOutputs android.Paths
642
643 /*
644 VNDK snapshot zipped artifacts directory structure:
645 {SNAPSHOT_ARCH}/
646 arch-{TARGET_ARCH}-{TARGET_ARCH_VARIANT}/
647 shared/
648 vndk-core/
649 (VNDK-core libraries, e.g. libbinder.so)
650 vndk-sp/
651 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900652 llndk-stub/
653 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900654 arch-{TARGET_2ND_ARCH}-{TARGET_2ND_ARCH_VARIANT}/
655 shared/
656 vndk-core/
657 (VNDK-core libraries, e.g. libbinder.so)
658 vndk-sp/
659 (VNDK-SP libraries, e.g. libc++.so)
Justin Yun450ae722021-04-16 19:58:18 +0900660 llndk-stub/
661 (LLNDK stub libraries)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900662 binder32/
663 (This directory is newly introduced in v28 (Android P) to hold
664 prebuilts built for 32-bit binder interface.)
665 arch-{TARGET_ARCH}-{TARGE_ARCH_VARIANT}/
666 ...
667 configs/
668 (various *.txt configuration files)
669 include/
670 (header files of same directory structure with source tree)
671 NOTICE_FILES/
672 (notice files of libraries, e.g. libcutils.so.txt)
673 */
Inseob Kim1f086e22019-05-09 13:29:15 +0900674
675 snapshotDir := "vndk-snapshot"
Inseob Kim242ef0c2019-10-22 20:15:20 +0900676 snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
Inseob Kim1f086e22019-05-09 13:29:15 +0900677
Inseob Kim242ef0c2019-10-22 20:15:20 +0900678 configsDir := filepath.Join(snapshotArchDir, "configs")
679 noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
680 includeDir := filepath.Join(snapshotArchDir, "include")
681
Inseob Kim242ef0c2019-10-22 20:15:20 +0900682 // set of notice files copied.
Inseob Kim1f086e22019-05-09 13:29:15 +0900683 noticeBuilt := make(map[string]bool)
684
Inseob Kim242ef0c2019-10-22 20:15:20 +0900685 // paths of VNDK modules for GPL license checking
686 modulePaths := make(map[string]string)
687
688 // actual module names of .so files
689 // e.g. moduleNames["libprotobuf-cpp-full-3.9.1.so"] = "libprotobuf-cpp-full"
690 moduleNames := make(map[string]string)
691
Inseob Kim8471cda2019-11-15 09:59:12 +0900692 var headers android.Paths
Inseob Kim242ef0c2019-10-22 20:15:20 +0900693
Inseob Kimde5744a2020-12-02 13:14:28 +0900694 // installVndkSnapshotLib copies built .so file from the module.
695 // Also, if the build artifacts is on, write a json file which contains all exported flags
696 // with FlagExporterInfo.
Colin Cross0de8a1e2020-09-18 14:15:30 -0700697 installVndkSnapshotLib := func(m *Module, vndkType string) (android.Paths, bool) {
Inseob Kim242ef0c2019-10-22 20:15:20 +0900698 var ret android.Paths
699
Inseob Kim8471cda2019-11-15 09:59:12 +0900700 targetArch := "arch-" + m.Target().Arch.ArchType.String()
701 if m.Target().Arch.ArchVariant != "" {
702 targetArch += "-" + m.Target().Arch.ArchVariant
Inseob Kim242ef0c2019-10-22 20:15:20 +0900703 }
Inseob Kimae553032019-05-14 18:52:49 +0900704
Inseob Kim8471cda2019-11-15 09:59:12 +0900705 libPath := m.outputFile.Path()
706 snapshotLibOut := filepath.Join(snapshotArchDir, targetArch, "shared", vndkType, libPath.Base())
Inseob Kimde5744a2020-12-02 13:14:28 +0900707 ret = append(ret, copyFileRule(ctx, libPath, snapshotLibOut))
Inseob Kim8471cda2019-11-15 09:59:12 +0900708
Inseob Kimae553032019-05-14 18:52:49 +0900709 if ctx.Config().VndkSnapshotBuildArtifacts() {
710 prop := struct {
711 ExportedDirs []string `json:",omitempty"`
712 ExportedSystemDirs []string `json:",omitempty"`
713 ExportedFlags []string `json:",omitempty"`
714 RelativeInstallPath string `json:",omitempty"`
715 }{}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700716 exportedInfo := ctx.ModuleProvider(m, FlagExporterInfoProvider).(FlagExporterInfo)
717 prop.ExportedFlags = exportedInfo.Flags
718 prop.ExportedDirs = exportedInfo.IncludeDirs.Strings()
719 prop.ExportedSystemDirs = exportedInfo.SystemIncludeDirs.Strings()
Inseob Kimae553032019-05-14 18:52:49 +0900720 prop.RelativeInstallPath = m.RelativeInstallPath()
721
Inseob Kim242ef0c2019-10-22 20:15:20 +0900722 propOut := snapshotLibOut + ".json"
Inseob Kimae553032019-05-14 18:52:49 +0900723
724 j, err := json.Marshal(prop)
725 if err != nil {
726 ctx.Errorf("json marshal to %q failed: %#v", propOut, err)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900727 return nil, false
Inseob Kimae553032019-05-14 18:52:49 +0900728 }
Inseob Kimde5744a2020-12-02 13:14:28 +0900729 ret = append(ret, writeStringToFileRule(ctx, string(j), propOut))
Inseob Kimae553032019-05-14 18:52:49 +0900730 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900731 return ret, true
Inseob Kimae553032019-05-14 18:52:49 +0900732 }
733
Inseob Kim1f086e22019-05-09 13:29:15 +0900734 ctx.VisitAllModules(func(module android.Module) {
735 m, ok := module.(*Module)
Inseob Kimae553032019-05-14 18:52:49 +0900736 if !ok || !m.Enabled() {
Inseob Kim1f086e22019-05-09 13:29:15 +0900737 return
738 }
739
Colin Cross56a83212020-09-15 18:30:11 -0700740 apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
741
Ivan Lozanod7586b62021-04-01 09:49:36 -0400742 vndkType, ok := isVndkSnapshotAware(ctx.DeviceConfig(), m, apexInfo)
Inseob Kimae553032019-05-14 18:52:49 +0900743 if !ok {
dimitry51ea18a2019-05-20 10:39:52 +0200744 return
745 }
746
Inseob Kimde5744a2020-12-02 13:14:28 +0900747 // For all snapshot candidates, the followings are captured.
748 // - .so files
749 // - notice files
750 //
751 // The followings are also captured if VNDK_SNAPSHOT_BUILD_ARTIFACTS.
752 // - .json files containing exported flags
753 // - exported headers from collectHeadersForSnapshot()
754 //
755 // Headers are deduplicated after visiting all modules.
756
Inseob Kim8471cda2019-11-15 09:59:12 +0900757 // install .so files for appropriate modules.
758 // Also install .json files if VNDK_SNAPSHOT_BUILD_ARTIFACTS
Colin Cross0de8a1e2020-09-18 14:15:30 -0700759 libs, ok := installVndkSnapshotLib(m, vndkType)
Inseob Kimae553032019-05-14 18:52:49 +0900760 if !ok {
Inseob Kim1f086e22019-05-09 13:29:15 +0900761 return
762 }
Inseob Kim242ef0c2019-10-22 20:15:20 +0900763 snapshotOutputs = append(snapshotOutputs, libs...)
Inseob Kim1f086e22019-05-09 13:29:15 +0900764
Inseob Kim8471cda2019-11-15 09:59:12 +0900765 // These are for generating module_names.txt and module_paths.txt
766 stem := m.outputFile.Path().Base()
767 moduleNames[stem] = ctx.ModuleName(m)
768 modulePaths[stem] = ctx.ModuleDir(m)
769
Bob Badoura75b0572020-02-18 20:21:55 -0800770 if len(m.NoticeFiles()) > 0 {
Inseob Kim8471cda2019-11-15 09:59:12 +0900771 noticeName := stem + ".txt"
772 // skip already copied notice file
773 if _, ok := noticeBuilt[noticeName]; !ok {
774 noticeBuilt[noticeName] = true
Inseob Kimde5744a2020-12-02 13:14:28 +0900775 snapshotOutputs = append(snapshotOutputs, combineNoticesRule(
Bob Badoura75b0572020-02-18 20:21:55 -0800776 ctx, m.NoticeFiles(), filepath.Join(noticeDir, noticeName)))
Inseob Kim8471cda2019-11-15 09:59:12 +0900777 }
778 }
779
780 if ctx.Config().VndkSnapshotBuildArtifacts() {
Ivan Lozanod7586b62021-04-01 09:49:36 -0400781 headers = append(headers, m.SnapshotHeaders()...)
Inseob Kimae553032019-05-14 18:52:49 +0900782 }
783 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900784
Inseob Kim8471cda2019-11-15 09:59:12 +0900785 // install all headers after removing duplicates
786 for _, header := range android.FirstUniquePaths(headers) {
Inseob Kimde5744a2020-12-02 13:14:28 +0900787 snapshotOutputs = append(snapshotOutputs, copyFileRule(
Inseob Kim8471cda2019-11-15 09:59:12 +0900788 ctx, header, filepath.Join(includeDir, header.String())))
Inseob Kimae553032019-05-14 18:52:49 +0900789 }
790
Jooyung Han39edb6c2019-11-06 16:53:07 +0900791 // install *.libraries.txt except vndkcorevariant.libraries.txt
792 ctx.VisitAllModules(func(module android.Module) {
793 m, ok := module.(*vndkLibrariesTxt)
794 if !ok || !m.Enabled() || m.Name() == vndkUsingCoreVariantLibrariesTxt {
795 return
796 }
Inseob Kimde5744a2020-12-02 13:14:28 +0900797 snapshotOutputs = append(snapshotOutputs, copyFileRule(
Inseob Kim8471cda2019-11-15 09:59:12 +0900798 ctx, m.OutputFile(), filepath.Join(configsDir, m.Name())))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900799 })
Inseob Kim1f086e22019-05-09 13:29:15 +0900800
Inseob Kim242ef0c2019-10-22 20:15:20 +0900801 /*
Inseob Kim242ef0c2019-10-22 20:15:20 +0900802 module_paths.txt contains paths on which VNDK modules are defined.
803 e.g.,
Baligh Uddin637df8e2020-10-26 14:34:53 +0000804 libbase.so system/libbase
Inseob Kim242ef0c2019-10-22 20:15:20 +0900805 libc.so bionic/libc
806 ...
807 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900808 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, modulePaths, filepath.Join(configsDir, "module_paths.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900809
810 /*
811 module_names.txt contains names as which VNDK modules are defined,
812 because output filename and module name can be different with stem and suffix properties.
813
814 e.g.,
815 libcutils.so libcutils
816 libprotobuf-cpp-full-3.9.2.so libprotobuf-cpp-full
817 ...
818 */
Inseob Kimde5744a2020-12-02 13:14:28 +0900819 snapshotOutputs = append(snapshotOutputs, installMapListFileRule(ctx, moduleNames, filepath.Join(configsDir, "module_names.txt")))
Inseob Kim242ef0c2019-10-22 20:15:20 +0900820
821 // All artifacts are ready. Sort them to normalize ninja and then zip.
822 sort.Slice(snapshotOutputs, func(i, j int) bool {
823 return snapshotOutputs[i].String() < snapshotOutputs[j].String()
824 })
825
826 zipPath := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+".zip")
Colin Crossf1a035e2020-11-16 17:32:30 -0800827 zipRule := android.NewRuleBuilder(pctx, ctx)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900828
Inseob Kimde5744a2020-12-02 13:14:28 +0900829 // filenames in rspfile from FlagWithRspFileInputList might be single-quoted. Remove it with tr
Inseob Kim242ef0c2019-10-22 20:15:20 +0900830 snapshotOutputList := android.PathForOutput(ctx, snapshotDir, "android-vndk-"+ctx.DeviceConfig().DeviceArch()+"_list")
Colin Cross70c47412021-03-12 17:48:14 -0800831 rspFile := snapshotOutputList.ReplaceExtension(ctx, "rsp")
Inseob Kim242ef0c2019-10-22 20:15:20 +0900832 zipRule.Command().
Inseob Kim8471cda2019-11-15 09:59:12 +0900833 Text("tr").
834 FlagWithArg("-d ", "\\'").
Colin Cross70c47412021-03-12 17:48:14 -0800835 FlagWithRspFileInputList("< ", rspFile, snapshotOutputs).
Inseob Kim8471cda2019-11-15 09:59:12 +0900836 FlagWithOutput("> ", snapshotOutputList)
Inseob Kim242ef0c2019-10-22 20:15:20 +0900837
838 zipRule.Temporary(snapshotOutputList)
839
840 zipRule.Command().
Colin Crossf1a035e2020-11-16 17:32:30 -0800841 BuiltTool("soong_zip").
Inseob Kim242ef0c2019-10-22 20:15:20 +0900842 FlagWithOutput("-o ", zipPath).
843 FlagWithArg("-C ", android.PathForOutput(ctx, snapshotDir).String()).
844 FlagWithInput("-l ", snapshotOutputList)
845
Colin Crossf1a035e2020-11-16 17:32:30 -0800846 zipRule.Build(zipPath.String(), "vndk snapshot "+zipPath.String())
Inseob Kim8471cda2019-11-15 09:59:12 +0900847 zipRule.DeleteTemporaryFiles()
Inseob Kim242ef0c2019-10-22 20:15:20 +0900848 c.vndkSnapshotZipFile = android.OptionalPathForPath(zipPath)
Inseob Kim1f086e22019-05-09 13:29:15 +0900849}
Jooyung Han097087b2019-10-22 19:32:18 +0900850
Jooyung Han0302a842019-10-30 18:43:49 +0900851func getVndkFileName(m *Module) (string, error) {
852 if library, ok := m.linker.(*libraryDecorator); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900853 return library.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900854 }
855 if prebuilt, ok := m.linker.(*prebuiltLibraryLinker); ok {
Justin Yun6977e8a2020-10-29 18:24:11 +0900856 return prebuilt.libraryDecorator.getLibNameHelper(m.BaseModuleName(), true, false) + ".so", nil
Jooyung Han0302a842019-10-30 18:43:49 +0900857 }
858 return "", fmt.Errorf("VNDK library should have libraryDecorator or prebuiltLibraryLinker as linker: %T", m.linker)
Jooyung Han097087b2019-10-22 19:32:18 +0900859}
860
861func (c *vndkSnapshotSingleton) buildVndkLibrariesTxtFiles(ctx android.SingletonContext) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900862 // Build list of vndk libs as merged & tagged & filter-out(libclang_rt):
Jooyung Han0302a842019-10-30 18:43:49 +0900863 // Since each target have different set of libclang_rt.* files,
864 // keep the common set of files in vndk.libraries.txt
Colin Cross78212242021-01-06 14:51:30 -0800865 _, llndk := vndkModuleListRemover(llndkLibraries, "libclang_rt.")(ctx)
866 _, vndkcore := vndkModuleListRemover(vndkCoreLibraries, "libclang_rt.")(ctx)
867 _, vndksp := vndkSPLibraries(ctx)
868 _, vndkprivate := vndkPrivateLibraries(ctx)
869 _, vndkproduct := vndkModuleListRemover(vndkProductLibraries, "libclang_rt.")(ctx)
Jooyung Han0302a842019-10-30 18:43:49 +0900870 var merged []string
Colin Cross78212242021-01-06 14:51:30 -0800871 merged = append(merged, addPrefix(llndk, "LLNDK: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900872 merged = append(merged, addPrefix(vndksp, "VNDK-SP: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800873 merged = append(merged, addPrefix(vndkcore, "VNDK-core: ")...)
Jooyung Han097087b2019-10-22 19:32:18 +0900874 merged = append(merged, addPrefix(vndkprivate, "VNDK-private: ")...)
Colin Cross78212242021-01-06 14:51:30 -0800875 merged = append(merged, addPrefix(vndkproduct, "VNDK-product: ")...)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900876 c.vndkLibrariesFile = android.PathForOutput(ctx, "vndk", "vndk.libraries.txt")
Colin Crosscf371cc2020-11-13 11:48:42 -0800877 android.WriteFileRule(ctx, c.vndkLibrariesFile, strings.Join(merged, "\n"))
Jooyung Han0302a842019-10-30 18:43:49 +0900878}
Jooyung Han097087b2019-10-22 19:32:18 +0900879
Jooyung Han0302a842019-10-30 18:43:49 +0900880func (c *vndkSnapshotSingleton) MakeVars(ctx android.MakeVarsContext) {
881 // Make uses LLNDK_MOVED_TO_APEX_LIBRARIES to avoid installing libraries on /system if
882 // they been moved to an apex.
Colin Cross56a83212020-09-15 18:30:11 -0700883 movedToApexLlndkLibraries := make(map[string]bool)
884 ctx.VisitAllModules(func(module android.Module) {
Colin Cross127bb8b2020-12-16 16:46:01 -0800885 if library := moduleLibraryInterface(module); library != nil && library.hasLLNDKStubs() {
886 // Skip bionic libs, they are handled in different manner
887 name := library.implementationModuleName(module.(*Module).BaseModuleName())
888 if module.(android.ApexModule).DirectlyInAnyApex() && !isBionic(name) {
889 movedToApexLlndkLibraries[name] = true
Colin Cross56a83212020-09-15 18:30:11 -0700890 }
Jooyung Han0302a842019-10-30 18:43:49 +0900891 }
Colin Cross56a83212020-09-15 18:30:11 -0700892 })
893
894 ctx.Strict("LLNDK_MOVED_TO_APEX_LIBRARIES",
895 strings.Join(android.SortedStringKeys(movedToApexLlndkLibraries), " "))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900896
Jooyung Han0302a842019-10-30 18:43:49 +0900897 ctx.Strict("VNDK_LIBRARIES_FILE", c.vndkLibrariesFile.String())
Inseob Kim242ef0c2019-10-22 20:15:20 +0900898 ctx.Strict("SOONG_VNDK_SNAPSHOT_ZIP", c.vndkSnapshotZipFile.String())
Jooyung Han097087b2019-10-22 19:32:18 +0900899}