xref: /aosp_15_r20/build/soong/rust/config/global.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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