1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage config 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker _ "android/soong/cc/config" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workervar ( 26*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/rust/config") 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker RustDefaultVersion = "1.81.0" 29*333d2b36SAndroid Build Coastguard Worker RustDefaultBase = "prebuilts/rust/" 30*333d2b36SAndroid Build Coastguard Worker DefaultEdition = "2021" 31*333d2b36SAndroid Build Coastguard Worker Stdlibs = []string{ 32*333d2b36SAndroid Build Coastguard Worker "libstd", 33*333d2b36SAndroid Build Coastguard Worker } 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Worker // Mapping between Soong internal arch types and std::env constants. 36*333d2b36SAndroid Build Coastguard Worker // Required as Rust uses aarch64 when Soong uses arm64. 37*333d2b36SAndroid Build Coastguard Worker StdEnvArch = map[android.ArchType]string{ 38*333d2b36SAndroid Build Coastguard Worker android.Arm: "arm", 39*333d2b36SAndroid Build Coastguard Worker android.Arm64: "aarch64", 40*333d2b36SAndroid Build Coastguard Worker android.X86: "x86", 41*333d2b36SAndroid Build Coastguard Worker android.X86_64: "x86_64", 42*333d2b36SAndroid Build Coastguard Worker } 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker GlobalRustFlags = []string{ 45*333d2b36SAndroid Build Coastguard Worker "-Z stack-protector=strong", 46*333d2b36SAndroid Build Coastguard Worker "-Z remap-cwd-prefix=.", 47*333d2b36SAndroid Build Coastguard Worker "-C debuginfo=2", 48*333d2b36SAndroid Build Coastguard Worker "-C opt-level=3", 49*333d2b36SAndroid Build Coastguard Worker "-C relocation-model=pic", 50*333d2b36SAndroid Build Coastguard Worker "-C overflow-checks=on", 51*333d2b36SAndroid Build Coastguard Worker "-C force-unwind-tables=yes", 52*333d2b36SAndroid Build Coastguard Worker // Use v0 mangling to distinguish from C++ symbols 53*333d2b36SAndroid Build Coastguard Worker "-C symbol-mangling-version=v0", 54*333d2b36SAndroid Build Coastguard Worker "--color=always", 55*333d2b36SAndroid Build Coastguard Worker "-Z dylib-lto", 56*333d2b36SAndroid Build Coastguard Worker "-Z link-native-libraries=no", 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker // cfg flag to indicate that we are building in AOSP with Soong 59*333d2b36SAndroid Build Coastguard Worker "--cfg soong", 60*333d2b36SAndroid Build Coastguard Worker } 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker LinuxHostGlobalLinkFlags = []string{ 63*333d2b36SAndroid Build Coastguard Worker "-lc", 64*333d2b36SAndroid Build Coastguard Worker "-lrt", 65*333d2b36SAndroid Build Coastguard Worker "-ldl", 66*333d2b36SAndroid Build Coastguard Worker "-lpthread", 67*333d2b36SAndroid Build Coastguard Worker "-lm", 68*333d2b36SAndroid Build Coastguard Worker "-lgcc_s", 69*333d2b36SAndroid Build Coastguard Worker "-Wl,--compress-debug-sections=zstd", 70*333d2b36SAndroid Build Coastguard Worker } 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker deviceGlobalRustFlags = []string{ 73*333d2b36SAndroid Build Coastguard Worker "-C panic=abort", 74*333d2b36SAndroid Build Coastguard Worker // Generate additional debug info for AutoFDO 75*333d2b36SAndroid Build Coastguard Worker "-Z debug-info-for-profiling", 76*333d2b36SAndroid Build Coastguard Worker // Android has ELF TLS on platform 77*333d2b36SAndroid Build Coastguard Worker "-Z tls-model=global-dynamic", 78*333d2b36SAndroid Build Coastguard Worker } 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker deviceGlobalLinkFlags = []string{ 81*333d2b36SAndroid Build Coastguard Worker // Prepend the lld flags from cc_config so we stay in sync with cc 82*333d2b36SAndroid Build Coastguard Worker "${cc_config.DeviceGlobalLldflags}", 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker // Override cc's --no-undefined-version to allow rustc's generated alloc functions 85*333d2b36SAndroid Build Coastguard Worker "-Wl,--undefined-version", 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker "-Wl,-Bdynamic", 88*333d2b36SAndroid Build Coastguard Worker "-nostdlib", 89*333d2b36SAndroid Build Coastguard Worker "-Wl,--pack-dyn-relocs=android+relr", 90*333d2b36SAndroid Build Coastguard Worker "-Wl,--use-android-relr-tags", 91*333d2b36SAndroid Build Coastguard Worker "-Wl,--no-undefined", 92*333d2b36SAndroid Build Coastguard Worker "-B${cc_config.ClangBin}", 93*333d2b36SAndroid Build Coastguard Worker "-Wl,--compress-debug-sections=zstd", 94*333d2b36SAndroid Build Coastguard Worker } 95*333d2b36SAndroid Build Coastguard Worker) 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workerfunc RustPath(ctx android.PathContext) string { 98*333d2b36SAndroid Build Coastguard Worker // I can't see any way to flatten the static variable inside Soong, so this 99*333d2b36SAndroid Build Coastguard Worker // reproduces the init logic. 100*333d2b36SAndroid Build Coastguard Worker var RustBase string = RustDefaultBase 101*333d2b36SAndroid Build Coastguard Worker if override := ctx.Config().Getenv("RUST_PREBUILTS_BASE"); override != "" { 102*333d2b36SAndroid Build Coastguard Worker RustBase = override 103*333d2b36SAndroid Build Coastguard Worker } 104*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf("%s/%s/%s", RustBase, HostPrebuiltTag(ctx.Config()), GetRustVersion(ctx)) 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc init() { 108*333d2b36SAndroid Build Coastguard Worker pctx.SourcePathVariable("RustDefaultBase", RustDefaultBase) 109*333d2b36SAndroid Build Coastguard Worker pctx.VariableConfigMethod("HostPrebuiltTag", HostPrebuiltTag) 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("RustBase", func(ctx android.PackageVarContext) string { 112*333d2b36SAndroid Build Coastguard Worker if override := ctx.Config().Getenv("RUST_PREBUILTS_BASE"); override != "" { 113*333d2b36SAndroid Build Coastguard Worker return override 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker return "${RustDefaultBase}" 116*333d2b36SAndroid Build Coastguard Worker }) 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Worker pctx.VariableFunc("RustVersion", getRustVersionPctx) 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("RustPath", "${RustBase}/${HostPrebuiltTag}/${RustVersion}") 121*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("RustBin", "${RustPath}/bin") 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker pctx.ImportAs("cc_config", "android/soong/cc/config") 124*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("RustLinker", "${cc_config.ClangBin}/clang++") 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DeviceGlobalLinkFlags", strings.Join(deviceGlobalLinkFlags, " ")) 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("RUST_DEFAULT_VERSION", RustDefaultVersion) 129*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("GLOBAL_RUSTC_FLAGS", strings.Join(GlobalRustFlags, " ")) 130*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LINUX_HOST_GLOBAL_LINK_FLAGS", strings.Join(LinuxHostGlobalLinkFlags, " ")) 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DEVICE_GLOBAL_RUSTC_FLAGS", strings.Join(deviceGlobalRustFlags, " ")) 133*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DEVICE_GLOBAL_LINK_FLAGS", 134*333d2b36SAndroid Build Coastguard Worker strings.Join(android.RemoveListFromList(deviceGlobalLinkFlags, []string{ 135*333d2b36SAndroid Build Coastguard Worker // The cc_config flags are retrieved from cc_toolchain by rust rules. 136*333d2b36SAndroid Build Coastguard Worker "${cc_config.DeviceGlobalLldflags}", 137*333d2b36SAndroid Build Coastguard Worker "-B${cc_config.ClangBin}", 138*333d2b36SAndroid Build Coastguard Worker }), " ")) 139*333d2b36SAndroid Build Coastguard Worker} 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Workerfunc HostPrebuiltTag(config android.Config) string { 142*333d2b36SAndroid Build Coastguard Worker if config.UseHostMusl() { 143*333d2b36SAndroid Build Coastguard Worker return "linux-musl-x86" 144*333d2b36SAndroid Build Coastguard Worker } else { 145*333d2b36SAndroid Build Coastguard Worker return config.PrebuiltOS() 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker} 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Workerfunc getRustVersionPctx(ctx android.PackageVarContext) string { 150*333d2b36SAndroid Build Coastguard Worker return GetRustVersion(ctx) 151*333d2b36SAndroid Build Coastguard Worker} 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Workerfunc GetRustVersion(ctx android.PathContext) string { 154*333d2b36SAndroid Build Coastguard Worker if override := ctx.Config().Getenv("RUST_PREBUILTS_VERSION"); override != "" { 155*333d2b36SAndroid Build Coastguard Worker return override 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker return RustDefaultVersion 158*333d2b36SAndroid Build Coastguard Worker} 159