aosp/2518976 revealed a pre-existing bug, which was that some Rust test targets did not have all of their shared library dependencies packaged in the host-unit-tests.zip file. Conveniently enough, these targets did not actually depend on any of the symbols in the missing shared libraries, so their DT_NEEDED entries were being removed by the --as-needed flag being passed to the linker by rustc. This flag was dropped when we switched to running the link command directly, causing the DT_NEEDED entries to reappear and leading to runtime failures for these test binaries. Although we could fix the issue that prevented these (unused) dependencies from being packaged, there wouldn't be much point in doing so because we already know that they aren't needed. So for now, let's return to the status quo and keep passing --as-needed to the linker. Bug: 278168700 Change-Id: Iae103803983240fa14cdbc2ff0d8ffb4329c6024
123 lines
3.4 KiB
Go
123 lines
3.4 KiB
Go
// 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")
|
|
|
|
var (
|
|
RustDefaultVersion = "1.68.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 remap-cwd-prefix=.",
|
|
"-C codegen-units=1",
|
|
"-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",
|
|
"--color always",
|
|
// TODO (b/267698452): Temporary workaround until the "no unstable
|
|
// features" policy is enforced.
|
|
"-A stable-features",
|
|
"-Zdylib-lto",
|
|
}
|
|
|
|
deviceGlobalRustFlags = []string{
|
|
"-C panic=abort",
|
|
"-Z link-native-libraries=no",
|
|
// 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}",
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
pctx.SourcePathVariable("RustDefaultBase", RustDefaultBase)
|
|
pctx.VariableConfigMethod("HostPrebuiltTag", func(config android.Config) string {
|
|
if config.UseHostMusl() {
|
|
return "linux-musl-x86"
|
|
} else {
|
|
return config.PrebuiltOS()
|
|
}
|
|
})
|
|
|
|
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("RustLinkerArgs", "-Wl,--as-needed")
|
|
|
|
pctx.StaticVariable("DeviceGlobalLinkFlags", strings.Join(deviceGlobalLinkFlags, " "))
|
|
|
|
}
|
|
|
|
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
|
|
}
|