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 "strings" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workervar ( 24*333d2b36SAndroid Build Coastguard Worker LinuxRustFlags = []string{} 25*333d2b36SAndroid Build Coastguard Worker LinuxMuslRustFlags = []string{ 26*333d2b36SAndroid Build Coastguard Worker // disable rustc's builtin fallbacks for crt objects 27*333d2b36SAndroid Build Coastguard Worker "-C link_self_contained=no", 28*333d2b36SAndroid Build Coastguard Worker // force rustc to use a dynamic musl libc 29*333d2b36SAndroid Build Coastguard Worker "-C target-feature=-crt-static", 30*333d2b36SAndroid Build Coastguard Worker "-Z link-native-libraries=no", 31*333d2b36SAndroid Build Coastguard Worker } 32*333d2b36SAndroid Build Coastguard Worker LinuxRustLinkFlags = []string{ 33*333d2b36SAndroid Build Coastguard Worker "-B${cc_config.ClangBin}", 34*333d2b36SAndroid Build Coastguard Worker "-fuse-ld=lld", 35*333d2b36SAndroid Build Coastguard Worker "-Wl,--undefined-version", 36*333d2b36SAndroid Build Coastguard Worker } 37*333d2b36SAndroid Build Coastguard Worker LinuxRustGlibcLinkFlags = []string{ 38*333d2b36SAndroid Build Coastguard Worker "--sysroot ${cc_config.LinuxGccRoot}/sysroot", 39*333d2b36SAndroid Build Coastguard Worker } 40*333d2b36SAndroid Build Coastguard Worker LinuxRustMuslLinkFlags = []string{ 41*333d2b36SAndroid Build Coastguard Worker "--sysroot /dev/null", 42*333d2b36SAndroid Build Coastguard Worker "-nodefaultlibs", 43*333d2b36SAndroid Build Coastguard Worker "-nostdlib", 44*333d2b36SAndroid Build Coastguard Worker "-Wl,--no-dynamic-linker", 45*333d2b36SAndroid Build Coastguard Worker } 46*333d2b36SAndroid Build Coastguard Worker linuxX86Rustflags = []string{} 47*333d2b36SAndroid Build Coastguard Worker linuxX86Linkflags = []string{} 48*333d2b36SAndroid Build Coastguard Worker linuxX8664Rustflags = []string{} 49*333d2b36SAndroid Build Coastguard Worker linuxX8664Linkflags = []string{} 50*333d2b36SAndroid Build Coastguard Worker) 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workerfunc init() { 53*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory) 54*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory) 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory) 57*333d2b36SAndroid Build Coastguard Worker registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory) 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxToolchainRustFlags", strings.Join(LinuxRustFlags, " ")) 60*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxMuslToolchainRustFlags", strings.Join(LinuxMuslRustFlags, " ")) 61*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxToolchainLinkFlags", strings.Join(LinuxRustLinkFlags, " ")) 62*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxGlibcToolchainLinkFlags", strings.Join(LinuxRustGlibcLinkFlags, " ")) 63*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxMuslToolchainLinkFlags", strings.Join(LinuxRustMuslLinkFlags, " ")) 64*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxToolchainX86RustFlags", strings.Join(linuxX86Rustflags, " ")) 65*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxToolchainX86LinkFlags", strings.Join(linuxX86Linkflags, " ")) 66*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxToolchainX8664RustFlags", strings.Join(linuxX8664Rustflags, " ")) 67*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxToolchainX8664LinkFlags", strings.Join(linuxX8664Linkflags, " ")) 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker} 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Worker// Base 64-bit linux rust toolchain 72*333d2b36SAndroid Build Coastguard Workertype toolchainLinuxX8664 struct { 73*333d2b36SAndroid Build Coastguard Worker toolchain64Bit 74*333d2b36SAndroid Build Coastguard Worker} 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Workerfunc (toolchainLinuxX8664) Supported() bool { 77*333d2b36SAndroid Build Coastguard Worker return true 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc (toolchainLinuxX8664) Bionic() bool { 81*333d2b36SAndroid Build Coastguard Worker return false 82*333d2b36SAndroid Build Coastguard Worker} 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX8664) Name() string { 85*333d2b36SAndroid Build Coastguard Worker return "x86_64" 86*333d2b36SAndroid Build Coastguard Worker} 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX8664) ToolchainLinkFlags() string { 89*333d2b36SAndroid Build Coastguard Worker // Prepend the lld flags from cc_config so we stay in sync with cc 90*333d2b36SAndroid Build Coastguard Worker return "${cc_config.LinuxLldflags} ${cc_config.LinuxX8664Lldflags} " + 91*333d2b36SAndroid Build Coastguard Worker "${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainX8664LinkFlags}" 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX8664) ToolchainRustFlags() string { 95*333d2b36SAndroid Build Coastguard Worker return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainX8664RustFlags}" 96*333d2b36SAndroid Build Coastguard Worker} 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker// Specialization of the 64-bit linux rust toolchain for glibc. Adds the gnu rust triple and 99*333d2b36SAndroid Build Coastguard Worker// sysroot linker flags. 100*333d2b36SAndroid Build Coastguard Workertype toolchainLinuxGlibcX8664 struct { 101*333d2b36SAndroid Build Coastguard Worker toolchainLinuxX8664 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX8664) RustTriple() string { 105*333d2b36SAndroid Build Coastguard Worker return "x86_64-unknown-linux-gnu" 106*333d2b36SAndroid Build Coastguard Worker} 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxGlibcX8664) ToolchainLinkFlags() string { 109*333d2b36SAndroid Build Coastguard Worker return t.toolchainLinuxX8664.ToolchainLinkFlags() + " " + "${config.LinuxGlibcToolchainLinkFlags}" 110*333d2b36SAndroid Build Coastguard Worker} 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Workerfunc linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain { 113*333d2b36SAndroid Build Coastguard Worker return toolchainLinuxGlibcX8664Singleton 114*333d2b36SAndroid Build Coastguard Worker} 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Worker// Specialization of the 64-bit linux rust toolchain for musl. Adds the musl rust triple and 117*333d2b36SAndroid Build Coastguard Worker// linker flags to avoid using the host sysroot. 118*333d2b36SAndroid Build Coastguard Workertype toolchainLinuxMuslX8664 struct { 119*333d2b36SAndroid Build Coastguard Worker toolchainLinuxX8664 120*333d2b36SAndroid Build Coastguard Worker} 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxMuslX8664) RustTriple() string { 123*333d2b36SAndroid Build Coastguard Worker return "x86_64-unknown-linux-musl" 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxMuslX8664) ToolchainLinkFlags() string { 127*333d2b36SAndroid Build Coastguard Worker return t.toolchainLinuxX8664.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}" 128*333d2b36SAndroid Build Coastguard Worker} 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxMuslX8664) ToolchainRustFlags() string { 131*333d2b36SAndroid Build Coastguard Worker return t.toolchainLinuxX8664.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}" 132*333d2b36SAndroid Build Coastguard Worker} 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Workerfunc linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain { 135*333d2b36SAndroid Build Coastguard Worker return toolchainLinuxMuslX8664Singleton 136*333d2b36SAndroid Build Coastguard Worker} 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker// Base 32-bit linux rust toolchain 139*333d2b36SAndroid Build Coastguard Workertype toolchainLinuxX86 struct { 140*333d2b36SAndroid Build Coastguard Worker toolchain32Bit 141*333d2b36SAndroid Build Coastguard Worker} 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Workerfunc (toolchainLinuxX86) Supported() bool { 144*333d2b36SAndroid Build Coastguard Worker return true 145*333d2b36SAndroid Build Coastguard Worker} 146*333d2b36SAndroid Build Coastguard Worker 147*333d2b36SAndroid Build Coastguard Workerfunc (toolchainLinuxX86) Bionic() bool { 148*333d2b36SAndroid Build Coastguard Worker return false 149*333d2b36SAndroid Build Coastguard Worker} 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX86) Name() string { 152*333d2b36SAndroid Build Coastguard Worker return "x86" 153*333d2b36SAndroid Build Coastguard Worker} 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Workerfunc (toolchainLinuxX86) LibclangRuntimeLibraryArch() string { 156*333d2b36SAndroid Build Coastguard Worker return "i386" 157*333d2b36SAndroid Build Coastguard Worker} 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Workerfunc (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string { 160*333d2b36SAndroid Build Coastguard Worker return "x86_64" 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX86) ToolchainLinkFlags() string { 164*333d2b36SAndroid Build Coastguard Worker // Prepend the lld flags from cc_config so we stay in sync with cc 165*333d2b36SAndroid Build Coastguard Worker return "${cc_config.LinuxLldflags} ${cc_config.LinuxX86Lldflags} " + 166*333d2b36SAndroid Build Coastguard Worker "${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainX86LinkFlags}" 167*333d2b36SAndroid Build Coastguard Worker} 168*333d2b36SAndroid Build Coastguard Worker 169*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxX86) ToolchainRustFlags() string { 170*333d2b36SAndroid Build Coastguard Worker return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainX86RustFlags}" 171*333d2b36SAndroid Build Coastguard Worker} 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker// Specialization of the 32-bit linux rust toolchain for glibc. Adds the gnu rust triple and 174*333d2b36SAndroid Build Coastguard Worker// sysroot linker flags. 175*333d2b36SAndroid Build Coastguard Workertype toolchainLinuxGlibcX86 struct { 176*333d2b36SAndroid Build Coastguard Worker toolchainLinuxX86 177*333d2b36SAndroid Build Coastguard Worker} 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxGlibcX86) RustTriple() string { 180*333d2b36SAndroid Build Coastguard Worker return "i686-unknown-linux-gnu" 181*333d2b36SAndroid Build Coastguard Worker} 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxGlibcX86) ToolchainLinkFlags() string { 184*333d2b36SAndroid Build Coastguard Worker return t.toolchainLinuxX86.ToolchainLinkFlags() + " " + "${config.LinuxGlibcToolchainLinkFlags}" 185*333d2b36SAndroid Build Coastguard Worker} 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Workerfunc linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain { 188*333d2b36SAndroid Build Coastguard Worker return toolchainLinuxGlibcX86Singleton 189*333d2b36SAndroid Build Coastguard Worker} 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker// Specialization of the 32-bit linux rust toolchain for musl. Adds the musl rust triple and 192*333d2b36SAndroid Build Coastguard Worker// linker flags to avoid using the host sysroot. 193*333d2b36SAndroid Build Coastguard Workertype toolchainLinuxMuslX86 struct { 194*333d2b36SAndroid Build Coastguard Worker toolchainLinuxX86 195*333d2b36SAndroid Build Coastguard Worker} 196*333d2b36SAndroid Build Coastguard Worker 197*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxMuslX86) RustTriple() string { 198*333d2b36SAndroid Build Coastguard Worker return "i686-unknown-linux-musl" 199*333d2b36SAndroid Build Coastguard Worker} 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxMuslX86) ToolchainLinkFlags() string { 202*333d2b36SAndroid Build Coastguard Worker return t.toolchainLinuxX86.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}" 203*333d2b36SAndroid Build Coastguard Worker} 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainLinuxMuslX86) ToolchainRustFlags() string { 206*333d2b36SAndroid Build Coastguard Worker return t.toolchainLinuxX86.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}" 207*333d2b36SAndroid Build Coastguard Worker} 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Workerfunc linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain { 210*333d2b36SAndroid Build Coastguard Worker return toolchainLinuxMuslX86Singleton 211*333d2b36SAndroid Build Coastguard Worker} 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Workervar toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{} 214*333d2b36SAndroid Build Coastguard Workervar toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{} 215*333d2b36SAndroid Build Coastguard Workervar toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{} 216*333d2b36SAndroid Build Coastguard Workervar toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{} 217