|  | // 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 config | 
|  |  | 
|  | import ( | 
|  | "strings" | 
|  |  | 
|  | "android/soong/android" | 
|  | _ "android/soong/cc/config" | 
|  | ) | 
|  |  | 
|  | var ( | 
|  | pctx         = android.NewPackageContext("android/soong/rust/config") | 
|  | ExportedVars = android.NewExportedVariables(pctx) | 
|  |  | 
|  | RustDefaultVersion = "1.73.0" | 
|  | RustDefaultBase    = "prebuilts/rust/" | 
|  | DefaultEdition     = "2021" | 
|  | Stdlibs            = []string{ | 
|  | "libstd", | 
|  | } | 
|  |  | 
|  | // Mapping between Soong internal arch types and std::env constants. | 
|  | // Required as Rust uses aarch64 when Soong uses arm64. | 
|  | StdEnvArch = map[android.ArchType]string{ | 
|  | android.Arm:    "arm", | 
|  | android.Arm64:  "aarch64", | 
|  | android.X86:    "x86", | 
|  | android.X86_64: "x86_64", | 
|  | } | 
|  |  | 
|  | GlobalRustFlags = []string{ | 
|  | "-Z stack-protector=strong", | 
|  | "-Z remap-cwd-prefix=.", | 
|  | "-C debuginfo=2", | 
|  | "-C opt-level=3", | 
|  | "-C relocation-model=pic", | 
|  | "-C overflow-checks=on", | 
|  | "-C force-unwind-tables=yes", | 
|  | // Use v0 mangling to distinguish from C++ symbols | 
|  | "-C symbol-mangling-version=v0", | 
|  | // This flag requires to have no space so that when it's exported to bazel | 
|  | // it can be removed. See aosp/2768339 | 
|  | "--color=always", | 
|  | "-Z dylib-lto", | 
|  | "-Z link-native-libraries=no", | 
|  | } | 
|  |  | 
|  | LinuxHostGlobalLinkFlags = []string{ | 
|  | "-lc", | 
|  | "-lrt", | 
|  | "-ldl", | 
|  | "-lpthread", | 
|  | "-lm", | 
|  | "-lgcc_s", | 
|  | "-Wl,--compress-debug-sections=zstd", | 
|  | } | 
|  |  | 
|  | deviceGlobalRustFlags = []string{ | 
|  | "-C panic=abort", | 
|  | // Generate additional debug info for AutoFDO | 
|  | "-Z debug-info-for-profiling", | 
|  | } | 
|  |  | 
|  | deviceGlobalLinkFlags = []string{ | 
|  | // Prepend the lld flags from cc_config so we stay in sync with cc | 
|  | "${cc_config.DeviceGlobalLldflags}", | 
|  |  | 
|  | // Override cc's --no-undefined-version to allow rustc's generated alloc functions | 
|  | "-Wl,--undefined-version", | 
|  |  | 
|  | "-Wl,-Bdynamic", | 
|  | "-nostdlib", | 
|  | "-Wl,--pack-dyn-relocs=android+relr", | 
|  | "-Wl,--use-android-relr-tags", | 
|  | "-Wl,--no-undefined", | 
|  | "-B${cc_config.ClangBin}", | 
|  | "-Wl,--compress-debug-sections=zstd", | 
|  | } | 
|  | ) | 
|  |  | 
|  | func init() { | 
|  | pctx.SourcePathVariable("RustDefaultBase", RustDefaultBase) | 
|  | pctx.VariableConfigMethod("HostPrebuiltTag", HostPrebuiltTag) | 
|  |  | 
|  | pctx.VariableFunc("RustBase", func(ctx android.PackageVarContext) string { | 
|  | if override := ctx.Config().Getenv("RUST_PREBUILTS_BASE"); override != "" { | 
|  | return override | 
|  | } | 
|  | return "${RustDefaultBase}" | 
|  | }) | 
|  |  | 
|  | pctx.VariableFunc("RustVersion", getRustVersionPctx) | 
|  |  | 
|  | pctx.StaticVariable("RustPath", "${RustBase}/${HostPrebuiltTag}/${RustVersion}") | 
|  | pctx.StaticVariable("RustBin", "${RustPath}/bin") | 
|  |  | 
|  | pctx.ImportAs("cc_config", "android/soong/cc/config") | 
|  | pctx.StaticVariable("RustLinker", "${cc_config.ClangBin}/clang++") | 
|  |  | 
|  | pctx.StaticVariable("DeviceGlobalLinkFlags", strings.Join(deviceGlobalLinkFlags, " ")) | 
|  |  | 
|  | ExportedVars.ExportStringStaticVariable("RUST_DEFAULT_VERSION", RustDefaultVersion) | 
|  | ExportedVars.ExportStringListStaticVariable("GLOBAL_RUSTC_FLAGS", GlobalRustFlags) | 
|  | ExportedVars.ExportStringListStaticVariable("LINUX_HOST_GLOBAL_LINK_FLAGS", LinuxHostGlobalLinkFlags) | 
|  |  | 
|  | ExportedVars.ExportStringListStaticVariable("DEVICE_GLOBAL_RUSTC_FLAGS", deviceGlobalRustFlags) | 
|  | ExportedVars.ExportStringListStaticVariable("DEVICE_GLOBAL_LINK_FLAGS", | 
|  | android.RemoveListFromList(deviceGlobalLinkFlags, []string{ | 
|  | // The cc_config flags are retrieved from cc_toolchain by rust rules. | 
|  | "${cc_config.DeviceGlobalLldflags}", | 
|  | "-B${cc_config.ClangBin}", | 
|  | })) | 
|  | } | 
|  |  | 
|  | func HostPrebuiltTag(config android.Config) string { | 
|  | if config.UseHostMusl() { | 
|  | return "linux-musl-x86" | 
|  | } else { | 
|  | return config.PrebuiltOS() | 
|  | } | 
|  | } | 
|  |  | 
|  | func getRustVersionPctx(ctx android.PackageVarContext) string { | 
|  | return GetRustVersion(ctx) | 
|  | } | 
|  |  | 
|  | func GetRustVersion(ctx android.PathContext) string { | 
|  | if override := ctx.Config().Getenv("RUST_PREBUILTS_VERSION"); override != "" { | 
|  | return override | 
|  | } | 
|  | return RustDefaultVersion | 
|  | } | 
|  |  | 
|  | // BazelRustToolchainVars returns a string with | 
|  | func BazelRustToolchainVars(config android.Config) string { | 
|  | return android.BazelToolchainVars(config, ExportedVars) | 
|  | } |