1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 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) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerfunc init() { 25*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("DarwinAvailableLibraries", strings.Join(darwinAvailableLibraries, " ")) 26*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("LinuxAvailableLibraries", strings.Join(linuxAvailableLibraries, " ")) 27*333d2b36SAndroid Build Coastguard Worker pctx.StaticVariable("WindowsAvailableLibraries", strings.Join(windowsAvailableLibraries, " ")) 28*333d2b36SAndroid Build Coastguard Worker} 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workertype toolchainFactory func(arch android.Arch) Toolchain 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workervar toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory) 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workerfunc registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) { 35*333d2b36SAndroid Build Coastguard Worker if toolchainFactories[os] == nil { 36*333d2b36SAndroid Build Coastguard Worker toolchainFactories[os] = make(map[android.ArchType]toolchainFactory) 37*333d2b36SAndroid Build Coastguard Worker } 38*333d2b36SAndroid Build Coastguard Worker toolchainFactories[os][arch] = factory 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workertype toolchainContext interface { 42*333d2b36SAndroid Build Coastguard Worker Os() android.OsType 43*333d2b36SAndroid Build Coastguard Worker Arch() android.Arch 44*333d2b36SAndroid Build Coastguard Worker} 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workerfunc FindToolchainWithContext(ctx toolchainContext) Toolchain { 47*333d2b36SAndroid Build Coastguard Worker t, err := findToolchain(ctx.Os(), ctx.Arch()) 48*333d2b36SAndroid Build Coastguard Worker if err != nil { 49*333d2b36SAndroid Build Coastguard Worker panic(err) 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker return t 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workerfunc FindToolchain(os android.OsType, arch android.Arch) Toolchain { 55*333d2b36SAndroid Build Coastguard Worker t, err := findToolchain(os, arch) 56*333d2b36SAndroid Build Coastguard Worker if err != nil { 57*333d2b36SAndroid Build Coastguard Worker panic(err) 58*333d2b36SAndroid Build Coastguard Worker } 59*333d2b36SAndroid Build Coastguard Worker return t 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workerfunc findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) { 63*333d2b36SAndroid Build Coastguard Worker factory := toolchainFactories[os][arch.ArchType] 64*333d2b36SAndroid Build Coastguard Worker if factory == nil { 65*333d2b36SAndroid Build Coastguard Worker return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String()) 66*333d2b36SAndroid Build Coastguard Worker } 67*333d2b36SAndroid Build Coastguard Worker return factory(arch), nil 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workertype Toolchain interface { 71*333d2b36SAndroid Build Coastguard Worker Name() string 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker IncludeFlags() string 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker ClangTriple() string 76*333d2b36SAndroid Build Coastguard Worker ToolchainCflags() string 77*333d2b36SAndroid Build Coastguard Worker ToolchainLdflags() string 78*333d2b36SAndroid Build Coastguard Worker Asflags() string 79*333d2b36SAndroid Build Coastguard Worker Cflags() string 80*333d2b36SAndroid Build Coastguard Worker Cppflags() string 81*333d2b36SAndroid Build Coastguard Worker Ldflags() string 82*333d2b36SAndroid Build Coastguard Worker Lldflags() string 83*333d2b36SAndroid Build Coastguard Worker InstructionSetFlags(string) (string, error) 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker ndkTriple() string 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker YasmFlags() string 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker Is64Bit() bool 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker ShlibSuffix() string 92*333d2b36SAndroid Build Coastguard Worker ExecutableSuffix() string 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker LibclangRuntimeLibraryArch() string 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker AvailableLibraries() []string 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker CrtBeginStaticBinary() []string 99*333d2b36SAndroid Build Coastguard Worker CrtBeginSharedBinary() []string 100*333d2b36SAndroid Build Coastguard Worker CrtBeginSharedLibrary() []string 101*333d2b36SAndroid Build Coastguard Worker CrtEndStaticBinary() []string 102*333d2b36SAndroid Build Coastguard Worker CrtEndSharedBinary() []string 103*333d2b36SAndroid Build Coastguard Worker CrtEndSharedLibrary() []string 104*333d2b36SAndroid Build Coastguard Worker CrtPadSegmentSharedLibrary() []string 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker // DefaultSharedLibraries returns the list of shared libraries that will be added to all 107*333d2b36SAndroid Build Coastguard Worker // targets unless they explicitly specify system_shared_libs. 108*333d2b36SAndroid Build Coastguard Worker DefaultSharedLibraries() []string 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker Bionic() bool 111*333d2b36SAndroid Build Coastguard Worker Glibc() bool 112*333d2b36SAndroid Build Coastguard Worker Musl() bool 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Workertype toolchainBase struct { 116*333d2b36SAndroid Build Coastguard Worker} 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Workerfunc (t *toolchainBase) ndkTriple() string { 119*333d2b36SAndroid Build Coastguard Worker return "" 120*333d2b36SAndroid Build Coastguard Worker} 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Workerfunc NDKTriple(toolchain Toolchain) string { 123*333d2b36SAndroid Build Coastguard Worker triple := toolchain.ndkTriple() 124*333d2b36SAndroid Build Coastguard Worker if triple == "" { 125*333d2b36SAndroid Build Coastguard Worker // Use the clang triple if there is no explicit NDK triple 126*333d2b36SAndroid Build Coastguard Worker triple = toolchain.ClangTriple() 127*333d2b36SAndroid Build Coastguard Worker } 128*333d2b36SAndroid Build Coastguard Worker return triple 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) InstructionSetFlags(s string) (string, error) { 132*333d2b36SAndroid Build Coastguard Worker if s != "" { 133*333d2b36SAndroid Build Coastguard Worker return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s) 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker return "", nil 136*333d2b36SAndroid Build Coastguard Worker} 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainCflags() string { 139*333d2b36SAndroid Build Coastguard Worker return "" 140*333d2b36SAndroid Build Coastguard Worker} 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) ToolchainLdflags() string { 143*333d2b36SAndroid Build Coastguard Worker return "" 144*333d2b36SAndroid Build Coastguard Worker} 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Asflags() string { 147*333d2b36SAndroid Build Coastguard Worker return "" 148*333d2b36SAndroid Build Coastguard Worker} 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) YasmFlags() string { 151*333d2b36SAndroid Build Coastguard Worker return "" 152*333d2b36SAndroid Build Coastguard Worker} 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) LibclangRuntimeLibraryArch() string { 155*333d2b36SAndroid Build Coastguard Worker return "" 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workertype toolchainNoCrt struct{} 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtBeginStaticBinary() []string { return nil } 161*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtBeginSharedBinary() []string { return nil } 162*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtBeginSharedLibrary() []string { return nil } 163*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtEndStaticBinary() []string { return nil } 164*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtEndSharedBinary() []string { return nil } 165*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtEndSharedLibrary() []string { return nil } 166*333d2b36SAndroid Build Coastguard Workerfunc (toolchainNoCrt) CrtPadSegmentSharedLibrary() []string { return nil } 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) DefaultSharedLibraries() []string { 169*333d2b36SAndroid Build Coastguard Worker return nil 170*333d2b36SAndroid Build Coastguard Worker} 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Bionic() bool { 173*333d2b36SAndroid Build Coastguard Worker return false 174*333d2b36SAndroid Build Coastguard Worker} 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Glibc() bool { 177*333d2b36SAndroid Build Coastguard Worker return false 178*333d2b36SAndroid Build Coastguard Worker} 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Workerfunc (toolchainBase) Musl() bool { 181*333d2b36SAndroid Build Coastguard Worker return false 182*333d2b36SAndroid Build Coastguard Worker} 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Workertype toolchain64Bit struct { 185*333d2b36SAndroid Build Coastguard Worker} 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Workerfunc (toolchain64Bit) Is64Bit() bool { 188*333d2b36SAndroid Build Coastguard Worker return true 189*333d2b36SAndroid Build Coastguard Worker} 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Workertype toolchain32Bit struct { 192*333d2b36SAndroid Build Coastguard Worker} 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Workerfunc (toolchain32Bit) Is64Bit() bool { 195*333d2b36SAndroid Build Coastguard Worker return false 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc variantOrDefault(variants map[string]string, choice string) string { 199*333d2b36SAndroid Build Coastguard Worker if ret, ok := variants[choice]; ok { 200*333d2b36SAndroid Build Coastguard Worker return ret 201*333d2b36SAndroid Build Coastguard Worker } 202*333d2b36SAndroid Build Coastguard Worker return variants[""] 203*333d2b36SAndroid Build Coastguard Worker} 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Workerfunc addPrefix(list []string, prefix string) []string { 206*333d2b36SAndroid Build Coastguard Worker for i := range list { 207*333d2b36SAndroid Build Coastguard Worker list[i] = prefix + list[i] 208*333d2b36SAndroid Build Coastguard Worker } 209*333d2b36SAndroid Build Coastguard Worker return list 210*333d2b36SAndroid Build Coastguard Worker} 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Workerfunc LibclangRuntimeLibrary(library string) string { 213*333d2b36SAndroid Build Coastguard Worker return "libclang_rt." + library 214*333d2b36SAndroid Build Coastguard Worker} 215*333d2b36SAndroid Build Coastguard Worker 216*333d2b36SAndroid Build Coastguard Workerfunc BuiltinsRuntimeLibrary() string { 217*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("builtins") 218*333d2b36SAndroid Build Coastguard Worker} 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Workerfunc AddressSanitizerRuntimeLibrary() string { 221*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("asan") 222*333d2b36SAndroid Build Coastguard Worker} 223*333d2b36SAndroid Build Coastguard Worker 224*333d2b36SAndroid Build Coastguard Workerfunc AddressSanitizerStaticRuntimeLibrary() string { 225*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("asan.static") 226*333d2b36SAndroid Build Coastguard Worker} 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Workerfunc AddressSanitizerCXXStaticRuntimeLibrary() string { 229*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("asan_cxx.static") 230*333d2b36SAndroid Build Coastguard Worker} 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Workerfunc HWAddressSanitizerRuntimeLibrary() string { 233*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("hwasan") 234*333d2b36SAndroid Build Coastguard Worker} 235*333d2b36SAndroid Build Coastguard Worker 236*333d2b36SAndroid Build Coastguard Workerfunc HWAddressSanitizerStaticLibrary() string { 237*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("hwasan_static") 238*333d2b36SAndroid Build Coastguard Worker} 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Workerfunc UndefinedBehaviorSanitizerRuntimeLibrary() string { 241*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("ubsan_standalone") 242*333d2b36SAndroid Build Coastguard Worker} 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Workerfunc UndefinedBehaviorSanitizerMinimalRuntimeLibrary() string { 245*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("ubsan_minimal") 246*333d2b36SAndroid Build Coastguard Worker} 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Workerfunc ThreadSanitizerRuntimeLibrary() string { 249*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("tsan") 250*333d2b36SAndroid Build Coastguard Worker} 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Workerfunc ScudoRuntimeLibrary() string { 253*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("scudo") 254*333d2b36SAndroid Build Coastguard Worker} 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Workerfunc ScudoMinimalRuntimeLibrary() string { 257*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("scudo_minimal") 258*333d2b36SAndroid Build Coastguard Worker} 259*333d2b36SAndroid Build Coastguard Worker 260*333d2b36SAndroid Build Coastguard Workerfunc LibFuzzerRuntimeLibrary() string { 261*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("fuzzer") 262*333d2b36SAndroid Build Coastguard Worker} 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Workerfunc LibFuzzerRuntimeInterceptors() string { 265*333d2b36SAndroid Build Coastguard Worker return LibclangRuntimeLibrary("fuzzer_interceptors") 266*333d2b36SAndroid Build Coastguard Worker} 267