blob: 7db8f369122a9f5bdc309615ada39ba39b0e953d [file] [log] [blame]
Ivan Lozanoffee3342019-08-27 12:03:00 -07001// Copyright 2019 The Android Open Source Project
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 rust
16
17import (
Matthew Maurera28404a2023-11-20 23:33:28 +000018 "errors"
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +020019 "fmt"
Ivan Lozanoad8b18b2019-10-31 19:38:29 -070020 "regexp"
21 "strings"
22
Colin Cross8a49a3d2024-05-20 12:22:27 -070023 "github.com/google/blueprint"
24
Ivan Lozanoffee3342019-08-27 12:03:00 -070025 "android/soong/android"
Colin Cross0de8a1e2020-09-18 14:15:30 -070026 "android/soong/cc"
Ivan Lozanoffee3342019-08-27 12:03:00 -070027)
28
Ivan Lozano2b081132020-09-08 12:46:52 -040029var (
Ivan Lozano4df02572023-06-15 14:21:09 -040030 RlibStdlibSuffix = ".rlib-std"
Ivan Lozano2b081132020-09-08 12:46:52 -040031)
32
Ivan Lozanoffee3342019-08-27 12:03:00 -070033func init() {
34 android.RegisterModuleType("rust_library", RustLibraryFactory)
35 android.RegisterModuleType("rust_library_dylib", RustLibraryDylibFactory)
36 android.RegisterModuleType("rust_library_rlib", RustLibraryRlibFactory)
37 android.RegisterModuleType("rust_library_host", RustLibraryHostFactory)
38 android.RegisterModuleType("rust_library_host_dylib", RustLibraryDylibHostFactory)
39 android.RegisterModuleType("rust_library_host_rlib", RustLibraryRlibHostFactory)
Matthew Maurer2ae05132020-06-23 14:28:53 -070040 android.RegisterModuleType("rust_ffi", RustFFIFactory)
41 android.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory)
Ivan Lozano0a468a42024-05-13 21:03:34 -040042 android.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory)
Matthew Maurer2ae05132020-06-23 14:28:53 -070043 android.RegisterModuleType("rust_ffi_host", RustFFIHostFactory)
44 android.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory)
Ivan Lozano0a468a42024-05-13 21:03:34 -040045 android.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory)
46
47 // TODO: Remove when all instances of rust_ffi_static have been switched to rust_ffi_rlib
Ivan Lozanofd47b1a2024-05-17 14:13:41 -040048 // Alias rust_ffi_static to the rust_ffi_rlib factory
49 android.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory)
50 android.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory)
Ivan Lozanoffee3342019-08-27 12:03:00 -070051}
52
53type VariantLibraryProperties struct {
Matthew Maurerc761eec2020-06-25 00:47:46 -070054 Enabled *bool `android:"arch_variant"`
55 Srcs []string `android:"path,arch_variant"`
Ivan Lozanoffee3342019-08-27 12:03:00 -070056}
57
58type LibraryCompilerProperties struct {
Ivan Lozano52767be2019-10-18 14:49:46 -070059 Rlib VariantLibraryProperties `android:"arch_variant"`
60 Dylib VariantLibraryProperties `android:"arch_variant"`
61 Shared VariantLibraryProperties `android:"arch_variant"`
62 Static VariantLibraryProperties `android:"arch_variant"`
Ivan Lozanoffee3342019-08-27 12:03:00 -070063
Ivan Lozanof033ca62024-03-21 13:43:14 -040064 // TODO: Remove this when all instances of Include_dirs have been removed from rust_ffi modules.
65 // path to include directories to pass to cc_* modules, only relevant for static/shared variants (deprecated, use export_include_dirs instead).
Ivan Lozano52767be2019-10-18 14:49:46 -070066 Include_dirs []string `android:"path,arch_variant"`
Ivan Lozano2b081132020-09-08 12:46:52 -040067
Ivan Lozanof033ca62024-03-21 13:43:14 -040068 // path to include directories to export to cc_* modules, only relevant for static/shared variants.
69 Export_include_dirs []string `android:"path,arch_variant"`
70
Ivan Lozano2b081132020-09-08 12:46:52 -040071 // Whether this library is part of the Rust toolchain sysroot.
72 Sysroot *bool
Ashutosh Agarwal46e4fad2024-08-27 17:13:12 +000073
74 // Exclude this rust_ffi target from being included in APEXes.
75 // TODO(b/362509506): remove this once stubs are properly supported by rust_ffi targets.
76 Apex_exclude *bool
Ivan Lozanoffee3342019-08-27 12:03:00 -070077}
78
79type LibraryMutatedProperties struct {
Ivan Lozanoffee3342019-08-27 12:03:00 -070080 // Build a dylib variant
81 BuildDylib bool `blueprint:"mutated"`
82 // Build an rlib variant
83 BuildRlib bool `blueprint:"mutated"`
Ivan Lozano52767be2019-10-18 14:49:46 -070084 // Build a shared library variant
85 BuildShared bool `blueprint:"mutated"`
86 // Build a static library variant
87 BuildStatic bool `blueprint:"mutated"`
Ivan Lozanoffee3342019-08-27 12:03:00 -070088
89 // This variant is a dylib
90 VariantIsDylib bool `blueprint:"mutated"`
91 // This variant is an rlib
92 VariantIsRlib bool `blueprint:"mutated"`
Ivan Lozano52767be2019-10-18 14:49:46 -070093 // This variant is a shared library
94 VariantIsShared bool `blueprint:"mutated"`
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +020095 // This variant is a source provider
96 VariantIsSource bool `blueprint:"mutated"`
Ivan Lozano26ecd6c2020-07-31 13:40:31 -040097
98 // This variant is disabled and should not be compiled
99 // (used for SourceProvider variants that produce only source)
100 VariantIsDisabled bool `blueprint:"mutated"`
Ivan Lozano2b081132020-09-08 12:46:52 -0400101
102 // Whether this library variant should be link libstd via rlibs
103 VariantIsStaticStd bool `blueprint:"mutated"`
Ivan Lozanoffee3342019-08-27 12:03:00 -0700104}
105
106type libraryDecorator struct {
107 *baseCompiler
Matthew Maurerbb3add12020-06-25 09:34:12 -0700108 *flagExporter
Thiébaud Weksteenfabaff62020-08-27 13:48:36 +0200109 stripper Stripper
Ivan Lozanoffee3342019-08-27 12:03:00 -0700110
Ivan Lozano8a23fa42020-06-16 10:26:57 -0400111 Properties LibraryCompilerProperties
112 MutatedProperties LibraryMutatedProperties
113 includeDirs android.Paths
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400114 sourceProvider SourceProvider
Ivan Lozano1921e802021-05-20 13:39:16 -0400115
Ivan Lozano0a468a42024-05-13 21:03:34 -0400116 isFFI bool
117
Ivan Lozano7b0781d2021-11-03 15:30:18 -0400118 // table-of-contents file for cdylib crates to optimize out relinking when possible
119 tocFile android.OptionalPath
Ivan Lozanoffee3342019-08-27 12:03:00 -0700120}
121
122type libraryInterface interface {
123 rlib() bool
124 dylib() bool
Ivan Lozano52767be2019-10-18 14:49:46 -0700125 static() bool
126 shared() bool
Ivan Lozano2b081132020-09-08 12:46:52 -0400127 sysroot() bool
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200128 source() bool
Ashutosh Agarwal46e4fad2024-08-27 17:13:12 +0000129 apexExclude() bool
Ivan Lozanoffee3342019-08-27 12:03:00 -0700130
131 // Returns true if the build options for the module have selected a particular build type
132 buildRlib() bool
133 buildDylib() bool
Ivan Lozano52767be2019-10-18 14:49:46 -0700134 buildShared() bool
135 buildStatic() bool
Ivan Lozanoffee3342019-08-27 12:03:00 -0700136
137 // Sets a particular variant type
138 setRlib()
139 setDylib()
Ivan Lozano52767be2019-10-18 14:49:46 -0700140 setShared()
141 setStatic()
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200142 setSource()
Ivan Lozano52767be2019-10-18 14:49:46 -0700143
Ivan Lozano3149e6e2021-06-01 15:09:53 -0400144 // libstd linkage functions
145 rlibStd() bool
Ivan Lozano2b081132020-09-08 12:46:52 -0400146 setRlibStd()
147 setDylibStd()
148
Ivan Lozano52767be2019-10-18 14:49:46 -0700149 // Build a specific library variant
Matthew Maurer2ae05132020-06-23 14:28:53 -0700150 BuildOnlyFFI()
151 BuildOnlyRust()
Ivan Lozano52767be2019-10-18 14:49:46 -0700152 BuildOnlyRlib()
153 BuildOnlyDylib()
154 BuildOnlyStatic()
155 BuildOnlyShared()
Ivan Lozano7b0781d2021-11-03 15:30:18 -0400156
157 toc() android.OptionalPath
Ivan Lozano0a468a42024-05-13 21:03:34 -0400158
159 isFFILibrary() bool
Ivan Lozanoffee3342019-08-27 12:03:00 -0700160}
161
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400162func (library *libraryDecorator) nativeCoverage() bool {
163 return true
164}
165
Ivan Lozano7b0781d2021-11-03 15:30:18 -0400166func (library *libraryDecorator) toc() android.OptionalPath {
167 return library.tocFile
168}
169
Ivan Lozanoffee3342019-08-27 12:03:00 -0700170func (library *libraryDecorator) rlib() bool {
171 return library.MutatedProperties.VariantIsRlib
172}
173
Ivan Lozano2b081132020-09-08 12:46:52 -0400174func (library *libraryDecorator) sysroot() bool {
175 return Bool(library.Properties.Sysroot)
176}
177
Ivan Lozanoffee3342019-08-27 12:03:00 -0700178func (library *libraryDecorator) dylib() bool {
179 return library.MutatedProperties.VariantIsDylib
180}
181
Ivan Lozano52767be2019-10-18 14:49:46 -0700182func (library *libraryDecorator) shared() bool {
183 return library.MutatedProperties.VariantIsShared
184}
185
186func (library *libraryDecorator) static() bool {
Colin Cross17f9dc52024-07-01 20:05:54 -0700187 return false
Ivan Lozano52767be2019-10-18 14:49:46 -0700188}
189
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200190func (library *libraryDecorator) source() bool {
191 return library.MutatedProperties.VariantIsSource
192}
193
Ashutosh Agarwal46e4fad2024-08-27 17:13:12 +0000194func (library *libraryDecorator) apexExclude() bool {
195 return Bool(library.Properties.Apex_exclude)
196}
197
Ivan Lozanoffee3342019-08-27 12:03:00 -0700198func (library *libraryDecorator) buildRlib() bool {
199 return library.MutatedProperties.BuildRlib && BoolDefault(library.Properties.Rlib.Enabled, true)
200}
201
202func (library *libraryDecorator) buildDylib() bool {
203 return library.MutatedProperties.BuildDylib && BoolDefault(library.Properties.Dylib.Enabled, true)
204}
205
Ivan Lozano52767be2019-10-18 14:49:46 -0700206func (library *libraryDecorator) buildShared() bool {
207 return library.MutatedProperties.BuildShared && BoolDefault(library.Properties.Shared.Enabled, true)
208}
209
210func (library *libraryDecorator) buildStatic() bool {
211 return library.MutatedProperties.BuildStatic && BoolDefault(library.Properties.Static.Enabled, true)
212}
213
Ivan Lozanoffee3342019-08-27 12:03:00 -0700214func (library *libraryDecorator) setRlib() {
215 library.MutatedProperties.VariantIsRlib = true
216 library.MutatedProperties.VariantIsDylib = false
Ivan Lozano52767be2019-10-18 14:49:46 -0700217 library.MutatedProperties.VariantIsShared = false
Ivan Lozanoffee3342019-08-27 12:03:00 -0700218}
219
220func (library *libraryDecorator) setDylib() {
221 library.MutatedProperties.VariantIsRlib = false
222 library.MutatedProperties.VariantIsDylib = true
Ivan Lozano52767be2019-10-18 14:49:46 -0700223 library.MutatedProperties.VariantIsShared = false
224}
225
Ivan Lozano3149e6e2021-06-01 15:09:53 -0400226func (library *libraryDecorator) rlibStd() bool {
227 return library.MutatedProperties.VariantIsStaticStd
228}
229
Ivan Lozano2b081132020-09-08 12:46:52 -0400230func (library *libraryDecorator) setRlibStd() {
231 library.MutatedProperties.VariantIsStaticStd = true
232}
233
234func (library *libraryDecorator) setDylibStd() {
235 library.MutatedProperties.VariantIsStaticStd = false
236}
237
Ivan Lozano52767be2019-10-18 14:49:46 -0700238func (library *libraryDecorator) setShared() {
Ivan Lozano52767be2019-10-18 14:49:46 -0700239 library.MutatedProperties.VariantIsShared = true
240 library.MutatedProperties.VariantIsRlib = false
241 library.MutatedProperties.VariantIsDylib = false
242}
243
244func (library *libraryDecorator) setStatic() {
Colin Cross17f9dc52024-07-01 20:05:54 -0700245 panic(fmt.Errorf("static variant is not supported for rust modules, use the rlib variant instead"))
Ivan Lozanoffee3342019-08-27 12:03:00 -0700246}
247
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200248func (library *libraryDecorator) setSource() {
249 library.MutatedProperties.VariantIsSource = true
250}
251
Liz Kammer356f7d42021-01-26 09:18:53 -0500252func (library *libraryDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep {
Ivan Lozanoadd122a2023-07-13 11:01:41 -0400253 if library.preferRlib() {
Ivan Lozanoea086132020-12-08 14:43:00 -0500254 return rlibAutoDep
255 } else if library.rlib() || library.static() {
Matthew Maurer0f003b12020-06-29 14:34:06 -0700256 return rlibAutoDep
257 } else if library.dylib() || library.shared() {
258 return dylibAutoDep
259 } else {
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200260 panic(fmt.Errorf("autoDep called on library %q that has no enabled variants.", ctx.ModuleName()))
Matthew Maurer0f003b12020-06-29 14:34:06 -0700261 }
262}
263
Ivan Lozanoea086132020-12-08 14:43:00 -0500264func (library *libraryDecorator) stdLinkage(ctx *depsContext) RustLinkage {
Ivan Lozano0a468a42024-05-13 21:03:34 -0400265 if library.static() || library.MutatedProperties.VariantIsStaticStd || (library.rlib() && library.isFFILibrary()) {
Ivan Lozanoea086132020-12-08 14:43:00 -0500266 return RlibLinkage
267 } else if library.baseCompiler.preferRlib() {
268 return RlibLinkage
269 }
270 return DefaultLinkage
271}
272
Ivan Lozanoffee3342019-08-27 12:03:00 -0700273var _ compiler = (*libraryDecorator)(nil)
Ivan Lozano52767be2019-10-18 14:49:46 -0700274var _ libraryInterface = (*libraryDecorator)(nil)
Matthew Maurerbb3add12020-06-25 09:34:12 -0700275var _ exportedFlagsProducer = (*libraryDecorator)(nil)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700276
Martin Geisler67ec0542022-11-18 12:08:55 +0100277// rust_library produces all Rust variants (rust_library_dylib and
278// rust_library_rlib).
Ivan Lozanoffee3342019-08-27 12:03:00 -0700279func RustLibraryFactory() android.Module {
Matthew Maurer2ae05132020-06-23 14:28:53 -0700280 module, library := NewRustLibrary(android.HostAndDeviceSupported)
281 library.BuildOnlyRust()
282 return module.Init()
283}
284
Ivan Lozano0a468a42024-05-13 21:03:34 -0400285// rust_ffi produces all FFI variants (rust_ffi_shared, rust_ffi_static, and
286// rust_ffi_rlib).
Matthew Maurer2ae05132020-06-23 14:28:53 -0700287func RustFFIFactory() android.Module {
288 module, library := NewRustLibrary(android.HostAndDeviceSupported)
289 library.BuildOnlyFFI()
Ivan Lozanoffee3342019-08-27 12:03:00 -0700290 return module.Init()
291}
292
Martin Geisler67ec0542022-11-18 12:08:55 +0100293// rust_library_dylib produces a Rust dylib (Rust crate type "dylib").
Ivan Lozanoffee3342019-08-27 12:03:00 -0700294func RustLibraryDylibFactory() android.Module {
295 module, library := NewRustLibrary(android.HostAndDeviceSupported)
296 library.BuildOnlyDylib()
297 return module.Init()
298}
299
Martin Geisler67ec0542022-11-18 12:08:55 +0100300// rust_library_rlib produces an rlib (Rust crate type "rlib").
Ivan Lozanoffee3342019-08-27 12:03:00 -0700301func RustLibraryRlibFactory() android.Module {
302 module, library := NewRustLibrary(android.HostAndDeviceSupported)
303 library.BuildOnlyRlib()
304 return module.Init()
305}
306
Martin Geisler67ec0542022-11-18 12:08:55 +0100307// rust_ffi_shared produces a shared library (Rust crate type
308// "cdylib").
Matthew Maurer2ae05132020-06-23 14:28:53 -0700309func RustFFISharedFactory() android.Module {
Ivan Lozano52767be2019-10-18 14:49:46 -0700310 module, library := NewRustLibrary(android.HostAndDeviceSupported)
311 library.BuildOnlyShared()
312 return module.Init()
313}
314
Martin Geisler67ec0542022-11-18 12:08:55 +0100315// rust_library_host produces all Rust variants for the host
316// (rust_library_dylib_host and rust_library_rlib_host).
Ivan Lozanoffee3342019-08-27 12:03:00 -0700317func RustLibraryHostFactory() android.Module {
Matthew Maurer2ae05132020-06-23 14:28:53 -0700318 module, library := NewRustLibrary(android.HostSupported)
319 library.BuildOnlyRust()
320 return module.Init()
321}
322
Martin Geisler67ec0542022-11-18 12:08:55 +0100323// rust_ffi_host produces all FFI variants for the host
Ivan Lozano0a468a42024-05-13 21:03:34 -0400324// (rust_ffi_rlib_host, rust_ffi_static_host, and rust_ffi_shared_host).
Matthew Maurer2ae05132020-06-23 14:28:53 -0700325func RustFFIHostFactory() android.Module {
326 module, library := NewRustLibrary(android.HostSupported)
327 library.BuildOnlyFFI()
Ivan Lozanoffee3342019-08-27 12:03:00 -0700328 return module.Init()
329}
330
Martin Geisler67ec0542022-11-18 12:08:55 +0100331// rust_library_dylib_host produces a dylib for the host (Rust crate
332// type "dylib").
Ivan Lozanoffee3342019-08-27 12:03:00 -0700333func RustLibraryDylibHostFactory() android.Module {
334 module, library := NewRustLibrary(android.HostSupported)
335 library.BuildOnlyDylib()
336 return module.Init()
337}
338
Martin Geisler67ec0542022-11-18 12:08:55 +0100339// rust_library_rlib_host produces an rlib for the host (Rust crate
340// type "rlib").
Ivan Lozanoffee3342019-08-27 12:03:00 -0700341func RustLibraryRlibHostFactory() android.Module {
342 module, library := NewRustLibrary(android.HostSupported)
343 library.BuildOnlyRlib()
344 return module.Init()
345}
346
Martin Geisler67ec0542022-11-18 12:08:55 +0100347// rust_ffi_shared_host produces an shared library for the host (Rust
348// crate type "cdylib").
Matthew Maurer2ae05132020-06-23 14:28:53 -0700349func RustFFISharedHostFactory() android.Module {
Ivan Lozano52767be2019-10-18 14:49:46 -0700350 module, library := NewRustLibrary(android.HostSupported)
351 library.BuildOnlyShared()
352 return module.Init()
353}
354
Ivan Lozano0a468a42024-05-13 21:03:34 -0400355// rust_ffi_rlib_host produces an rlib for the host (Rust crate
356// type "rlib").
357func RustFFIRlibHostFactory() android.Module {
358 module, library := NewRustLibrary(android.HostSupported)
Ivan Lozanofd47b1a2024-05-17 14:13:41 -0400359 library.BuildOnlyRlib()
Ivan Lozano0a468a42024-05-13 21:03:34 -0400360
361 library.isFFI = true
362 return module.Init()
363}
364
365// rust_ffi_rlib produces an rlib (Rust crate type "rlib").
366func RustFFIRlibFactory() android.Module {
367 module, library := NewRustLibrary(android.HostAndDeviceSupported)
368 library.BuildOnlyRlib()
369
370 library.isFFI = true
371 return module.Init()
372}
373
Matthew Maurer2ae05132020-06-23 14:28:53 -0700374func (library *libraryDecorator) BuildOnlyFFI() {
375 library.MutatedProperties.BuildDylib = false
Ivan Lozano0a468a42024-05-13 21:03:34 -0400376 // we build rlibs for later static ffi linkage.
377 library.MutatedProperties.BuildRlib = true
Matthew Maurer2ae05132020-06-23 14:28:53 -0700378 library.MutatedProperties.BuildShared = true
Ivan Lozanofd47b1a2024-05-17 14:13:41 -0400379 library.MutatedProperties.BuildStatic = false
Ivan Lozano0a468a42024-05-13 21:03:34 -0400380
381 library.isFFI = true
Matthew Maurer2ae05132020-06-23 14:28:53 -0700382}
383
384func (library *libraryDecorator) BuildOnlyRust() {
385 library.MutatedProperties.BuildDylib = true
386 library.MutatedProperties.BuildRlib = true
387 library.MutatedProperties.BuildShared = false
388 library.MutatedProperties.BuildStatic = false
389}
390
Ivan Lozanoffee3342019-08-27 12:03:00 -0700391func (library *libraryDecorator) BuildOnlyDylib() {
Matthew Maurer2ae05132020-06-23 14:28:53 -0700392 library.MutatedProperties.BuildDylib = true
Ivan Lozanoffee3342019-08-27 12:03:00 -0700393 library.MutatedProperties.BuildRlib = false
Ivan Lozano52767be2019-10-18 14:49:46 -0700394 library.MutatedProperties.BuildShared = false
395 library.MutatedProperties.BuildStatic = false
Ivan Lozanoffee3342019-08-27 12:03:00 -0700396}
397
398func (library *libraryDecorator) BuildOnlyRlib() {
399 library.MutatedProperties.BuildDylib = false
Matthew Maurer2ae05132020-06-23 14:28:53 -0700400 library.MutatedProperties.BuildRlib = true
Ivan Lozano52767be2019-10-18 14:49:46 -0700401 library.MutatedProperties.BuildShared = false
402 library.MutatedProperties.BuildStatic = false
403}
404
405func (library *libraryDecorator) BuildOnlyStatic() {
Ivan Lozano52767be2019-10-18 14:49:46 -0700406 library.MutatedProperties.BuildRlib = false
407 library.MutatedProperties.BuildDylib = false
Matthew Maurer2ae05132020-06-23 14:28:53 -0700408 library.MutatedProperties.BuildShared = false
409 library.MutatedProperties.BuildStatic = true
Ivan Lozano0a468a42024-05-13 21:03:34 -0400410
411 library.isFFI = true
Ivan Lozano52767be2019-10-18 14:49:46 -0700412}
413
414func (library *libraryDecorator) BuildOnlyShared() {
Ivan Lozano52767be2019-10-18 14:49:46 -0700415 library.MutatedProperties.BuildRlib = false
416 library.MutatedProperties.BuildDylib = false
Matthew Maurer2ae05132020-06-23 14:28:53 -0700417 library.MutatedProperties.BuildStatic = false
418 library.MutatedProperties.BuildShared = true
Ivan Lozano0a468a42024-05-13 21:03:34 -0400419
420 library.isFFI = true
421}
422
423func (library *libraryDecorator) isFFILibrary() bool {
424 return library.isFFI
Ivan Lozanoffee3342019-08-27 12:03:00 -0700425}
426
427func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
Ivan Lozano9d1df102020-04-28 10:10:23 -0400428 module := newModule(hod, android.MultilibBoth)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700429
430 library := &libraryDecorator{
431 MutatedProperties: LibraryMutatedProperties{
Matthew Maurer2ae05132020-06-23 14:28:53 -0700432 BuildDylib: false,
433 BuildRlib: false,
434 BuildShared: false,
435 BuildStatic: false,
Ivan Lozanoffee3342019-08-27 12:03:00 -0700436 },
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800437 baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem),
Matthew Maurerbb3add12020-06-25 09:34:12 -0700438 flagExporter: NewFlagExporter(),
Ivan Lozanoffee3342019-08-27 12:03:00 -0700439 }
440
441 module.compiler = library
442
443 return module, library
444}
445
446func (library *libraryDecorator) compilerProps() []interface{} {
447 return append(library.baseCompiler.compilerProps(),
448 &library.Properties,
Thiébaud Weksteenfabaff62020-08-27 13:48:36 +0200449 &library.MutatedProperties,
450 &library.stripper.StripProperties)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700451}
452
Ivan Lozanof1c84332019-09-20 11:00:37 -0700453func (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
454 deps = library.baseCompiler.compilerDeps(ctx, deps)
455
Colin Crosse32f0932022-01-23 20:48:36 -0800456 if library.dylib() || library.shared() {
457 if ctx.toolchain().Bionic() {
458 deps = bionicDeps(ctx, deps, false)
459 deps.CrtBegin = []string{"crtbegin_so"}
460 deps.CrtEnd = []string{"crtend_so"}
461 } else if ctx.Os() == android.LinuxMusl {
462 deps = muslDeps(ctx, deps, false)
463 deps.CrtBegin = []string{"libc_musl_crtbegin_so"}
464 deps.CrtEnd = []string{"libc_musl_crtend_so"}
465 }
Ivan Lozanof1c84332019-09-20 11:00:37 -0700466 }
467
468 return deps
469}
Ivan Lozanobec05ea2020-06-09 08:27:49 -0400470
471func (library *libraryDecorator) sharedLibFilename(ctx ModuleContext) string {
472 return library.getStem(ctx) + ctx.toolchain().SharedLibSuffix()
473}
474
Ivan Lozano28ed8f42024-05-06 21:46:39 -0400475// Library cfg flags common to all variants
476func CommonLibraryCfgFlags(ctx android.ModuleContext, flags Flags) Flags {
477 return flags
478}
479
Ivan Lozano67eada32021-09-23 11:50:33 -0400480func (library *libraryDecorator) cfgFlags(ctx ModuleContext, flags Flags) Flags {
481 flags = library.baseCompiler.cfgFlags(ctx, flags)
Ivan Lozano28ed8f42024-05-06 21:46:39 -0400482 flags = CommonLibraryCfgFlags(ctx, flags)
483
Cole Faustfdec8722024-05-22 11:38:29 -0700484 cfgs := library.baseCompiler.Properties.Cfgs.GetOrDefault(ctx, nil)
485
Stephen Crane0dbfc562021-07-07 19:05:02 -0700486 if library.dylib() {
487 // We need to add a dependency on std in order to link crates as dylibs.
488 // The hack to add this dependency is guarded by the following cfg so
489 // that we don't force a dependency when it isn't needed.
Cole Faustfdec8722024-05-22 11:38:29 -0700490 cfgs = append(cfgs, "android_dylib")
Stephen Crane0dbfc562021-07-07 19:05:02 -0700491 }
Ivan Lozano67eada32021-09-23 11:50:33 -0400492
Cole Faustfdec8722024-05-22 11:38:29 -0700493 cfgFlags := cfgsToFlags(cfgs)
494
495 flags.RustFlags = append(flags.RustFlags, cfgFlags...)
496 flags.RustdocFlags = append(flags.RustdocFlags, cfgFlags...)
Ivan Lozano28ed8f42024-05-06 21:46:39 -0400497
498 return flags
499}
500
501// Common flags applied to all libraries irrespective of properties or variant should be included here
502func CommonLibraryCompilerFlags(ctx android.ModuleContext, flags Flags) Flags {
503 flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName())
Ivan Lozano67eada32021-09-23 11:50:33 -0400504
505 return flags
506}
507
508func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
Ivan Lozanoe0833b12019-11-06 19:15:49 -0800509 flags = library.baseCompiler.compilerFlags(ctx, flags)
Ivan Lozano67eada32021-09-23 11:50:33 -0400510
Ivan Lozano28ed8f42024-05-06 21:46:39 -0400511 flags = CommonLibraryCompilerFlags(ctx, flags)
512
Ivan Lozano0a468a42024-05-13 21:03:34 -0400513 if library.isFFI {
Ivan Lozanoe0833b12019-11-06 19:15:49 -0800514 library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...)
Ivan Lozanof033ca62024-03-21 13:43:14 -0400515 library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Export_include_dirs)...)
Ivan Lozanoe0833b12019-11-06 19:15:49 -0800516 }
Ivan Lozano0a468a42024-05-13 21:03:34 -0400517
Ivan Lozanobec05ea2020-06-09 08:27:49 -0400518 if library.shared() {
A. Cody Schuffelenc183e3a2023-08-14 21:09:47 -0700519 if ctx.Darwin() {
520 flags.LinkFlags = append(
521 flags.LinkFlags,
522 "-dynamic_lib",
523 "-install_name @rpath/"+library.sharedLibFilename(ctx),
524 )
525 } else {
526 flags.LinkFlags = append(flags.LinkFlags, "-Wl,-soname="+library.sharedLibFilename(ctx))
527 }
Ivan Lozanobec05ea2020-06-09 08:27:49 -0400528 }
529
Ivan Lozanoe0833b12019-11-06 19:15:49 -0800530 return flags
531}
Ivan Lozanof1c84332019-09-20 11:00:37 -0700532
Sasha Smundaka76acba2022-04-18 20:12:56 -0700533func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput {
534 var outputFile android.ModuleOutPath
535 var ret buildOutput
Thiébaud Weksteenfabaff62020-08-27 13:48:36 +0200536 var fileName string
Matthew Maurera28404a2023-11-20 23:33:28 +0000537 crateRootPath := crateRootPath(ctx, library)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700538
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400539 if library.sourceProvider != nil {
Ivan Lozano9d74a522020-12-01 09:25:22 -0500540 deps.srcProviderFiles = append(deps.srcProviderFiles, library.sourceProvider.Srcs()...)
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400541 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700542
Ivan Lozano0a468a42024-05-13 21:03:34 -0400543 // Ensure link dirs are not duplicated
544 deps.linkDirs = android.FirstUniqueStrings(deps.linkDirs)
545
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400546 // Calculate output filename
547 if library.rlib() {
548 fileName = library.getStem(ctx) + ctx.toolchain().RlibSuffix()
549 outputFile = android.PathForModuleOut(ctx, fileName)
Sasha Smundaka76acba2022-04-18 20:12:56 -0700550 ret.outputFile = outputFile
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400551 } else if library.dylib() {
552 fileName = library.getStem(ctx) + ctx.toolchain().DylibSuffix()
553 outputFile = android.PathForModuleOut(ctx, fileName)
Sasha Smundaka76acba2022-04-18 20:12:56 -0700554 ret.outputFile = outputFile
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400555 } else if library.static() {
556 fileName = library.getStem(ctx) + ctx.toolchain().StaticLibSuffix()
557 outputFile = android.PathForModuleOut(ctx, fileName)
Sasha Smundaka76acba2022-04-18 20:12:56 -0700558 ret.outputFile = outputFile
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400559 } else if library.shared() {
560 fileName = library.sharedLibFilename(ctx)
561 outputFile = android.PathForModuleOut(ctx, fileName)
Sasha Smundaka76acba2022-04-18 20:12:56 -0700562 ret.outputFile = outputFile
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400563 }
564
565 if !library.rlib() && !library.static() && library.stripper.NeedsStrip(ctx) {
566 strippedOutputFile := outputFile
567 outputFile = android.PathForModuleOut(ctx, "unstripped", fileName)
568 library.stripper.StripExecutableOrSharedLib(ctx, outputFile, strippedOutputFile)
569
570 library.baseCompiler.strippedOutputFile = android.OptionalPathForPath(strippedOutputFile)
571 }
572 library.baseCompiler.unstrippedOutputFile = outputFile
573
Ivan Lozanoffee3342019-08-27 12:03:00 -0700574 flags.RustFlags = append(flags.RustFlags, deps.depFlags...)
Ivan Lozano3dfa12d2021-02-04 11:29:41 -0500575 flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...)
Colin Cross004bd3f2023-10-02 11:39:17 -0700576 flags.LinkFlags = append(flags.LinkFlags, deps.linkObjects...)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700577
Matthew Maurer46c46cc2020-01-13 16:34:34 -0800578 if library.dylib() {
Ivan Lozano52767be2019-10-18 14:49:46 -0700579 // We need prefer-dynamic for now to avoid linking in the static stdlib. See:
580 // https://github.com/rust-lang/rust/issues/19680
581 // https://github.com/rust-lang/rust/issues/34909
582 flags.RustFlags = append(flags.RustFlags, "-C prefer-dynamic")
583 }
584
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400585 // Call the appropriate builder for this library type
Ivan Lozanoffee3342019-08-27 12:03:00 -0700586 if library.rlib() {
Sam Delmerico63ca14e2023-09-25 12:13:17 +0000587 ret.kytheFile = TransformSrctoRlib(ctx, crateRootPath, deps, flags, outputFile).kytheFile
Ivan Lozanoffee3342019-08-27 12:03:00 -0700588 } else if library.dylib() {
Sam Delmerico63ca14e2023-09-25 12:13:17 +0000589 ret.kytheFile = TransformSrctoDylib(ctx, crateRootPath, deps, flags, outputFile).kytheFile
Ivan Lozano52767be2019-10-18 14:49:46 -0700590 } else if library.static() {
Sam Delmerico63ca14e2023-09-25 12:13:17 +0000591 ret.kytheFile = TransformSrctoStatic(ctx, crateRootPath, deps, flags, outputFile).kytheFile
Ivan Lozano52767be2019-10-18 14:49:46 -0700592 } else if library.shared() {
Sam Delmerico63ca14e2023-09-25 12:13:17 +0000593 ret.kytheFile = TransformSrctoShared(ctx, crateRootPath, deps, flags, outputFile).kytheFile
Ivan Lozanoffee3342019-08-27 12:03:00 -0700594 }
595
Ivan Lozano52767be2019-10-18 14:49:46 -0700596 if library.rlib() || library.dylib() {
Colin Cross0de8a1e2020-09-18 14:15:30 -0700597 library.flagExporter.exportLinkDirs(deps.linkDirs...)
Colin Cross0de8a1e2020-09-18 14:15:30 -0700598 library.flagExporter.exportLinkObjects(deps.linkObjects...)
Ivan Lozano52767be2019-10-18 14:49:46 -0700599 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700600
Ivan Lozano0a468a42024-05-13 21:03:34 -0400601 // Since we have FFI rlibs, we need to collect their includes as well
602 if library.static() || library.shared() || library.rlib() {
Colin Cross40213022023-12-13 15:19:49 -0800603 android.SetProvider(ctx, cc.FlagExporterInfoProvider, cc.FlagExporterInfo{
Ivan Lozano0a468a42024-05-13 21:03:34 -0400604 IncludeDirs: android.FirstUniquePaths(library.includeDirs),
Colin Cross0de8a1e2020-09-18 14:15:30 -0700605 })
606 }
607
608 if library.shared() {
Ivan Lozano7b0781d2021-11-03 15:30:18 -0400609 // Optimize out relinking against shared libraries whose interface hasn't changed by
610 // depending on a table of contents file instead of the library itself.
611 tocFile := outputFile.ReplaceExtension(ctx, flags.Toolchain.SharedLibSuffix()[1:]+".toc")
612 library.tocFile = android.OptionalPathForPath(tocFile)
613 cc.TransformSharedObjectToToc(ctx, outputFile, tocFile)
614
Colin Cross40213022023-12-13 15:19:49 -0800615 android.SetProvider(ctx, cc.SharedLibraryInfoProvider, cc.SharedLibraryInfo{
Ivan Lozano7b0781d2021-11-03 15:30:18 -0400616 TableOfContents: android.OptionalPathForPath(tocFile),
617 SharedLibrary: outputFile,
618 Target: ctx.Target(),
Colin Cross0de8a1e2020-09-18 14:15:30 -0700619 })
620 }
621
622 if library.static() {
Colin Crossc85750b2022-04-21 12:50:51 -0700623 depSet := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(outputFile).Build()
Colin Cross40213022023-12-13 15:19:49 -0800624 android.SetProvider(ctx, cc.StaticLibraryInfoProvider, cc.StaticLibraryInfo{
Colin Cross0de8a1e2020-09-18 14:15:30 -0700625 StaticLibrary: outputFile,
626
627 TransitiveStaticLibrariesForOrdering: depSet,
628 })
629 }
630
631 library.flagExporter.setProvider(ctx)
632
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400633 return ret
Ivan Lozanoffee3342019-08-27 12:03:00 -0700634}
635
Matthew Maurera28404a2023-11-20 23:33:28 +0000636func (library *libraryDecorator) checkedCrateRootPath() (android.Path, error) {
Dan Albert06feee92021-03-19 15:06:02 -0700637 if library.sourceProvider != nil {
Matthew Maurera28404a2023-11-20 23:33:28 +0000638 srcs := library.sourceProvider.Srcs()
639 if len(srcs) == 0 {
640 return nil, errors.New("Source provider generated 0 sources")
641 }
Dan Albert06feee92021-03-19 15:06:02 -0700642 // Assume the first source from the source provider is the library entry point.
Matthew Maurera28404a2023-11-20 23:33:28 +0000643 return srcs[0], nil
Sam Delmerico63ca14e2023-09-25 12:13:17 +0000644 } else {
Matthew Maurera28404a2023-11-20 23:33:28 +0000645 return library.baseCompiler.checkedCrateRootPath()
Dan Albert06feee92021-03-19 15:06:02 -0700646 }
647}
648
649func (library *libraryDecorator) rustdoc(ctx ModuleContext, flags Flags,
650 deps PathDeps) android.OptionalPath {
651 // rustdoc has builtin support for documenting config specific information
652 // regardless of the actual config it was given
653 // (https://doc.rust-lang.org/rustdoc/advanced-features.html#cfgdoc-documenting-platform-specific-or-feature-specific-information),
654 // so we generate the rustdoc for only the primary module so that we have a
655 // single set of docs to refer to.
656 if ctx.Module() != ctx.PrimaryModule() {
657 return android.OptionalPath{}
658 }
659
Matthew Maurera28404a2023-11-20 23:33:28 +0000660 return android.OptionalPathForPath(Rustdoc(ctx, crateRootPath(ctx, library),
Dan Albert06feee92021-03-19 15:06:02 -0700661 deps, flags))
662}
663
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700664func (library *libraryDecorator) getStem(ctx ModuleContext) string {
665 stem := library.baseCompiler.getStemWithoutSuffix(ctx)
666 validateLibraryStem(ctx, stem, library.crateName())
667
668 return stem + String(library.baseCompiler.Properties.Suffix)
669}
670
Ivan Lozano2b081132020-09-08 12:46:52 -0400671func (library *libraryDecorator) install(ctx ModuleContext) {
672 // Only shared and dylib variants make sense to install.
673 if library.shared() || library.dylib() {
674 library.baseCompiler.install(ctx)
675 }
676}
677
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400678func (library *libraryDecorator) Disabled() bool {
679 return library.MutatedProperties.VariantIsDisabled
680}
681
682func (library *libraryDecorator) SetDisabled() {
683 library.MutatedProperties.VariantIsDisabled = true
684}
685
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700686var validCrateName = regexp.MustCompile("[^a-zA-Z0-9_]+")
687
688func validateLibraryStem(ctx BaseModuleContext, filename string, crate_name string) {
689 if crate_name == "" {
690 ctx.PropertyErrorf("crate_name", "crate_name must be defined.")
691 }
692
693 // crate_names are used for the library output file, and rustc expects these
694 // to be alphanumeric with underscores allowed.
695 if validCrateName.MatchString(crate_name) {
696 ctx.PropertyErrorf("crate_name",
697 "library crate_names must be alphanumeric with underscores allowed")
698 }
699
700 // Libraries are expected to begin with "lib" followed by the crate_name
701 if !strings.HasPrefix(filename, "lib"+crate_name) {
702 ctx.ModuleErrorf("Invalid name or stem property; library filenames must start with lib<crate_name>")
703 }
704}
705
Colin Cross8a49a3d2024-05-20 12:22:27 -0700706type libraryTransitionMutator struct{}
707
708func (libraryTransitionMutator) Split(ctx android.BaseModuleContext) []string {
709 m, ok := ctx.Module().(*Module)
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200710 if !ok || m.compiler == nil {
Colin Cross8a49a3d2024-05-20 12:22:27 -0700711 return []string{""}
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200712 }
713 library, ok := m.compiler.(libraryInterface)
714 if !ok {
Colin Cross8a49a3d2024-05-20 12:22:27 -0700715 return []string{""}
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200716 }
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400717
Ivan Lozano0a468a42024-05-13 21:03:34 -0400718 // Don't produce rlib/dylib/source variants for shared or static variants
719 if library.shared() || library.static() {
Colin Cross8a49a3d2024-05-20 12:22:27 -0700720 return []string{""}
Ivan Lozano0a468a42024-05-13 21:03:34 -0400721 }
722
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200723 var variants []string
724 // The source variant is used for SourceProvider modules. The other variants (i.e. rlib and dylib)
725 // depend on this variant. It must be the first variant to be declared.
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200726 if m.sourceProvider != nil {
Colin Cross8a49a3d2024-05-20 12:22:27 -0700727 variants = append(variants, sourceVariation)
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200728 }
729 if library.buildRlib() {
730 variants = append(variants, rlibVariation)
731 }
732 if library.buildDylib() {
733 variants = append(variants, dylibVariation)
734 }
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400735
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200736 if len(variants) == 0 {
Colin Cross8a49a3d2024-05-20 12:22:27 -0700737 return []string{""}
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200738 }
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200739
Colin Cross8a49a3d2024-05-20 12:22:27 -0700740 return variants
741}
Ivan Lozano1921e802021-05-20 13:39:16 -0400742
Colin Cross8a49a3d2024-05-20 12:22:27 -0700743func (libraryTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
744 return ""
745}
746
747func (libraryTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
748 m, ok := ctx.Module().(*Module)
749 if !ok || m.compiler == nil {
750 return ""
751 }
752 library, ok := m.compiler.(libraryInterface)
753 if !ok {
754 return ""
755 }
756
757 if incomingVariation == "" {
758 if m.sourceProvider != nil {
759 return sourceVariation
760 }
761 if library.shared() {
762 return ""
763 }
764 if library.buildRlib() {
765 return rlibVariation
766 }
767 if library.buildDylib() {
768 return dylibVariation
Ivan Lozanoffee3342019-08-27 12:03:00 -0700769 }
770 }
Colin Cross8a49a3d2024-05-20 12:22:27 -0700771 return incomingVariation
772}
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200773
Colin Cross8a49a3d2024-05-20 12:22:27 -0700774func (libraryTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
775 m, ok := ctx.Module().(*Module)
776 if !ok || m.compiler == nil {
777 return
778 }
779 library, ok := m.compiler.(libraryInterface)
780 if !ok {
781 return
782 }
783
784 switch variation {
785 case rlibVariation:
786 library.setRlib()
787 case dylibVariation:
788 library.setDylib()
789 if m.ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation {
790 // TODO(b/165791368)
791 // Disable dylib Vendor Ramdisk variations until we support these.
792 m.Disable()
793 }
794
795 case sourceVariation:
796 library.setSource()
797 // The source variant does not produce any library.
798 // Disable the compilation steps.
799 m.compiler.SetDisabled()
Ivan Lozanofd47b1a2024-05-17 14:13:41 -0400800 }
801
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200802 // If a source variant is created, add an inter-variant dependency
803 // between the other variants and the source variant.
Colin Cross8a49a3d2024-05-20 12:22:27 -0700804 if m.sourceProvider != nil && variation != sourceVariation {
805 ctx.AddVariationDependencies(
806 []blueprint.Variation{
807 {"rust_libraries", sourceVariation},
808 },
809 sourceDepTag, ctx.ModuleName())
Thiébaud Weksteen295c72b2020-09-23 18:10:17 +0200810 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700811}
Ivan Lozano2b081132020-09-08 12:46:52 -0400812
Colin Cross8a49a3d2024-05-20 12:22:27 -0700813type libstdTransitionMutator struct{}
Ivan Lozano2b081132020-09-08 12:46:52 -0400814
Colin Cross8a49a3d2024-05-20 12:22:27 -0700815func (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string {
816 if m, ok := ctx.Module().(*Module); ok && m.compiler != nil && !m.compiler.Disabled() {
817 // Only create a variant if a library is actually being built.
818 if library, ok := m.compiler.(libraryInterface); ok {
819 if library.rlib() && !library.sysroot() {
820 if library.isFFILibrary() {
821 return []string{"rlib-std"}
822 } else {
823 return []string{"rlib-std", "dylib-std"}
Ivan Lozano6a884432020-12-02 09:15:16 -0500824 }
Ivan Lozano2b081132020-09-08 12:46:52 -0400825 }
826 }
827 }
Colin Cross8a49a3d2024-05-20 12:22:27 -0700828 return []string{""}
829}
830
831func (libstdTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
832 return ""
833}
834
835func (libstdTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
836 if m, ok := ctx.Module().(*Module); ok && m.compiler != nil && !m.compiler.Disabled() {
837 if library, ok := m.compiler.(libraryInterface); ok {
838 if library.shared() {
839 return ""
840 }
841 if library.rlib() && !library.sysroot() {
842 if incomingVariation != "" {
843 return incomingVariation
844 }
845 return "rlib-std"
846 }
847 }
848 }
849 return ""
850}
851
852func (libstdTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
853 if variation == "rlib-std" {
854 rlib := ctx.Module().(*Module)
855 rlib.compiler.(libraryInterface).setRlibStd()
856 rlib.Properties.RustSubName += RlibStdlibSuffix
857 } else if variation == "dylib-std" {
858 dylib := ctx.Module().(*Module)
859 dylib.compiler.(libraryInterface).setDylibStd()
860 if dylib.ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation {
861 // TODO(b/165791368)
862 // Disable rlibs that link against dylib-std on vendor ramdisk variations until those dylib
863 // variants are properly supported.
864 dylib.Disable()
865 }
866 }
Ivan Lozano2b081132020-09-08 12:46:52 -0400867}