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 "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker) 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Workertype Toolchain interface { 22*333d2b36SAndroid Build Coastguard Worker RustTriple() string 23*333d2b36SAndroid Build Coastguard Worker ToolchainRustFlags() string 24*333d2b36SAndroid Build Coastguard Worker ToolchainLinkFlags() string 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Worker SharedLibSuffix() string 27*333d2b36SAndroid Build Coastguard Worker StaticLibSuffix() string 28*333d2b36SAndroid Build Coastguard Worker RlibSuffix() string 29*333d2b36SAndroid Build Coastguard Worker DylibSuffix() string 30*333d2b36SAndroid Build Coastguard Worker ProcMacroSuffix() string 31*333d2b36SAndroid Build Coastguard Worker ExecutableSuffix() string 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker Is64Bit() bool 34*333d2b36SAndroid Build Coastguard Worker Supported() bool 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker Bionic() bool 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker LibclangRuntimeLibraryArch() string 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workertype toolchainBase struct { 42*333d2b36SAndroid Build Coastguard Worker} 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) RustTriple() string { 45*333d2b36SAndroid Build Coastguard Worker panic("toolchainBase does not define a triple.") 46*333d2b36SAndroid Build Coastguard Worker} 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainRustFlags() string { 49*333d2b36SAndroid Build Coastguard Worker panic("toolchainBase does not provide rust flags.") 50*333d2b36SAndroid Build Coastguard Worker} 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainLinkFlags() string { 53*333d2b36SAndroid Build Coastguard Worker panic("toolchainBase does not provide link flags.") 54*333d2b36SAndroid Build Coastguard Worker} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Is64Bit() bool { 57*333d2b36SAndroid Build Coastguard Worker panic("toolchainBase cannot determine datapath width.") 58*333d2b36SAndroid Build Coastguard Worker} 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Bionic() bool { 61*333d2b36SAndroid Build Coastguard Worker return true 62*333d2b36SAndroid Build Coastguard Worker} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workertype toolchain64Bit struct { 65*333d2b36SAndroid Build Coastguard Worker toolchainBase 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workerfunc (toolchain64Bit) Is64Bit() bool { 69*333d2b36SAndroid Build Coastguard Worker return true 70*333d2b36SAndroid Build Coastguard Worker} 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Workertype toolchain32Bit struct { 73*333d2b36SAndroid Build Coastguard Worker toolchainBase 74*333d2b36SAndroid Build Coastguard Worker} 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Workerfunc (toolchain32Bit) Is64Bit() bool { 77*333d2b36SAndroid Build Coastguard Worker return false 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunc (toolchain32Bit) Bionic() bool { 81*333d2b36SAndroid Build Coastguard Worker return true 82*333d2b36SAndroid Build Coastguard Worker} 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ExecutableSuffix() string { 85*333d2b36SAndroid Build Coastguard Worker return "" 86*333d2b36SAndroid Build Coastguard Worker} 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) SharedLibSuffix() string { 89*333d2b36SAndroid Build Coastguard Worker return ".so" 90*333d2b36SAndroid Build Coastguard Worker} 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) StaticLibSuffix() string { 93*333d2b36SAndroid Build Coastguard Worker return ".a" 94*333d2b36SAndroid Build Coastguard Worker} 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) RlibSuffix() string { 97*333d2b36SAndroid Build Coastguard Worker return ".rlib" 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) DylibSuffix() string { 100*333d2b36SAndroid Build Coastguard Worker return ".dylib.so" 101*333d2b36SAndroid Build Coastguard Worker} 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ProcMacroSuffix() string { 104*333d2b36SAndroid Build Coastguard Worker return ".so" 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Supported() bool { 108*333d2b36SAndroid Build Coastguard Worker return false 109*333d2b36SAndroid Build Coastguard Worker} 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) LibclangRuntimeLibraryArch() string { 112*333d2b36SAndroid Build Coastguard Worker return "" 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Workerfunc BuiltinsRuntimeLibrary(t Toolchain) string { 116*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary(t, "builtins") 117*333d2b36SAndroid Build Coastguard Worker} 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Workerfunc LibFuzzerRuntimeLibrary(t Toolchain) string { 120*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary(t, "fuzzer") 121*333d2b36SAndroid Build Coastguard Worker} 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Workerfunc LibclangRuntimeLibrary(t Toolchain, library string) string { 124*333d2b36SAndroid Build Coastguard Worker return "libclang_rt." + library 125*333d2b36SAndroid Build Coastguard Worker} 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Workerfunc LibRustRuntimeLibrary(t Toolchain, library string) string { 128*333d2b36SAndroid Build Coastguard Worker arch := t.LibclangRuntimeLibraryArch() 129*333d2b36SAndroid Build Coastguard Worker if arch == "" { 130*333d2b36SAndroid Build Coastguard Worker return "" 131*333d2b36SAndroid Build Coastguard Worker } 132*333d2b36SAndroid Build Coastguard Worker if !t.Bionic() { 133*333d2b36SAndroid Build Coastguard Worker return "librustc_rt." + library + "-" + arch 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker return "librustc_rt." + library + "-" + arch + "-android" 136*333d2b36SAndroid Build Coastguard Worker} 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Workerfunc toolchainBaseFactory() Toolchain { 139*333d2b36SAndroid Build Coastguard Worker return &toolchainBase{} 140*333d2b36SAndroid Build Coastguard Worker} 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Workertype toolchainFactory func(arch android.Arch) Toolchain 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Workervar toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory) 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Workerfunc registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) { 147*333d2b36SAndroid Build Coastguard Worker if toolchainFactories[os] == nil { 148*333d2b36SAndroid Build Coastguard Worker toolchainFactories[os] = make(map[android.ArchType]toolchainFactory) 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker toolchainFactories[os][arch] = factory 151*333d2b36SAndroid Build Coastguard Worker} 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Workerfunc FindToolchain(os android.OsType, arch android.Arch) Toolchain { 154*333d2b36SAndroid Build Coastguard Worker factory := toolchainFactories[os][arch.ArchType] 155*333d2b36SAndroid Build Coastguard Worker if factory == nil { 156*333d2b36SAndroid Build Coastguard Worker return toolchainBaseFactory() 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker return factory(arch) 159*333d2b36SAndroid Build Coastguard Worker} 160