blob: 1ce71f60bbdf29dbb795fbcc1dab0888b37978ff [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 (
18 "fmt"
19 "path/filepath"
Ivan Lozano45a9e312021-07-27 12:29:12 -040020 "strings"
Ivan Lozanoffee3342019-08-27 12:03:00 -070021
Ivan Lozanoad8b18b2019-10-31 19:38:29 -070022 "github.com/google/blueprint/proptools"
23
Ivan Lozanoffee3342019-08-27 12:03:00 -070024 "android/soong/android"
25 "android/soong/rust/config"
26)
27
Ivan Lozanodd055472020-09-28 13:22:45 -040028type RustLinkage int
29
30const (
31 DefaultLinkage RustLinkage = iota
32 RlibLinkage
33 DylibLinkage
34)
35
Thiébaud Weksteene81c9242020-08-03 10:46:28 +020036func (compiler *baseCompiler) edition() string {
Chih-Hung Hsieh961a30c2019-10-03 09:47:06 -070037 return proptools.StringDefault(compiler.Properties.Edition, config.DefaultEdition)
38}
39
Matthew Maurer99020b02019-10-31 10:44:40 -070040func (compiler *baseCompiler) setNoStdlibs() {
41 compiler.Properties.No_stdlibs = proptools.BoolPtr(true)
42}
43
Thiébaud Weksteen9e8451e2020-08-13 12:55:59 +020044func (compiler *baseCompiler) disableLints() {
45 compiler.Properties.Lints = proptools.StringPtr("none")
Stephen Craneda931d42020-08-04 13:02:28 -070046}
47
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -080048func NewBaseCompiler(dir, dir64 string, location installLocation) *baseCompiler {
Ivan Lozanoffee3342019-08-27 12:03:00 -070049 return &baseCompiler{
Chih-Hung Hsieh961a30c2019-10-03 09:47:06 -070050 Properties: BaseCompilerProperties{},
51 dir: dir,
52 dir64: dir64,
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -080053 location: location,
Ivan Lozanoffee3342019-08-27 12:03:00 -070054 }
55}
56
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -080057type installLocation int
58
59const (
60 InstallInSystem installLocation = 0
61 InstallInData = iota
Ivan Lozano43845682020-07-09 21:03:28 -040062
63 incorrectSourcesError = "srcs can only contain one path for a rust file and source providers prefixed by \":\""
Thiébaud Weksteenee6a89b2021-02-25 16:30:57 +010064 genSubDir = "out/"
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -080065)
66
Ivan Lozanoffee3342019-08-27 12:03:00 -070067type BaseCompilerProperties struct {
Ivan Lozanoe4db0032021-08-11 13:39:33 -040068 // path to the source file that is the main entry point of the program (e.g. main.rs or lib.rs).
69 // Only a single source file can be defined. Modules which generate source can be included by prefixing
70 // the module name with ":", for example ":libfoo_bindgen"
71 //
72 // If no source file is defined, a single generated source module can be defined to be used as the main source.
Ivan Lozano8a23fa42020-06-16 10:26:57 -040073 Srcs []string `android:"path,arch_variant"`
74
Thiébaud Weksteen9e8451e2020-08-13 12:55:59 +020075 // name of the lint set that should be used to validate this module.
76 //
77 // Possible values are "default" (for using a sensible set of lints
78 // depending on the module's location), "android" (for the strictest
79 // lint set that applies to all Android platform code), "vendor" (for
80 // a relaxed set) and "none" (for ignoring all lint warnings and
81 // errors). The default value is "default".
82 Lints *string
Chih-Hung Hsiehefdd7ac2019-09-26 18:59:27 -070083
Thiébaud Weksteenc44e7372021-04-07 14:53:06 +020084 // flags to pass to rustc. To enable configuration options or features, use the "cfgs" or "features" properties.
Liz Kammereda93982021-04-20 10:15:41 -040085 Flags []string `android:"arch_variant"`
Ivan Lozanoffee3342019-08-27 12:03:00 -070086
87 // flags to pass to the linker
Liz Kammereda93982021-04-20 10:15:41 -040088 Ld_flags []string `android:"arch_variant"`
Ivan Lozanoffee3342019-08-27 12:03:00 -070089
90 // list of rust rlib crate dependencies
91 Rlibs []string `android:"arch_variant"`
92
93 // list of rust dylib crate dependencies
94 Dylibs []string `android:"arch_variant"`
95
Matthew Maurer0f003b12020-06-29 14:34:06 -070096 // list of rust automatic crate dependencies
97 Rustlibs []string `android:"arch_variant"`
98
Ivan Lozanoffee3342019-08-27 12:03:00 -070099 // list of rust proc_macro crate dependencies
100 Proc_macros []string `android:"arch_variant"`
101
102 // list of C shared library dependencies
103 Shared_libs []string `android:"arch_variant"`
104
Ivan Lozano63bb7682021-03-23 15:53:44 -0400105 // list of C static library dependencies. These dependencies do not normally propagate to dependents
106 // and may need to be redeclared. See whole_static_libs for bundling static dependencies into a library.
Ivan Lozanoffee3342019-08-27 12:03:00 -0700107 Static_libs []string `android:"arch_variant"`
108
Ivan Lozano63bb7682021-03-23 15:53:44 -0400109 // Similar to static_libs, but will bundle the static library dependency into a library. This is helpful
110 // to avoid having to redeclare the dependency for dependents of this library, but in some cases may also
111 // result in bloat if multiple dependencies all include the same static library whole.
112 //
113 // The common use case for this is when the static library is unlikely to be a dependency of other modules to avoid
114 // having to redeclare the static library dependency for every dependent module.
115 // If you are not sure what to, for rust_library modules most static dependencies should go in static_libraries,
116 // and for rust_ffi modules most static dependencies should go into whole_static_libraries.
117 //
118 // For rust_ffi static variants, these libraries will be included in the resulting static library archive.
119 //
120 // For rust_library rlib variants, these libraries will be bundled into the resulting rlib library. This will
121 // include all of the static libraries symbols in any dylibs or binaries which use this rlib as well.
122 Whole_static_libs []string `android:"arch_variant"`
123
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400124 // crate name, required for modules which produce Rust libraries: rust_library, rust_ffi and SourceProvider
125 // modules which create library variants (rust_bindgen). This must be the expected extern crate name used in
126 // source, and is required to conform to an enforced format matching library output files (if the output file is
127 // lib<someName><suffix>, the crate_name property must be <someName>).
Ivan Lozanoffee3342019-08-27 12:03:00 -0700128 Crate_name string `android:"arch_variant"`
129
130 // list of features to enable for this crate
131 Features []string `android:"arch_variant"`
132
Thiébaud Weksteenc44e7372021-04-07 14:53:06 +0200133 // list of configuration options to enable for this crate. To enable features, use the "features" property.
134 Cfgs []string `android:"arch_variant"`
135
Ivan Lozanoffee3342019-08-27 12:03:00 -0700136 // specific rust edition that should be used if the default version is not desired
137 Edition *string `android:"arch_variant"`
138
139 // sets name of the output
140 Stem *string `android:"arch_variant"`
141
142 // append to name of output
143 Suffix *string `android:"arch_variant"`
144
145 // install to a subdirectory of the default install path for the module
146 Relative_install_path *string `android:"arch_variant"`
Matthew Maurer99020b02019-10-31 10:44:40 -0700147
148 // whether to suppress inclusion of standard crates - defaults to false
149 No_stdlibs *bool
Ivan Lozanoea086132020-12-08 14:43:00 -0500150
151 // Change the rustlibs linkage to select rlib linkage by default for device targets.
152 // Also link libstd as an rlib as well on device targets.
153 // Note: This is the default behavior for host targets.
154 //
155 // This is primarily meant for rust_binary and rust_ffi modules where the default
156 // linkage of libstd might need to be overridden in some use cases. This should
157 // generally be avoided with other module types since it may cause collisions at
158 // linkage if all dependencies of the root binary module do not link against libstd\
159 // the same way.
160 Prefer_rlib *bool `android:"arch_variant"`
Ivan Lozanoa9a1fc02021-08-11 15:13:43 -0400161
162 // Enables emitting certain Cargo environment variables. Only intended to be used for compatibility purposes.
163 // Will set CARGO_CRATE_NAME to the crate_name property's value.
164 // Will set CARGO_BIN_NAME to the output filename value without the extension.
165 Cargo_env_compat *bool
166
167 // If cargo_env_compat is true, sets the CARGO_PKG_VERSION env var to this value.
168 Cargo_pkg_version *string
Ivan Lozanoffee3342019-08-27 12:03:00 -0700169}
170
171type baseCompiler struct {
Joel Galensonfa049382021-01-14 16:03:18 -0800172 Properties BaseCompilerProperties
Ivan Lozanoffee3342019-08-27 12:03:00 -0700173
174 // Install related
175 dir string
176 dir64 string
177 subDir string
178 relative string
Colin Cross70dda7e2019-10-01 22:05:35 -0700179 path android.InstallPath
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800180 location installLocation
Ivan Lozano6cd99e62020-02-11 08:24:25 -0500181 sanitize *sanitize
Ivan Lozano8a23fa42020-06-16 10:26:57 -0400182
Joel Galensonfa049382021-01-14 16:03:18 -0800183 distFile android.OptionalPath
Thiébaud Weksteenfabaff62020-08-27 13:48:36 +0200184 // Stripped output file. If Valid(), this file will be installed instead of outputFile.
185 strippedOutputFile android.OptionalPath
Thiébaud Weksteenee6a89b2021-02-25 16:30:57 +0100186
187 // If a crate has a source-generated dependency, a copy of the source file
188 // will be available in cargoOutDir (equivalent to Cargo OUT_DIR).
189 cargoOutDir android.ModuleOutPath
Ivan Lozanoffee3342019-08-27 12:03:00 -0700190}
191
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400192func (compiler *baseCompiler) Disabled() bool {
193 return false
194}
195
196func (compiler *baseCompiler) SetDisabled() {
197 panic("baseCompiler does not implement SetDisabled()")
198}
199
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400200func (compiler *baseCompiler) coverageOutputZipPath() android.OptionalPath {
201 panic("baseCompiler does not implement coverageOutputZipPath()")
202}
203
Ivan Lozanoea086132020-12-08 14:43:00 -0500204func (compiler *baseCompiler) preferRlib() bool {
205 return Bool(compiler.Properties.Prefer_rlib)
206}
207
Ivan Lozanodd055472020-09-28 13:22:45 -0400208func (compiler *baseCompiler) stdLinkage(ctx *depsContext) RustLinkage {
Ivan Lozano2b081132020-09-08 12:46:52 -0400209 // For devices, we always link stdlibs in as dylibs by default.
Ivan Lozanoea086132020-12-08 14:43:00 -0500210 if compiler.preferRlib() {
211 return RlibLinkage
212 } else if ctx.Device() {
Ivan Lozanodd055472020-09-28 13:22:45 -0400213 return DylibLinkage
Ivan Lozano2b081132020-09-08 12:46:52 -0400214 } else {
Ivan Lozanodd055472020-09-28 13:22:45 -0400215 return RlibLinkage
Ivan Lozano2b081132020-09-08 12:46:52 -0400216 }
Ivan Lozano042504f2020-08-18 14:31:23 -0400217}
218
Ivan Lozanoffee3342019-08-27 12:03:00 -0700219var _ compiler = (*baseCompiler)(nil)
220
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800221func (compiler *baseCompiler) inData() bool {
222 return compiler.location == InstallInData
223}
224
Ivan Lozanoffee3342019-08-27 12:03:00 -0700225func (compiler *baseCompiler) compilerProps() []interface{} {
226 return []interface{}{&compiler.Properties}
227}
228
Thiébaud Weksteenc44e7372021-04-07 14:53:06 +0200229func (compiler *baseCompiler) cfgsToFlags() []string {
Ivan Lozanoffee3342019-08-27 12:03:00 -0700230 flags := []string{}
Thiébaud Weksteenc44e7372021-04-07 14:53:06 +0200231 for _, cfg := range compiler.Properties.Cfgs {
232 flags = append(flags, "--cfg '"+cfg+"'")
233 }
Ivan Lozano67eada32021-09-23 11:50:33 -0400234
Thiébaud Weksteenc44e7372021-04-07 14:53:06 +0200235 return flags
236}
237
238func (compiler *baseCompiler) featuresToFlags() []string {
239 flags := []string{}
240 for _, feature := range compiler.Properties.Features {
Ivan Lozanoffee3342019-08-27 12:03:00 -0700241 flags = append(flags, "--cfg 'feature=\""+feature+"\"'")
242 }
Ivan Lozano67eada32021-09-23 11:50:33 -0400243
244 return flags
245}
246
247func (compiler *baseCompiler) featureFlags(ctx ModuleContext, flags Flags) Flags {
248 flags.RustFlags = append(flags.RustFlags, compiler.featuresToFlags()...)
249 flags.RustdocFlags = append(flags.RustdocFlags, compiler.featuresToFlags()...)
250
251 return flags
252}
253
254func (compiler *baseCompiler) cfgFlags(ctx ModuleContext, flags Flags) Flags {
255 if ctx.RustModule().UseVndk() {
256 compiler.Properties.Cfgs = append(compiler.Properties.Cfgs, "android_vndk")
257 }
258
259 flags.RustFlags = append(flags.RustFlags, compiler.cfgsToFlags()...)
260 flags.RustdocFlags = append(flags.RustdocFlags, compiler.cfgsToFlags()...)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700261 return flags
262}
263
264func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flags {
265
Thiébaud Weksteen9e8451e2020-08-13 12:55:59 +0200266 lintFlags, err := config.RustcLintsForDir(ctx.ModuleDir(), compiler.Properties.Lints)
267 if err != nil {
268 ctx.PropertyErrorf("lints", err.Error())
Chih-Hung Hsiehefdd7ac2019-09-26 18:59:27 -0700269 }
Ivan Lozano45a9e312021-07-27 12:29:12 -0400270
271 // linkage-related flags are disallowed.
272 for _, s := range compiler.Properties.Ld_flags {
273 if strings.HasPrefix(s, "-Wl,-l") || strings.HasPrefix(s, "-Wl,-L") {
274 ctx.PropertyErrorf("ld_flags", "'-Wl,-l' and '-Wl,-L' flags cannot be manually specified")
275 }
276 }
277 for _, s := range compiler.Properties.Flags {
278 if strings.HasPrefix(s, "-l") || strings.HasPrefix(s, "-L") {
279 ctx.PropertyErrorf("flags", "'-l' and '-L' flags cannot be manually specified")
280 }
281 if strings.HasPrefix(s, "--extern") {
282 ctx.PropertyErrorf("flags", "'--extern' flag cannot be manually specified")
283 }
284 if strings.HasPrefix(s, "-Clink-args=") || strings.HasPrefix(s, "-C link-args=") {
285 ctx.PropertyErrorf("flags", "'-C link-args' flag cannot be manually specified")
286 }
287 }
288
Thiébaud Weksteen9e8451e2020-08-13 12:55:59 +0200289 flags.RustFlags = append(flags.RustFlags, lintFlags)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700290 flags.RustFlags = append(flags.RustFlags, compiler.Properties.Flags...)
Thiébaud Weksteene81c9242020-08-03 10:46:28 +0200291 flags.RustFlags = append(flags.RustFlags, "--edition="+compiler.edition())
Dan Albert06feee92021-03-19 15:06:02 -0700292 flags.RustdocFlags = append(flags.RustdocFlags, "--edition="+compiler.edition())
Ivan Lozanoffee3342019-08-27 12:03:00 -0700293 flags.LinkFlags = append(flags.LinkFlags, compiler.Properties.Ld_flags...)
Joel Galenson724286c2019-09-30 13:01:37 -0700294 flags.GlobalRustFlags = append(flags.GlobalRustFlags, config.GlobalRustFlags...)
Ivan Lozanof1c84332019-09-20 11:00:37 -0700295 flags.GlobalRustFlags = append(flags.GlobalRustFlags, ctx.toolchain().ToolchainRustFlags())
296 flags.GlobalLinkFlags = append(flags.GlobalLinkFlags, ctx.toolchain().ToolchainLinkFlags())
Ivan Lozanoffee3342019-08-27 12:03:00 -0700297
298 if ctx.Host() && !ctx.Windows() {
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800299 rpathPrefix := `\$$ORIGIN/`
Ivan Lozanoffee3342019-08-27 12:03:00 -0700300 if ctx.Darwin() {
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800301 rpathPrefix = "@loader_path/"
Ivan Lozanoffee3342019-08-27 12:03:00 -0700302 }
303
304 var rpath string
305 if ctx.toolchain().Is64Bit() {
306 rpath = "lib64"
307 } else {
308 rpath = "lib"
309 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -0800310 flags.LinkFlags = append(flags.LinkFlags, "-Wl,-rpath,"+rpathPrefix+rpath)
311 flags.LinkFlags = append(flags.LinkFlags, "-Wl,-rpath,"+rpathPrefix+"../"+rpath)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700312 }
313
314 return flags
315}
316
317func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path {
318 panic(fmt.Errorf("baseCrater doesn't know how to crate things!"))
319}
320
Dan Albert06feee92021-03-19 15:06:02 -0700321func (compiler *baseCompiler) rustdoc(ctx ModuleContext, flags Flags,
322 deps PathDeps) android.OptionalPath {
323
324 return android.OptionalPath{}
325}
326
Thiébaud Weksteenee6a89b2021-02-25 16:30:57 +0100327func (compiler *baseCompiler) initialize(ctx ModuleContext) {
328 compiler.cargoOutDir = android.PathForModuleOut(ctx, genSubDir)
329}
330
331func (compiler *baseCompiler) CargoOutDir() android.OptionalPath {
332 return android.OptionalPathForPath(compiler.cargoOutDir)
333}
334
Ivan Lozanoa9a1fc02021-08-11 15:13:43 -0400335func (compiler *baseCompiler) CargoEnvCompat() bool {
336 return Bool(compiler.Properties.Cargo_env_compat)
337}
338
339func (compiler *baseCompiler) CargoPkgVersion() string {
340 return String(compiler.Properties.Cargo_pkg_version)
341}
342
Jiyong Parke54f07e2021-04-07 15:08:04 +0900343func (compiler *baseCompiler) strippedOutputFilePath() android.OptionalPath {
344 return compiler.strippedOutputFile
345}
346
Ivan Lozanoffee3342019-08-27 12:03:00 -0700347func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps {
348 deps.Rlibs = append(deps.Rlibs, compiler.Properties.Rlibs...)
349 deps.Dylibs = append(deps.Dylibs, compiler.Properties.Dylibs...)
Matthew Maurer0f003b12020-06-29 14:34:06 -0700350 deps.Rustlibs = append(deps.Rustlibs, compiler.Properties.Rustlibs...)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700351 deps.ProcMacros = append(deps.ProcMacros, compiler.Properties.Proc_macros...)
352 deps.StaticLibs = append(deps.StaticLibs, compiler.Properties.Static_libs...)
Ivan Lozano63bb7682021-03-23 15:53:44 -0400353 deps.WholeStaticLibs = append(deps.WholeStaticLibs, compiler.Properties.Whole_static_libs...)
Ivan Lozanoffee3342019-08-27 12:03:00 -0700354 deps.SharedLibs = append(deps.SharedLibs, compiler.Properties.Shared_libs...)
355
Matthew Maurer99020b02019-10-31 10:44:40 -0700356 if !Bool(compiler.Properties.No_stdlibs) {
357 for _, stdlib := range config.Stdlibs {
Jiyong Parkb5d2dd22020-08-31 17:22:01 +0900358 // If we're building for the primary arch of the build host, use the compiler's stdlibs
Colin Cross0c66bc62021-07-20 09:47:41 -0700359 if ctx.Target().Os == ctx.Config().BuildOS {
Matthew Maurer99020b02019-10-31 10:44:40 -0700360 stdlib = stdlib + "_" + ctx.toolchain().RustTriple()
361 }
Ivan Lozano2b081132020-09-08 12:46:52 -0400362 deps.Stdlibs = append(deps.Stdlibs, stdlib)
Matthew Maurer99020b02019-10-31 10:44:40 -0700363 }
364 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700365 return deps
366}
367
Thiébaud Weksteenf1ff54a2021-03-22 14:24:54 +0100368func bionicDeps(ctx DepsContext, deps Deps, static bool) Deps {
Ivan Lozanobf63d002020-10-02 10:03:23 -0400369 bionicLibs := []string{}
370 bionicLibs = append(bionicLibs, "liblog")
371 bionicLibs = append(bionicLibs, "libc")
372 bionicLibs = append(bionicLibs, "libm")
373 bionicLibs = append(bionicLibs, "libdl")
374
375 if static {
376 deps.StaticLibs = append(deps.StaticLibs, bionicLibs...)
377 } else {
378 deps.SharedLibs = append(deps.SharedLibs, bionicLibs...)
379 }
Ivan Lozano8711c5c2021-08-13 13:14:06 -0400380 if ctx.RustModule().StaticExecutable() {
381 deps.StaticLibs = append(deps.StaticLibs, "libunwind")
382 }
Thiébaud Weksteenf1ff54a2021-03-22 14:24:54 +0100383 if libRuntimeBuiltins := config.BuiltinsRuntimeLibrary(ctx.toolchain()); libRuntimeBuiltins != "" {
384 deps.StaticLibs = append(deps.StaticLibs, libRuntimeBuiltins)
385 }
Ivan Lozanof1c84332019-09-20 11:00:37 -0700386 return deps
387}
388
Ivan Lozanoffee3342019-08-27 12:03:00 -0700389func (compiler *baseCompiler) crateName() string {
390 return compiler.Properties.Crate_name
391}
392
Ivan Lozanod7586b62021-04-01 09:49:36 -0400393func (compiler *baseCompiler) everInstallable() bool {
394 // Most modules are installable, so return true by default.
395 return true
396}
397
Colin Cross70dda7e2019-10-01 22:05:35 -0700398func (compiler *baseCompiler) installDir(ctx ModuleContext) android.InstallPath {
Ivan Lozanoffee3342019-08-27 12:03:00 -0700399 dir := compiler.dir
400 if ctx.toolchain().Is64Bit() && compiler.dir64 != "" {
401 dir = compiler.dir64
402 }
Ivan Lozanod6fdca82020-04-07 12:30:33 -0400403 if ctx.Target().NativeBridge == android.NativeBridgeEnabled {
404 dir = filepath.Join(dir, ctx.Target().NativeBridgeRelativePath)
405 }
406 if !ctx.Host() && ctx.Config().HasMultilibConflict(ctx.Arch().ArchType) {
Ivan Lozanoffee3342019-08-27 12:03:00 -0700407 dir = filepath.Join(dir, ctx.Arch().ArchType.String())
408 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400409
410 if compiler.location == InstallInData && ctx.RustModule().UseVndk() {
Matthew Maurer9f59e8d2021-08-19 13:10:05 -0700411 if ctx.RustModule().InProduct() {
412 dir = filepath.Join(dir, "product")
413 } else if ctx.RustModule().InVendor() {
414 dir = filepath.Join(dir, "vendor")
415 } else {
416 ctx.ModuleErrorf("Unknown data+VNDK installation kind")
417 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400418 }
Matthew Maurer9f59e8d2021-08-19 13:10:05 -0700419
Ivan Lozanoffee3342019-08-27 12:03:00 -0700420 return android.PathForModuleInstall(ctx, dir, compiler.subDir,
421 compiler.relativeInstallPath(), compiler.relative)
422}
423
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400424func (compiler *baseCompiler) nativeCoverage() bool {
425 return false
426}
427
Thiébaud Weksteenfabaff62020-08-27 13:48:36 +0200428func (compiler *baseCompiler) install(ctx ModuleContext) {
Jiyong Parke54f07e2021-04-07 15:08:04 +0900429 path := ctx.RustModule().OutputFile()
Thiébaud Weksteenfabaff62020-08-27 13:48:36 +0200430 compiler.path = ctx.InstallFile(compiler.installDir(ctx), path.Path().Base(), path.Path())
Ivan Lozanoffee3342019-08-27 12:03:00 -0700431}
432
433func (compiler *baseCompiler) getStem(ctx ModuleContext) string {
434 return compiler.getStemWithoutSuffix(ctx) + String(compiler.Properties.Suffix)
435}
436
437func (compiler *baseCompiler) getStemWithoutSuffix(ctx BaseModuleContext) string {
Thiébaud Weksteen1f7f70f2020-06-24 11:32:48 +0200438 stem := ctx.ModuleName()
Ivan Lozanoffee3342019-08-27 12:03:00 -0700439 if String(compiler.Properties.Stem) != "" {
440 stem = String(compiler.Properties.Stem)
441 }
442
443 return stem
444}
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700445
Ivan Lozanoffee3342019-08-27 12:03:00 -0700446func (compiler *baseCompiler) relativeInstallPath() string {
447 return String(compiler.Properties.Relative_install_path)
448}
449
Ivan Lozano43845682020-07-09 21:03:28 -0400450// Returns the Path for the main source file along with Paths for generated source files from modules listed in srcs.
Chih-Hung Hsiehbbd25ae2020-05-15 17:36:30 -0700451func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) (android.Path, android.Paths) {
452 // The srcs can contain strings with prefix ":".
453 // They are dependent modules of this module, with android.SourceDepTag.
454 // They are not the main source file compiled by rustc.
455 numSrcs := 0
456 srcIndex := 0
457 for i, s := range srcs {
458 if android.SrcIsModule(s) == "" {
459 numSrcs++
460 srcIndex = i
461 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700462 }
Ivan Lozanoe4db0032021-08-11 13:39:33 -0400463 if numSrcs > 1 {
Ivan Lozano43845682020-07-09 21:03:28 -0400464 ctx.PropertyErrorf("srcs", incorrectSourcesError)
Chih-Hung Hsiehbbd25ae2020-05-15 17:36:30 -0700465 }
Ivan Lozanoe4db0032021-08-11 13:39:33 -0400466
467 // If a main source file is not provided we expect only a single SourceProvider module to be defined
468 // within srcs, with the expectation that the first source it provides is the entry point.
Chih-Hung Hsiehbbd25ae2020-05-15 17:36:30 -0700469 if srcIndex != 0 {
470 ctx.PropertyErrorf("srcs", "main source file must be the first in srcs")
Ivan Lozanoe4db0032021-08-11 13:39:33 -0400471 } else if numSrcs > 1 {
472 ctx.PropertyErrorf("srcs", "only a single generated source module can be defined without a main source file.")
Chih-Hung Hsiehbbd25ae2020-05-15 17:36:30 -0700473 }
Ivan Lozanoe4db0032021-08-11 13:39:33 -0400474
Chih-Hung Hsiehbbd25ae2020-05-15 17:36:30 -0700475 paths := android.PathsForModuleSrc(ctx, srcs)
Ivan Lozano43845682020-07-09 21:03:28 -0400476 return paths[srcIndex], paths[1:]
Ivan Lozanoffee3342019-08-27 12:03:00 -0700477}