xref: /aosp_15_r20/build/soong/cc/sabi.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"sync"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc/config"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workervar (
25*333d2b36SAndroid Build Coastguard Worker	lsdumpPathsLock sync.Mutex
26*333d2b36SAndroid Build Coastguard Worker	lsdumpKey       = android.NewOnceKey("lsdump")
27*333d2b36SAndroid Build Coastguard Worker)
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Workerfunc lsdumpPaths(config android.Config) *[]string {
30*333d2b36SAndroid Build Coastguard Worker	return config.Once(lsdumpKey, func() any {
31*333d2b36SAndroid Build Coastguard Worker		return &[]string{}
32*333d2b36SAndroid Build Coastguard Worker	}).(*[]string)
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workertype lsdumpTag string
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workerconst (
38*333d2b36SAndroid Build Coastguard Worker	apexLsdumpTag     lsdumpTag = "APEX"
39*333d2b36SAndroid Build Coastguard Worker	llndkLsdumpTag    lsdumpTag = "LLNDK"
40*333d2b36SAndroid Build Coastguard Worker	platformLsdumpTag lsdumpTag = "PLATFORM"
41*333d2b36SAndroid Build Coastguard Worker	productLsdumpTag  lsdumpTag = "PRODUCT"
42*333d2b36SAndroid Build Coastguard Worker	vendorLsdumpTag   lsdumpTag = "VENDOR"
43*333d2b36SAndroid Build Coastguard Worker)
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker// Return the prebuilt ABI dump directory for a tag; an empty string for an opt-in dump.
46*333d2b36SAndroid Build Coastguard Workerfunc (tag *lsdumpTag) dirName() string {
47*333d2b36SAndroid Build Coastguard Worker	switch *tag {
48*333d2b36SAndroid Build Coastguard Worker	case apexLsdumpTag:
49*333d2b36SAndroid Build Coastguard Worker		return "platform"
50*333d2b36SAndroid Build Coastguard Worker	case llndkLsdumpTag:
51*333d2b36SAndroid Build Coastguard Worker		return "vndk"
52*333d2b36SAndroid Build Coastguard Worker	default:
53*333d2b36SAndroid Build Coastguard Worker		return ""
54*333d2b36SAndroid Build Coastguard Worker	}
55*333d2b36SAndroid Build Coastguard Worker}
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker// Properties for ABI compatibility checker in Android.bp.
58*333d2b36SAndroid Build Coastguard Workertype headerAbiCheckerProperties struct {
59*333d2b36SAndroid Build Coastguard Worker	// Enable ABI checks (even if this is not an LLNDK/VNDK lib)
60*333d2b36SAndroid Build Coastguard Worker	Enabled *bool
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker	// Path to a symbol file that specifies the symbols to be included in the generated
63*333d2b36SAndroid Build Coastguard Worker	// ABI dump file
64*333d2b36SAndroid Build Coastguard Worker	Symbol_file *string `android:"path"`
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	// Symbol versions that should be ignored from the symbol file
67*333d2b36SAndroid Build Coastguard Worker	Exclude_symbol_versions []string
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	// Symbol tags that should be ignored from the symbol file
70*333d2b36SAndroid Build Coastguard Worker	Exclude_symbol_tags []string
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker	// Run checks on all APIs (in addition to the ones referred by
73*333d2b36SAndroid Build Coastguard Worker	// one of exported ELF symbols.)
74*333d2b36SAndroid Build Coastguard Worker	Check_all_apis *bool
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	// Extra flags passed to header-abi-diff
77*333d2b36SAndroid Build Coastguard Worker	Diff_flags []string
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	// Opt-in reference dump directories
80*333d2b36SAndroid Build Coastguard Worker	Ref_dump_dirs []string
81*333d2b36SAndroid Build Coastguard Worker}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Workerfunc (props *headerAbiCheckerProperties) enabled() bool {
84*333d2b36SAndroid Build Coastguard Worker	return Bool(props.Enabled)
85*333d2b36SAndroid Build Coastguard Worker}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Workerfunc (props *headerAbiCheckerProperties) explicitlyDisabled() bool {
88*333d2b36SAndroid Build Coastguard Worker	return !BoolDefault(props.Enabled, true)
89*333d2b36SAndroid Build Coastguard Worker}
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Workertype SAbiProperties struct {
92*333d2b36SAndroid Build Coastguard Worker	// Whether ABI dump should be created for this module.
93*333d2b36SAndroid Build Coastguard Worker	// Set by `sabiTransitionMutator` if this module is a shared library that needs ABI check,
94*333d2b36SAndroid Build Coastguard Worker	// or a static library that is depended on by an ABI checked library.
95*333d2b36SAndroid Build Coastguard Worker	ShouldCreateSourceAbiDump bool `blueprint:"mutated"`
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker	// Include directories that may contain ABI information exported by a library.
98*333d2b36SAndroid Build Coastguard Worker	// These directories are passed to the header-abi-dumper.
99*333d2b36SAndroid Build Coastguard Worker	ReexportedIncludes       []string `blueprint:"mutated"`
100*333d2b36SAndroid Build Coastguard Worker	ReexportedSystemIncludes []string `blueprint:"mutated"`
101*333d2b36SAndroid Build Coastguard Worker}
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Workertype sabi struct {
104*333d2b36SAndroid Build Coastguard Worker	Properties SAbiProperties
105*333d2b36SAndroid Build Coastguard Worker}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Workerfunc (sabi *sabi) props() []interface{} {
108*333d2b36SAndroid Build Coastguard Worker	return []interface{}{&sabi.Properties}
109*333d2b36SAndroid Build Coastguard Worker}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Workerfunc (sabi *sabi) flags(ctx ModuleContext, flags Flags) Flags {
112*333d2b36SAndroid Build Coastguard Worker	// Filter out flags which libTooling don't understand.
113*333d2b36SAndroid Build Coastguard Worker	// This is here for legacy reasons and future-proof, in case the version of libTooling and clang
114*333d2b36SAndroid Build Coastguard Worker	// diverge.
115*333d2b36SAndroid Build Coastguard Worker	flags.Local.ToolingCFlags = config.ClangLibToolingFilterUnknownCflags(flags.Local.CFlags)
116*333d2b36SAndroid Build Coastguard Worker	flags.Global.ToolingCFlags = config.ClangLibToolingFilterUnknownCflags(flags.Global.CFlags)
117*333d2b36SAndroid Build Coastguard Worker	flags.Local.ToolingCppFlags = config.ClangLibToolingFilterUnknownCflags(flags.Local.CppFlags)
118*333d2b36SAndroid Build Coastguard Worker	flags.Global.ToolingCppFlags = config.ClangLibToolingFilterUnknownCflags(flags.Global.CppFlags)
119*333d2b36SAndroid Build Coastguard Worker	return flags
120*333d2b36SAndroid Build Coastguard Worker}
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Worker// Returns true if ABI dump should be created for this library, either because library is ABI
123*333d2b36SAndroid Build Coastguard Worker// checked or is depended on by an ABI checked library.
124*333d2b36SAndroid Build Coastguard Worker// Could be called as a nil receiver.
125*333d2b36SAndroid Build Coastguard Workerfunc (sabi *sabi) shouldCreateSourceAbiDump() bool {
126*333d2b36SAndroid Build Coastguard Worker	return sabi != nil && sabi.Properties.ShouldCreateSourceAbiDump
127*333d2b36SAndroid Build Coastguard Worker}
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker// Returns a slice of strings that represent the ABI dumps generated for this module.
130*333d2b36SAndroid Build Coastguard Workerfunc classifySourceAbiDump(m *Module) []lsdumpTag {
131*333d2b36SAndroid Build Coastguard Worker	result := []lsdumpTag{}
132*333d2b36SAndroid Build Coastguard Worker	headerAbiChecker := m.library.getHeaderAbiCheckerProperties(m)
133*333d2b36SAndroid Build Coastguard Worker	if headerAbiChecker.explicitlyDisabled() {
134*333d2b36SAndroid Build Coastguard Worker		return result
135*333d2b36SAndroid Build Coastguard Worker	}
136*333d2b36SAndroid Build Coastguard Worker	if !m.InProduct() && !m.InVendor() {
137*333d2b36SAndroid Build Coastguard Worker		if m.isImplementationForLLNDKPublic() {
138*333d2b36SAndroid Build Coastguard Worker			result = append(result, llndkLsdumpTag)
139*333d2b36SAndroid Build Coastguard Worker		}
140*333d2b36SAndroid Build Coastguard Worker		if m.library.hasStubsVariants() {
141*333d2b36SAndroid Build Coastguard Worker			result = append(result, apexLsdumpTag)
142*333d2b36SAndroid Build Coastguard Worker		}
143*333d2b36SAndroid Build Coastguard Worker		if headerAbiChecker.enabled() {
144*333d2b36SAndroid Build Coastguard Worker			result = append(result, platformLsdumpTag)
145*333d2b36SAndroid Build Coastguard Worker		}
146*333d2b36SAndroid Build Coastguard Worker	} else if headerAbiChecker.enabled() {
147*333d2b36SAndroid Build Coastguard Worker		if m.InProduct() {
148*333d2b36SAndroid Build Coastguard Worker			result = append(result, productLsdumpTag)
149*333d2b36SAndroid Build Coastguard Worker		}
150*333d2b36SAndroid Build Coastguard Worker		if m.InVendor() {
151*333d2b36SAndroid Build Coastguard Worker			result = append(result, vendorLsdumpTag)
152*333d2b36SAndroid Build Coastguard Worker		}
153*333d2b36SAndroid Build Coastguard Worker	}
154*333d2b36SAndroid Build Coastguard Worker	return result
155*333d2b36SAndroid Build Coastguard Worker}
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Workertype shouldCreateAbiDumpContext interface {
158*333d2b36SAndroid Build Coastguard Worker	android.ModuleProviderContext
159*333d2b36SAndroid Build Coastguard Worker	Module() android.Module
160*333d2b36SAndroid Build Coastguard Worker	Config() android.Config
161*333d2b36SAndroid Build Coastguard Worker}
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Workervar _ shouldCreateAbiDumpContext = android.ModuleContext(nil)
164*333d2b36SAndroid Build Coastguard Workervar _ shouldCreateAbiDumpContext = android.OutgoingTransitionContext(nil)
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker// Called from sabiTransitionMutator to check whether ABI dumps should be created for this module.
167*333d2b36SAndroid Build Coastguard Worker// ctx should be wrapping a native library type module.
168*333d2b36SAndroid Build Coastguard Workerfunc shouldCreateSourceAbiDumpForLibrary(ctx shouldCreateAbiDumpContext) bool {
169*333d2b36SAndroid Build Coastguard Worker	m, ok := ctx.Module().(*Module)
170*333d2b36SAndroid Build Coastguard Worker	if !ok {
171*333d2b36SAndroid Build Coastguard Worker		return false
172*333d2b36SAndroid Build Coastguard Worker	}
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker	// Only generate ABI dump for device modules.
175*333d2b36SAndroid Build Coastguard Worker	if !m.Device() {
176*333d2b36SAndroid Build Coastguard Worker		return false
177*333d2b36SAndroid Build Coastguard Worker	}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	// Only create ABI dump for native library module types.
180*333d2b36SAndroid Build Coastguard Worker	if m.library == nil {
181*333d2b36SAndroid Build Coastguard Worker		return false
182*333d2b36SAndroid Build Coastguard Worker	}
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Worker	// Don't create ABI dump for static libraries
185*333d2b36SAndroid Build Coastguard Worker	// The sabi variant will be propagated to dependencies of ABI checked libraries.
186*333d2b36SAndroid Build Coastguard Worker	if m.library.static() {
187*333d2b36SAndroid Build Coastguard Worker		return false
188*333d2b36SAndroid Build Coastguard Worker	}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker	// Module is shared library type.
191*333d2b36SAndroid Build Coastguard Worker
192*333d2b36SAndroid Build Coastguard Worker	// Don't check uninstallable modules.
193*333d2b36SAndroid Build Coastguard Worker	if m.IsHideFromMake() {
194*333d2b36SAndroid Build Coastguard Worker		return false
195*333d2b36SAndroid Build Coastguard Worker	}
196*333d2b36SAndroid Build Coastguard Worker
197*333d2b36SAndroid Build Coastguard Worker	// Don't check ramdisk or recovery variants. Only check core, vendor or product variants.
198*333d2b36SAndroid Build Coastguard Worker	if m.InRamdisk() || m.InVendorRamdisk() || m.InRecovery() {
199*333d2b36SAndroid Build Coastguard Worker		return false
200*333d2b36SAndroid Build Coastguard Worker	}
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Worker	// Don't create ABI dump for prebuilts.
203*333d2b36SAndroid Build Coastguard Worker	if m.Prebuilt() != nil || m.IsSnapshotPrebuilt() {
204*333d2b36SAndroid Build Coastguard Worker		return false
205*333d2b36SAndroid Build Coastguard Worker	}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker	// Coverage builds have extra symbols.
208*333d2b36SAndroid Build Coastguard Worker	if m.isCoverageVariant() {
209*333d2b36SAndroid Build Coastguard Worker		return false
210*333d2b36SAndroid Build Coastguard Worker	}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Worker	// Some sanitizer variants may have different ABI.
213*333d2b36SAndroid Build Coastguard Worker	if m.sanitize != nil && !m.sanitize.isVariantOnProductionDevice() {
214*333d2b36SAndroid Build Coastguard Worker		return false
215*333d2b36SAndroid Build Coastguard Worker	}
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Worker	// Don't create ABI dump for stubs.
218*333d2b36SAndroid Build Coastguard Worker	if m.isNDKStubLibrary() || m.IsLlndk() || m.IsStubs() {
219*333d2b36SAndroid Build Coastguard Worker		return false
220*333d2b36SAndroid Build Coastguard Worker	}
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
223*333d2b36SAndroid Build Coastguard Worker	if apexInfo.IsForPlatform() {
224*333d2b36SAndroid Build Coastguard Worker		// Bionic libraries that are installed to the bootstrap directory are not ABI checked.
225*333d2b36SAndroid Build Coastguard Worker		// Only the runtime APEX variants, which are the implementation libraries of bionic NDK stubs,
226*333d2b36SAndroid Build Coastguard Worker		// are checked.
227*333d2b36SAndroid Build Coastguard Worker		if InstallToBootstrap(m.BaseModuleName(), ctx.Config()) {
228*333d2b36SAndroid Build Coastguard Worker			return false
229*333d2b36SAndroid Build Coastguard Worker		}
230*333d2b36SAndroid Build Coastguard Worker	} else {
231*333d2b36SAndroid Build Coastguard Worker		// Don't create ABI dump if this library is for APEX but isn't exported.
232*333d2b36SAndroid Build Coastguard Worker		if !m.HasStubsVariants() {
233*333d2b36SAndroid Build Coastguard Worker			return false
234*333d2b36SAndroid Build Coastguard Worker		}
235*333d2b36SAndroid Build Coastguard Worker	}
236*333d2b36SAndroid Build Coastguard Worker	return len(classifySourceAbiDump(m)) > 0
237*333d2b36SAndroid Build Coastguard Worker}
238*333d2b36SAndroid Build Coastguard Worker
239*333d2b36SAndroid Build Coastguard Worker// Mark the direct and transitive dependencies of libraries that need ABI check, so that ABI dumps
240*333d2b36SAndroid Build Coastguard Worker// of their dependencies would be generated.
241*333d2b36SAndroid Build Coastguard Workertype sabiTransitionMutator struct{}
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) Split(ctx android.BaseModuleContext) []string {
244*333d2b36SAndroid Build Coastguard Worker	return []string{""}
245*333d2b36SAndroid Build Coastguard Worker}
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
248*333d2b36SAndroid Build Coastguard Worker	// Escape hatch to not check any ABI dump.
249*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
250*333d2b36SAndroid Build Coastguard Worker		return ""
251*333d2b36SAndroid Build Coastguard Worker	}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker	// Only create ABI dump for native shared libraries and their static library dependencies.
254*333d2b36SAndroid Build Coastguard Worker	if m, ok := ctx.Module().(*Module); ok && m.sabi != nil {
255*333d2b36SAndroid Build Coastguard Worker		if shouldCreateSourceAbiDumpForLibrary(ctx) {
256*333d2b36SAndroid Build Coastguard Worker			if IsStaticDepTag(ctx.DepTag()) || ctx.DepTag() == reuseObjTag {
257*333d2b36SAndroid Build Coastguard Worker				return "sabi"
258*333d2b36SAndroid Build Coastguard Worker			}
259*333d2b36SAndroid Build Coastguard Worker		} else if sourceVariation == "sabi" {
260*333d2b36SAndroid Build Coastguard Worker			if IsWholeStaticLib(ctx.DepTag()) || ctx.DepTag() == reuseObjTag {
261*333d2b36SAndroid Build Coastguard Worker				return "sabi"
262*333d2b36SAndroid Build Coastguard Worker			}
263*333d2b36SAndroid Build Coastguard Worker		}
264*333d2b36SAndroid Build Coastguard Worker	}
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker	return ""
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
270*333d2b36SAndroid Build Coastguard Worker	if incomingVariation == "" {
271*333d2b36SAndroid Build Coastguard Worker		return ""
272*333d2b36SAndroid Build Coastguard Worker	}
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Worker	if incomingVariation == "sabi" {
275*333d2b36SAndroid Build Coastguard Worker		if m, ok := ctx.Module().(*Module); ok && m.sabi != nil {
276*333d2b36SAndroid Build Coastguard Worker			return "sabi"
277*333d2b36SAndroid Build Coastguard Worker		}
278*333d2b36SAndroid Build Coastguard Worker	}
279*333d2b36SAndroid Build Coastguard Worker
280*333d2b36SAndroid Build Coastguard Worker	return ""
281*333d2b36SAndroid Build Coastguard Worker}
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Workerfunc (s *sabiTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
284*333d2b36SAndroid Build Coastguard Worker	if m, ok := ctx.Module().(*Module); ok && m.sabi != nil {
285*333d2b36SAndroid Build Coastguard Worker		if variation == "sabi" {
286*333d2b36SAndroid Build Coastguard Worker			m.sabi.Properties.ShouldCreateSourceAbiDump = true
287*333d2b36SAndroid Build Coastguard Worker			m.HideFromMake()
288*333d2b36SAndroid Build Coastguard Worker			m.Properties.PreventInstall = true
289*333d2b36SAndroid Build Coastguard Worker		} else if shouldCreateSourceAbiDumpForLibrary(ctx) {
290*333d2b36SAndroid Build Coastguard Worker			// Escape hatch to not check any ABI dump.
291*333d2b36SAndroid Build Coastguard Worker			if !ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
292*333d2b36SAndroid Build Coastguard Worker				m.sabi.Properties.ShouldCreateSourceAbiDump = true
293*333d2b36SAndroid Build Coastguard Worker			}
294*333d2b36SAndroid Build Coastguard Worker		}
295*333d2b36SAndroid Build Coastguard Worker	}
296*333d2b36SAndroid Build Coastguard Worker}
297*333d2b36SAndroid Build Coastguard Worker
298*333d2b36SAndroid Build Coastguard Worker// Add an entry to the global list of lsdump. The list is exported to a Make variable by
299*333d2b36SAndroid Build Coastguard Worker// `cc.makeVarsProvider`.
300*333d2b36SAndroid Build Coastguard Workerfunc addLsdumpPath(config android.Config, lsdumpPath string) {
301*333d2b36SAndroid Build Coastguard Worker	lsdumpPaths := lsdumpPaths(config)
302*333d2b36SAndroid Build Coastguard Worker	lsdumpPathsLock.Lock()
303*333d2b36SAndroid Build Coastguard Worker	defer lsdumpPathsLock.Unlock()
304*333d2b36SAndroid Build Coastguard Worker	*lsdumpPaths = append(*lsdumpPaths, lsdumpPath)
305*333d2b36SAndroid Build Coastguard Worker}
306