2019-08-27 21:03:00 +02:00
|
|
|
// Copyright 2019 The Android Open Source Project
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package rust
|
|
|
|
|
|
|
|
import (
|
2023-01-11 23:17:39 +01:00
|
|
|
"android/soong/cc"
|
2023-11-21 00:33:28 +01:00
|
|
|
"errors"
|
2019-08-27 21:03:00 +02:00
|
|
|
"fmt"
|
|
|
|
"path/filepath"
|
2021-07-27 18:29:12 +02:00
|
|
|
"strings"
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2019-11-01 03:38:29 +01:00
|
|
|
"github.com/google/blueprint/proptools"
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
"android/soong/android"
|
|
|
|
"android/soong/rust/config"
|
|
|
|
)
|
|
|
|
|
2020-09-28 19:22:45 +02:00
|
|
|
type RustLinkage int
|
|
|
|
|
|
|
|
const (
|
|
|
|
DefaultLinkage RustLinkage = iota
|
|
|
|
RlibLinkage
|
|
|
|
DylibLinkage
|
|
|
|
)
|
|
|
|
|
2023-11-20 18:49:25 +01:00
|
|
|
type compiler interface {
|
|
|
|
initialize(ctx ModuleContext)
|
|
|
|
compilerFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
cfgFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
featureFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
compilerProps() []interface{}
|
|
|
|
compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput
|
|
|
|
compilerDeps(ctx DepsContext, deps Deps) Deps
|
|
|
|
crateName() string
|
2023-11-21 01:20:02 +01:00
|
|
|
edition() string
|
|
|
|
features() []string
|
2023-11-20 18:49:25 +01:00
|
|
|
rustdoc(ctx ModuleContext, flags Flags, deps PathDeps) android.OptionalPath
|
|
|
|
|
|
|
|
// Output directory in which source-generated code from dependencies is
|
|
|
|
// copied. This is equivalent to Cargo's OUT_DIR variable.
|
2023-11-20 18:52:01 +01:00
|
|
|
cargoOutDir() android.OptionalPath
|
2023-11-20 18:49:25 +01:00
|
|
|
|
2023-11-20 18:52:01 +01:00
|
|
|
// cargoPkgVersion returns the value of the Cargo_pkg_version property.
|
|
|
|
cargoPkgVersion() string
|
2023-11-20 18:49:25 +01:00
|
|
|
|
2023-11-20 18:52:01 +01:00
|
|
|
// cargoEnvCompat returns whether Cargo environment variables should be used.
|
|
|
|
cargoEnvCompat() bool
|
2023-11-20 18:49:25 +01:00
|
|
|
|
|
|
|
inData() bool
|
|
|
|
install(ctx ModuleContext)
|
|
|
|
relativeInstallPath() string
|
|
|
|
everInstallable() bool
|
|
|
|
|
|
|
|
nativeCoverage() bool
|
|
|
|
|
|
|
|
Disabled() bool
|
|
|
|
SetDisabled()
|
|
|
|
|
|
|
|
stdLinkage(ctx *depsContext) RustLinkage
|
|
|
|
noStdlibs() bool
|
|
|
|
|
|
|
|
unstrippedOutputFilePath() android.Path
|
|
|
|
strippedOutputFilePath() android.OptionalPath
|
2023-11-20 22:02:40 +01:00
|
|
|
|
2023-11-21 00:33:28 +01:00
|
|
|
checkedCrateRootPath() (android.Path, error)
|
2023-11-20 18:49:25 +01:00
|
|
|
}
|
|
|
|
|
2020-08-03 10:46:28 +02:00
|
|
|
func (compiler *baseCompiler) edition() string {
|
2019-10-03 18:47:06 +02:00
|
|
|
return proptools.StringDefault(compiler.Properties.Edition, config.DefaultEdition)
|
|
|
|
}
|
|
|
|
|
2019-10-31 18:44:40 +01:00
|
|
|
func (compiler *baseCompiler) setNoStdlibs() {
|
|
|
|
compiler.Properties.No_stdlibs = proptools.BoolPtr(true)
|
|
|
|
}
|
|
|
|
|
2020-08-13 12:55:59 +02:00
|
|
|
func (compiler *baseCompiler) disableLints() {
|
|
|
|
compiler.Properties.Lints = proptools.StringPtr("none")
|
2020-08-04 22:02:28 +02:00
|
|
|
}
|
|
|
|
|
2019-12-13 04:36:05 +01:00
|
|
|
func NewBaseCompiler(dir, dir64 string, location installLocation) *baseCompiler {
|
2019-08-27 21:03:00 +02:00
|
|
|
return &baseCompiler{
|
2019-10-03 18:47:06 +02:00
|
|
|
Properties: BaseCompilerProperties{},
|
|
|
|
dir: dir,
|
|
|
|
dir64: dir64,
|
2019-12-13 04:36:05 +01:00
|
|
|
location: location,
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-13 04:36:05 +01:00
|
|
|
type installLocation int
|
|
|
|
|
|
|
|
const (
|
|
|
|
InstallInSystem installLocation = 0
|
|
|
|
InstallInData = iota
|
2020-07-10 03:03:28 +02:00
|
|
|
|
|
|
|
incorrectSourcesError = "srcs can only contain one path for a rust file and source providers prefixed by \":\""
|
2021-02-25 16:30:57 +01:00
|
|
|
genSubDir = "out/"
|
2019-12-13 04:36:05 +01:00
|
|
|
)
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
type BaseCompilerProperties struct {
|
2021-08-11 19:39:33 +02:00
|
|
|
// path to the source file that is the main entry point of the program (e.g. main.rs or lib.rs).
|
|
|
|
// Only a single source file can be defined. Modules which generate source can be included by prefixing
|
|
|
|
// the module name with ":", for example ":libfoo_bindgen"
|
|
|
|
//
|
|
|
|
// If no source file is defined, a single generated source module can be defined to be used as the main source.
|
2020-06-16 16:26:57 +02:00
|
|
|
Srcs []string `android:"path,arch_variant"`
|
|
|
|
|
2023-09-25 14:13:17 +02:00
|
|
|
// Entry point that is passed to rustc to begin the compilation. E.g. main.rs or lib.rs.
|
|
|
|
// When this property is set,
|
|
|
|
// * sandboxing is enabled for this module, and
|
|
|
|
// * the srcs attribute is interpreted as a list of all source files potentially
|
|
|
|
// used in compilation, including the entrypoint, and
|
|
|
|
// * compile_data can be used to add additional files used in compilation that
|
|
|
|
// not directly used as source files.
|
|
|
|
Crate_root *string `android:"path,arch_variant"`
|
|
|
|
|
2020-08-13 12:55:59 +02:00
|
|
|
// name of the lint set that should be used to validate this module.
|
|
|
|
//
|
|
|
|
// Possible values are "default" (for using a sensible set of lints
|
|
|
|
// depending on the module's location), "android" (for the strictest
|
|
|
|
// lint set that applies to all Android platform code), "vendor" (for
|
|
|
|
// a relaxed set) and "none" (for ignoring all lint warnings and
|
|
|
|
// errors). The default value is "default".
|
|
|
|
Lints *string
|
2019-09-27 03:59:27 +02:00
|
|
|
|
2021-04-07 14:53:06 +02:00
|
|
|
// flags to pass to rustc. To enable configuration options or features, use the "cfgs" or "features" properties.
|
2021-04-20 16:15:41 +02:00
|
|
|
Flags []string `android:"arch_variant"`
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
// flags to pass to the linker
|
2021-04-20 16:15:41 +02:00
|
|
|
Ld_flags []string `android:"arch_variant"`
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
// list of rust rlib crate dependencies
|
|
|
|
Rlibs []string `android:"arch_variant"`
|
|
|
|
|
2023-08-14 19:29:30 +02:00
|
|
|
// list of rust automatic crate dependencies.
|
|
|
|
// Rustlibs linkage is rlib for host targets and dylib for device targets.
|
2020-06-29 23:34:06 +02:00
|
|
|
Rustlibs []string `android:"arch_variant"`
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
// list of rust proc_macro crate dependencies
|
|
|
|
Proc_macros []string `android:"arch_variant"`
|
|
|
|
|
|
|
|
// list of C shared library dependencies
|
|
|
|
Shared_libs []string `android:"arch_variant"`
|
|
|
|
|
2021-03-23 20:53:44 +01:00
|
|
|
// list of C static library dependencies. These dependencies do not normally propagate to dependents
|
|
|
|
// and may need to be redeclared. See whole_static_libs for bundling static dependencies into a library.
|
2019-08-27 21:03:00 +02:00
|
|
|
Static_libs []string `android:"arch_variant"`
|
|
|
|
|
2021-03-23 20:53:44 +01:00
|
|
|
// Similar to static_libs, but will bundle the static library dependency into a library. This is helpful
|
|
|
|
// to avoid having to redeclare the dependency for dependents of this library, but in some cases may also
|
|
|
|
// result in bloat if multiple dependencies all include the same static library whole.
|
|
|
|
//
|
|
|
|
// The common use case for this is when the static library is unlikely to be a dependency of other modules to avoid
|
|
|
|
// having to redeclare the static library dependency for every dependent module.
|
|
|
|
// If you are not sure what to, for rust_library modules most static dependencies should go in static_libraries,
|
|
|
|
// and for rust_ffi modules most static dependencies should go into whole_static_libraries.
|
|
|
|
//
|
|
|
|
// For rust_ffi static variants, these libraries will be included in the resulting static library archive.
|
|
|
|
//
|
|
|
|
// For rust_library rlib variants, these libraries will be bundled into the resulting rlib library. This will
|
|
|
|
// include all of the static libraries symbols in any dylibs or binaries which use this rlib as well.
|
|
|
|
Whole_static_libs []string `android:"arch_variant"`
|
|
|
|
|
2022-03-07 16:41:53 +01:00
|
|
|
// list of Rust system library dependencies.
|
|
|
|
//
|
|
|
|
// This is usually only needed when `no_stdlibs` is true, in which case it can be used to depend on system crates
|
|
|
|
// like `core` and `alloc`.
|
|
|
|
Stdlibs []string `android:"arch_variant"`
|
|
|
|
|
2020-07-31 19:40:31 +02:00
|
|
|
// crate name, required for modules which produce Rust libraries: rust_library, rust_ffi and SourceProvider
|
|
|
|
// modules which create library variants (rust_bindgen). This must be the expected extern crate name used in
|
|
|
|
// source, and is required to conform to an enforced format matching library output files (if the output file is
|
|
|
|
// lib<someName><suffix>, the crate_name property must be <someName>).
|
2019-08-27 21:03:00 +02:00
|
|
|
Crate_name string `android:"arch_variant"`
|
|
|
|
|
|
|
|
// list of features to enable for this crate
|
|
|
|
Features []string `android:"arch_variant"`
|
|
|
|
|
2021-04-07 14:53:06 +02:00
|
|
|
// list of configuration options to enable for this crate. To enable features, use the "features" property.
|
|
|
|
Cfgs []string `android:"arch_variant"`
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
// specific rust edition that should be used if the default version is not desired
|
|
|
|
Edition *string `android:"arch_variant"`
|
|
|
|
|
|
|
|
// sets name of the output
|
|
|
|
Stem *string `android:"arch_variant"`
|
|
|
|
|
|
|
|
// append to name of output
|
|
|
|
Suffix *string `android:"arch_variant"`
|
|
|
|
|
|
|
|
// install to a subdirectory of the default install path for the module
|
|
|
|
Relative_install_path *string `android:"arch_variant"`
|
2019-10-31 18:44:40 +01:00
|
|
|
|
|
|
|
// whether to suppress inclusion of standard crates - defaults to false
|
2023-11-14 16:23:31 +01:00
|
|
|
No_stdlibs *bool `android:"arch_variant"`
|
2020-12-08 20:43:00 +01:00
|
|
|
|
|
|
|
// Change the rustlibs linkage to select rlib linkage by default for device targets.
|
|
|
|
// Also link libstd as an rlib as well on device targets.
|
|
|
|
// Note: This is the default behavior for host targets.
|
|
|
|
//
|
|
|
|
// This is primarily meant for rust_binary and rust_ffi modules where the default
|
|
|
|
// linkage of libstd might need to be overridden in some use cases. This should
|
|
|
|
// generally be avoided with other module types since it may cause collisions at
|
2022-09-29 15:12:23 +02:00
|
|
|
// linkage if all dependencies of the root binary module do not link against libstd
|
2020-12-08 20:43:00 +01:00
|
|
|
// the same way.
|
|
|
|
Prefer_rlib *bool `android:"arch_variant"`
|
2021-08-11 21:13:43 +02:00
|
|
|
|
|
|
|
// Enables emitting certain Cargo environment variables. Only intended to be used for compatibility purposes.
|
|
|
|
// Will set CARGO_CRATE_NAME to the crate_name property's value.
|
|
|
|
// Will set CARGO_BIN_NAME to the output filename value without the extension.
|
|
|
|
Cargo_env_compat *bool
|
|
|
|
|
|
|
|
// If cargo_env_compat is true, sets the CARGO_PKG_VERSION env var to this value.
|
|
|
|
Cargo_pkg_version *string
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type baseCompiler struct {
|
2021-01-15 01:03:18 +01:00
|
|
|
Properties BaseCompilerProperties
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
// Install related
|
|
|
|
dir string
|
|
|
|
dir64 string
|
|
|
|
subDir string
|
|
|
|
relative string
|
2019-10-02 07:05:35 +02:00
|
|
|
path android.InstallPath
|
2019-12-13 04:36:05 +01:00
|
|
|
location installLocation
|
2020-02-11 14:24:25 +01:00
|
|
|
sanitize *sanitize
|
2020-06-16 16:26:57 +02:00
|
|
|
|
2021-01-15 01:03:18 +01:00
|
|
|
distFile android.OptionalPath
|
2021-11-05 21:36:47 +01:00
|
|
|
|
2023-11-15 21:39:40 +01:00
|
|
|
installDeps android.InstallPaths
|
|
|
|
|
2021-11-05 21:36:47 +01:00
|
|
|
// unstripped output file.
|
|
|
|
unstrippedOutputFile android.Path
|
|
|
|
|
|
|
|
// stripped output file.
|
2020-08-27 13:48:36 +02:00
|
|
|
strippedOutputFile android.OptionalPath
|
2021-02-25 16:30:57 +01:00
|
|
|
|
|
|
|
// If a crate has a source-generated dependency, a copy of the source file
|
|
|
|
// will be available in cargoOutDir (equivalent to Cargo OUT_DIR).
|
2023-11-20 18:52:01 +01:00
|
|
|
// This is stored internally because it may not be available during
|
|
|
|
// singleton-generation passes like rustdoc/rust_project.json, but should
|
|
|
|
// be stashed during initial generation.
|
|
|
|
cachedCargoOutDir android.ModuleOutPath
|
2023-11-21 00:33:28 +01:00
|
|
|
// Calculated crate root cached internally because ModuleContext is not
|
|
|
|
// available to singleton targets like rustdoc/rust_project.json
|
|
|
|
cachedCrateRootPath android.Path
|
|
|
|
// If cachedCrateRootPath is nil after initialization, this will contain
|
|
|
|
// an explanation of why
|
|
|
|
cachedCrateRootError error
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-07-31 19:40:31 +02:00
|
|
|
func (compiler *baseCompiler) Disabled() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) SetDisabled() {
|
|
|
|
panic("baseCompiler does not implement SetDisabled()")
|
|
|
|
}
|
|
|
|
|
2023-02-14 16:56:14 +01:00
|
|
|
func (compiler *baseCompiler) noStdlibs() bool {
|
|
|
|
return Bool(compiler.Properties.No_stdlibs)
|
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func (compiler *baseCompiler) coverageOutputZipPath() android.OptionalPath {
|
|
|
|
panic("baseCompiler does not implement coverageOutputZipPath()")
|
|
|
|
}
|
|
|
|
|
2020-12-08 20:43:00 +01:00
|
|
|
func (compiler *baseCompiler) preferRlib() bool {
|
|
|
|
return Bool(compiler.Properties.Prefer_rlib)
|
|
|
|
}
|
|
|
|
|
2020-09-28 19:22:45 +02:00
|
|
|
func (compiler *baseCompiler) stdLinkage(ctx *depsContext) RustLinkage {
|
2020-09-08 18:46:52 +02:00
|
|
|
// For devices, we always link stdlibs in as dylibs by default.
|
2020-12-08 20:43:00 +01:00
|
|
|
if compiler.preferRlib() {
|
|
|
|
return RlibLinkage
|
|
|
|
} else if ctx.Device() {
|
2020-09-28 19:22:45 +02:00
|
|
|
return DylibLinkage
|
2020-09-08 18:46:52 +02:00
|
|
|
} else {
|
2020-09-28 19:22:45 +02:00
|
|
|
return RlibLinkage
|
2020-09-08 18:46:52 +02:00
|
|
|
}
|
2020-08-18 20:31:23 +02:00
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
var _ compiler = (*baseCompiler)(nil)
|
|
|
|
|
2019-12-13 04:36:05 +01:00
|
|
|
func (compiler *baseCompiler) inData() bool {
|
|
|
|
return compiler.location == InstallInData
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (compiler *baseCompiler) compilerProps() []interface{} {
|
|
|
|
return []interface{}{&compiler.Properties}
|
|
|
|
}
|
|
|
|
|
2021-04-07 14:53:06 +02:00
|
|
|
func (compiler *baseCompiler) cfgsToFlags() []string {
|
|
|
|
flags := []string{}
|
|
|
|
for _, cfg := range compiler.Properties.Cfgs {
|
|
|
|
flags = append(flags, "--cfg '"+cfg+"'")
|
|
|
|
}
|
2021-09-23 17:50:33 +02:00
|
|
|
|
2021-04-07 14:53:06 +02:00
|
|
|
return flags
|
|
|
|
}
|
|
|
|
|
2023-11-21 01:20:02 +01:00
|
|
|
func (compiler *baseCompiler) features() []string {
|
|
|
|
return compiler.Properties.Features
|
|
|
|
}
|
|
|
|
|
2021-04-07 14:53:06 +02:00
|
|
|
func (compiler *baseCompiler) featuresToFlags() []string {
|
2019-08-27 21:03:00 +02:00
|
|
|
flags := []string{}
|
2023-11-21 01:20:02 +01:00
|
|
|
for _, feature := range compiler.features() {
|
2019-08-27 21:03:00 +02:00
|
|
|
flags = append(flags, "--cfg 'feature=\""+feature+"\"'")
|
|
|
|
}
|
2021-09-23 17:50:33 +02:00
|
|
|
|
|
|
|
return flags
|
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) featureFlags(ctx ModuleContext, flags Flags) Flags {
|
|
|
|
flags.RustFlags = append(flags.RustFlags, compiler.featuresToFlags()...)
|
|
|
|
flags.RustdocFlags = append(flags.RustdocFlags, compiler.featuresToFlags()...)
|
|
|
|
|
|
|
|
return flags
|
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) cfgFlags(ctx ModuleContext, flags Flags) Flags {
|
2024-01-08 04:55:45 +01:00
|
|
|
if ctx.RustModule().InVendorOrProduct() {
|
2021-09-23 17:50:33 +02:00
|
|
|
compiler.Properties.Cfgs = append(compiler.Properties.Cfgs, "android_vndk")
|
2023-02-24 20:19:22 +01:00
|
|
|
if ctx.RustModule().InVendor() {
|
|
|
|
compiler.Properties.Cfgs = append(compiler.Properties.Cfgs, "android_vendor")
|
|
|
|
} else if ctx.RustModule().InProduct() {
|
|
|
|
compiler.Properties.Cfgs = append(compiler.Properties.Cfgs, "android_product")
|
|
|
|
}
|
2021-09-23 17:50:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
flags.RustFlags = append(flags.RustFlags, compiler.cfgsToFlags()...)
|
|
|
|
flags.RustdocFlags = append(flags.RustdocFlags, compiler.cfgsToFlags()...)
|
2019-08-27 21:03:00 +02:00
|
|
|
return flags
|
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flags {
|
|
|
|
|
2020-08-13 12:55:59 +02:00
|
|
|
lintFlags, err := config.RustcLintsForDir(ctx.ModuleDir(), compiler.Properties.Lints)
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("lints", err.Error())
|
2019-09-27 03:59:27 +02:00
|
|
|
}
|
2021-07-27 18:29:12 +02:00
|
|
|
|
|
|
|
// linkage-related flags are disallowed.
|
|
|
|
for _, s := range compiler.Properties.Ld_flags {
|
|
|
|
if strings.HasPrefix(s, "-Wl,-l") || strings.HasPrefix(s, "-Wl,-L") {
|
|
|
|
ctx.PropertyErrorf("ld_flags", "'-Wl,-l' and '-Wl,-L' flags cannot be manually specified")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, s := range compiler.Properties.Flags {
|
|
|
|
if strings.HasPrefix(s, "-l") || strings.HasPrefix(s, "-L") {
|
|
|
|
ctx.PropertyErrorf("flags", "'-l' and '-L' flags cannot be manually specified")
|
|
|
|
}
|
|
|
|
if strings.HasPrefix(s, "--extern") {
|
|
|
|
ctx.PropertyErrorf("flags", "'--extern' flag cannot be manually specified")
|
|
|
|
}
|
|
|
|
if strings.HasPrefix(s, "-Clink-args=") || strings.HasPrefix(s, "-C link-args=") {
|
|
|
|
ctx.PropertyErrorf("flags", "'-C link-args' flag cannot be manually specified")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-13 12:55:59 +02:00
|
|
|
flags.RustFlags = append(flags.RustFlags, lintFlags)
|
2019-08-27 21:03:00 +02:00
|
|
|
flags.RustFlags = append(flags.RustFlags, compiler.Properties.Flags...)
|
2020-08-03 10:46:28 +02:00
|
|
|
flags.RustFlags = append(flags.RustFlags, "--edition="+compiler.edition())
|
2021-03-19 23:06:02 +01:00
|
|
|
flags.RustdocFlags = append(flags.RustdocFlags, "--edition="+compiler.edition())
|
2019-08-27 21:03:00 +02:00
|
|
|
flags.LinkFlags = append(flags.LinkFlags, compiler.Properties.Ld_flags...)
|
2019-09-30 22:01:37 +02:00
|
|
|
flags.GlobalRustFlags = append(flags.GlobalRustFlags, config.GlobalRustFlags...)
|
2019-09-20 20:00:37 +02:00
|
|
|
flags.GlobalRustFlags = append(flags.GlobalRustFlags, ctx.toolchain().ToolchainRustFlags())
|
|
|
|
flags.GlobalLinkFlags = append(flags.GlobalLinkFlags, ctx.toolchain().ToolchainLinkFlags())
|
2022-04-19 05:12:56 +02:00
|
|
|
flags.EmitXrefs = ctx.Config().EmitXrefRules()
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
if ctx.Host() && !ctx.Windows() {
|
2023-01-11 23:17:39 +01:00
|
|
|
flags.LinkFlags = append(flags.LinkFlags, cc.RpathFlags(ctx)...)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2023-10-04 04:12:50 +02:00
|
|
|
if ctx.Os() == android.Linux {
|
|
|
|
// Add -lc, -lrt, -ldl, -lpthread, -lm and -lgcc_s to glibc builds to match
|
|
|
|
// the default behavior of device builds.
|
2023-09-21 21:28:53 +02:00
|
|
|
flags.LinkFlags = append(flags.LinkFlags, config.LinuxHostGlobalLinkFlags...)
|
2023-10-04 04:12:50 +02:00
|
|
|
} else if ctx.Os() == android.Darwin {
|
|
|
|
// Add -lc, -ldl, -lpthread and -lm to glibc darwin builds to match the default
|
|
|
|
// behavior of device builds.
|
|
|
|
flags.LinkFlags = append(flags.LinkFlags,
|
|
|
|
"-lc",
|
|
|
|
"-ldl",
|
|
|
|
"-lpthread",
|
|
|
|
"-lm",
|
|
|
|
)
|
2023-07-27 16:40:52 +02:00
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
return flags
|
|
|
|
}
|
|
|
|
|
2022-04-19 05:12:56 +02:00
|
|
|
func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput {
|
2019-08-27 21:03:00 +02:00
|
|
|
panic(fmt.Errorf("baseCrater doesn't know how to crate things!"))
|
|
|
|
}
|
|
|
|
|
2021-03-19 23:06:02 +01:00
|
|
|
func (compiler *baseCompiler) rustdoc(ctx ModuleContext, flags Flags,
|
|
|
|
deps PathDeps) android.OptionalPath {
|
|
|
|
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
|
|
|
|
2021-02-25 16:30:57 +01:00
|
|
|
func (compiler *baseCompiler) initialize(ctx ModuleContext) {
|
2023-11-20 18:52:01 +01:00
|
|
|
compiler.cachedCargoOutDir = android.PathForModuleOut(ctx, genSubDir)
|
2023-11-21 00:33:28 +01:00
|
|
|
if compiler.Properties.Crate_root == nil {
|
|
|
|
compiler.cachedCrateRootPath, compiler.cachedCrateRootError = srcPathFromModuleSrcs(ctx, compiler.Properties.Srcs)
|
|
|
|
} else {
|
|
|
|
compiler.cachedCrateRootPath = android.PathForModuleSrc(ctx, *compiler.Properties.Crate_root)
|
|
|
|
compiler.cachedCrateRootError = nil
|
|
|
|
}
|
2021-02-25 16:30:57 +01:00
|
|
|
}
|
|
|
|
|
2023-11-20 18:52:01 +01:00
|
|
|
func (compiler *baseCompiler) cargoOutDir() android.OptionalPath {
|
|
|
|
return android.OptionalPathForPath(compiler.cachedCargoOutDir)
|
2021-02-25 16:30:57 +01:00
|
|
|
}
|
|
|
|
|
2023-11-20 18:52:01 +01:00
|
|
|
func (compiler *baseCompiler) cargoEnvCompat() bool {
|
2021-08-11 21:13:43 +02:00
|
|
|
return Bool(compiler.Properties.Cargo_env_compat)
|
|
|
|
}
|
|
|
|
|
2023-11-20 18:52:01 +01:00
|
|
|
func (compiler *baseCompiler) cargoPkgVersion() string {
|
2021-08-11 21:13:43 +02:00
|
|
|
return String(compiler.Properties.Cargo_pkg_version)
|
|
|
|
}
|
|
|
|
|
2021-11-05 21:36:47 +01:00
|
|
|
func (compiler *baseCompiler) unstrippedOutputFilePath() android.Path {
|
|
|
|
return compiler.unstrippedOutputFile
|
|
|
|
}
|
|
|
|
|
2021-04-07 08:08:04 +02:00
|
|
|
func (compiler *baseCompiler) strippedOutputFilePath() android.OptionalPath {
|
|
|
|
return compiler.strippedOutputFile
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps {
|
|
|
|
deps.Rlibs = append(deps.Rlibs, compiler.Properties.Rlibs...)
|
2020-06-29 23:34:06 +02:00
|
|
|
deps.Rustlibs = append(deps.Rustlibs, compiler.Properties.Rustlibs...)
|
2019-08-27 21:03:00 +02:00
|
|
|
deps.ProcMacros = append(deps.ProcMacros, compiler.Properties.Proc_macros...)
|
|
|
|
deps.StaticLibs = append(deps.StaticLibs, compiler.Properties.Static_libs...)
|
2021-03-23 20:53:44 +01:00
|
|
|
deps.WholeStaticLibs = append(deps.WholeStaticLibs, compiler.Properties.Whole_static_libs...)
|
2019-08-27 21:03:00 +02:00
|
|
|
deps.SharedLibs = append(deps.SharedLibs, compiler.Properties.Shared_libs...)
|
2022-03-07 16:41:53 +01:00
|
|
|
deps.Stdlibs = append(deps.Stdlibs, compiler.Properties.Stdlibs...)
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2019-10-31 18:44:40 +01:00
|
|
|
if !Bool(compiler.Properties.No_stdlibs) {
|
|
|
|
for _, stdlib := range config.Stdlibs {
|
2022-07-01 20:17:22 +02:00
|
|
|
// If we're building for the build host, use the prebuilt stdlibs, unless the host
|
|
|
|
// is linux_bionic which doesn't have prebuilts.
|
|
|
|
if ctx.Host() && !ctx.Target().HostCross && ctx.Target().Os != android.LinuxBionic {
|
2021-11-11 15:29:07 +01:00
|
|
|
stdlib = "prebuilt_" + stdlib
|
2019-10-31 18:44:40 +01:00
|
|
|
}
|
2020-09-08 18:46:52 +02:00
|
|
|
deps.Stdlibs = append(deps.Stdlibs, stdlib)
|
2019-10-31 18:44:40 +01:00
|
|
|
}
|
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
return deps
|
|
|
|
}
|
|
|
|
|
2021-03-22 14:24:54 +01:00
|
|
|
func bionicDeps(ctx DepsContext, deps Deps, static bool) Deps {
|
2020-10-02 16:03:23 +02:00
|
|
|
bionicLibs := []string{}
|
|
|
|
bionicLibs = append(bionicLibs, "liblog")
|
|
|
|
bionicLibs = append(bionicLibs, "libc")
|
|
|
|
bionicLibs = append(bionicLibs, "libm")
|
|
|
|
bionicLibs = append(bionicLibs, "libdl")
|
|
|
|
|
|
|
|
if static {
|
|
|
|
deps.StaticLibs = append(deps.StaticLibs, bionicLibs...)
|
|
|
|
} else {
|
|
|
|
deps.SharedLibs = append(deps.SharedLibs, bionicLibs...)
|
|
|
|
}
|
2021-08-13 19:14:06 +02:00
|
|
|
if ctx.RustModule().StaticExecutable() {
|
|
|
|
deps.StaticLibs = append(deps.StaticLibs, "libunwind")
|
|
|
|
}
|
2021-03-22 14:24:54 +01:00
|
|
|
if libRuntimeBuiltins := config.BuiltinsRuntimeLibrary(ctx.toolchain()); libRuntimeBuiltins != "" {
|
|
|
|
deps.StaticLibs = append(deps.StaticLibs, libRuntimeBuiltins)
|
|
|
|
}
|
2019-09-20 20:00:37 +02:00
|
|
|
return deps
|
|
|
|
}
|
|
|
|
|
2022-01-24 05:48:36 +01:00
|
|
|
func muslDeps(ctx DepsContext, deps Deps, static bool) Deps {
|
|
|
|
muslLibs := []string{"libc_musl"}
|
|
|
|
if static {
|
|
|
|
deps.StaticLibs = append(deps.StaticLibs, muslLibs...)
|
|
|
|
} else {
|
|
|
|
deps.SharedLibs = append(deps.SharedLibs, muslLibs...)
|
|
|
|
}
|
|
|
|
if libRuntimeBuiltins := config.BuiltinsRuntimeLibrary(ctx.toolchain()); libRuntimeBuiltins != "" {
|
|
|
|
deps.StaticLibs = append(deps.StaticLibs, libRuntimeBuiltins)
|
|
|
|
}
|
|
|
|
|
|
|
|
return deps
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (compiler *baseCompiler) crateName() string {
|
|
|
|
return compiler.Properties.Crate_name
|
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (compiler *baseCompiler) everInstallable() bool {
|
|
|
|
// Most modules are installable, so return true by default.
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2019-10-02 07:05:35 +02:00
|
|
|
func (compiler *baseCompiler) installDir(ctx ModuleContext) android.InstallPath {
|
2019-08-27 21:03:00 +02:00
|
|
|
dir := compiler.dir
|
|
|
|
if ctx.toolchain().Is64Bit() && compiler.dir64 != "" {
|
|
|
|
dir = compiler.dir64
|
|
|
|
}
|
2020-04-07 18:30:33 +02:00
|
|
|
if ctx.Target().NativeBridge == android.NativeBridgeEnabled {
|
|
|
|
dir = filepath.Join(dir, ctx.Target().NativeBridgeRelativePath)
|
|
|
|
}
|
|
|
|
if !ctx.Host() && ctx.Config().HasMultilibConflict(ctx.Arch().ArchType) {
|
2019-08-27 21:03:00 +02:00
|
|
|
dir = filepath.Join(dir, ctx.Arch().ArchType.String())
|
|
|
|
}
|
2021-04-02 18:41:32 +02:00
|
|
|
|
2024-01-08 04:55:45 +01:00
|
|
|
if compiler.location == InstallInData && ctx.RustModule().InVendorOrProduct() {
|
2021-08-19 22:10:05 +02:00
|
|
|
if ctx.RustModule().InProduct() {
|
|
|
|
dir = filepath.Join(dir, "product")
|
|
|
|
} else if ctx.RustModule().InVendor() {
|
|
|
|
dir = filepath.Join(dir, "vendor")
|
|
|
|
} else {
|
|
|
|
ctx.ModuleErrorf("Unknown data+VNDK installation kind")
|
|
|
|
}
|
2021-04-02 18:41:32 +02:00
|
|
|
}
|
2021-08-19 22:10:05 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
return android.PathForModuleInstall(ctx, dir, compiler.subDir,
|
|
|
|
compiler.relativeInstallPath(), compiler.relative)
|
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func (compiler *baseCompiler) nativeCoverage() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-08-27 13:48:36 +02:00
|
|
|
func (compiler *baseCompiler) install(ctx ModuleContext) {
|
2021-04-07 08:08:04 +02:00
|
|
|
path := ctx.RustModule().OutputFile()
|
2023-11-15 21:39:40 +01:00
|
|
|
compiler.path = ctx.InstallFile(compiler.installDir(ctx), path.Path().Base(), path.Path(), compiler.installDeps...)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) installTestData(ctx ModuleContext, data []android.DataPath) {
|
|
|
|
installedData := ctx.InstallTestData(compiler.installDir(ctx), data)
|
|
|
|
compiler.installDeps = append(compiler.installDeps, installedData...)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) getStem(ctx ModuleContext) string {
|
|
|
|
return compiler.getStemWithoutSuffix(ctx) + String(compiler.Properties.Suffix)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (compiler *baseCompiler) getStemWithoutSuffix(ctx BaseModuleContext) string {
|
2020-06-24 11:32:48 +02:00
|
|
|
stem := ctx.ModuleName()
|
2019-08-27 21:03:00 +02:00
|
|
|
if String(compiler.Properties.Stem) != "" {
|
|
|
|
stem = String(compiler.Properties.Stem)
|
|
|
|
}
|
|
|
|
|
|
|
|
return stem
|
|
|
|
}
|
2019-11-01 03:38:29 +01:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (compiler *baseCompiler) relativeInstallPath() string {
|
|
|
|
return String(compiler.Properties.Relative_install_path)
|
|
|
|
}
|
|
|
|
|
2023-11-21 00:33:28 +01:00
|
|
|
func (compiler *baseCompiler) checkedCrateRootPath() (android.Path, error) {
|
|
|
|
return compiler.cachedCrateRootPath, compiler.cachedCrateRootError
|
2023-11-20 22:02:40 +01:00
|
|
|
}
|
|
|
|
|
2023-11-21 00:33:28 +01:00
|
|
|
func crateRootPath(ctx ModuleContext, compiler compiler) android.Path {
|
|
|
|
root, err := compiler.checkedCrateRootPath()
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("srcs", err.Error())
|
2021-10-14 00:32:18 +02:00
|
|
|
}
|
2023-11-21 00:33:28 +01:00
|
|
|
return root
|
|
|
|
}
|
2021-10-14 00:32:18 +02:00
|
|
|
|
2023-11-21 00:33:28 +01:00
|
|
|
// Returns the Path for the main source file along with Paths for generated source files from modules listed in srcs.
|
|
|
|
func srcPathFromModuleSrcs(ctx ModuleContext, srcs []string) (android.Path, error) {
|
2020-05-16 02:36:30 +02:00
|
|
|
// The srcs can contain strings with prefix ":".
|
|
|
|
// They are dependent modules of this module, with android.SourceDepTag.
|
|
|
|
// They are not the main source file compiled by rustc.
|
|
|
|
numSrcs := 0
|
|
|
|
srcIndex := 0
|
|
|
|
for i, s := range srcs {
|
|
|
|
if android.SrcIsModule(s) == "" {
|
|
|
|
numSrcs++
|
|
|
|
srcIndex = i
|
|
|
|
}
|
|
|
|
}
|
2021-08-11 19:39:33 +02:00
|
|
|
if numSrcs > 1 {
|
2023-11-21 00:33:28 +01:00
|
|
|
return nil, errors.New(incorrectSourcesError)
|
2020-05-16 02:36:30 +02:00
|
|
|
}
|
2021-08-11 19:39:33 +02:00
|
|
|
|
|
|
|
// If a main source file is not provided we expect only a single SourceProvider module to be defined
|
|
|
|
// within srcs, with the expectation that the first source it provides is the entry point.
|
2020-05-16 02:36:30 +02:00
|
|
|
if srcIndex != 0 {
|
2023-11-21 00:33:28 +01:00
|
|
|
return nil, errors.New("main source file must be the first in srcs")
|
2021-08-11 19:39:33 +02:00
|
|
|
} else if numSrcs > 1 {
|
2023-11-21 00:33:28 +01:00
|
|
|
return nil, errors.New("only a single generated source module can be defined without a main source file.")
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
2021-08-11 19:39:33 +02:00
|
|
|
|
2023-09-25 14:13:17 +02:00
|
|
|
// TODO: b/297264540 - once all modules are sandboxed, we need to select the proper
|
|
|
|
// entry point file from Srcs rather than taking the first one
|
2020-05-16 02:36:30 +02:00
|
|
|
paths := android.PathsForModuleSrc(ctx, srcs)
|
2023-11-21 00:33:28 +01:00
|
|
|
if len(paths) == 0 {
|
|
|
|
return nil, errors.New("srcs must not be empty")
|
|
|
|
}
|
|
|
|
return paths[srcIndex], nil
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|