blob: 5d8c351ab8d4205e737d01b4d0014559b86324d1 [file] [log] [blame]
Colin Cross3f40fa42015-01-30 17:27:36 -08001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Crossb98c8b02016-07-29 13:44:28 -070015package config
Colin Cross3f40fa42015-01-30 17:27:36 -080016
17import (
Tim Kilbourn1a9bf262015-03-18 12:28:32 -070018 "fmt"
Cole Faust8982b1c2024-04-08 16:54:45 -070019 "strings"
Tim Kilbourn1a9bf262015-03-18 12:28:32 -070020
Colin Cross635c3b02016-05-18 15:37:25 -070021 "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -080022)
23
Spandan Das65503582023-05-17 22:19:53 +000024func init() {
Cole Faust8982b1c2024-04-08 16:54:45 -070025 pctx.StaticVariable("DarwinAvailableLibraries", strings.Join(darwinAvailableLibraries, " "))
26 pctx.StaticVariable("LinuxAvailableLibraries", strings.Join(linuxAvailableLibraries, " "))
27 pctx.StaticVariable("WindowsAvailableLibraries", strings.Join(windowsAvailableLibraries, " "))
Spandan Das65503582023-05-17 22:19:53 +000028}
29
Colin Cross635c3b02016-05-18 15:37:25 -070030type toolchainFactory func(arch android.Arch) Toolchain
Colin Cross3f40fa42015-01-30 17:27:36 -080031
Colin Crossa1ad8d12016-06-01 17:09:44 -070032var toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -080033
Colin Crossa1ad8d12016-06-01 17:09:44 -070034func registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) {
35 if toolchainFactories[os] == nil {
36 toolchainFactories[os] = make(map[android.ArchType]toolchainFactory)
37 }
38 toolchainFactories[os][arch] = factory
Colin Cross3f40fa42015-01-30 17:27:36 -080039}
40
Liz Kammer356f7d42021-01-26 09:18:53 -050041type toolchainContext interface {
42 Os() android.OsType
43 Arch() android.Arch
44}
45
Liz Kammer356f7d42021-01-26 09:18:53 -050046func FindToolchainWithContext(ctx toolchainContext) Toolchain {
47 t, err := findToolchain(ctx.Os(), ctx.Arch())
48 if err != nil {
Liz Kammer3bf97bd2022-04-26 09:38:20 -040049 panic(err)
Liz Kammer356f7d42021-01-26 09:18:53 -050050 }
51 return t
52}
53
Colin Crossb98c8b02016-07-29 13:44:28 -070054func FindToolchain(os android.OsType, arch android.Arch) Toolchain {
Liz Kammer356f7d42021-01-26 09:18:53 -050055 t, err := findToolchain(os, arch)
56 if err != nil {
57 panic(err)
58 }
59 return t
60}
61
62func findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) {
Colin Crossb98c8b02016-07-29 13:44:28 -070063 factory := toolchainFactories[os][arch.ArchType]
64 if factory == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -050065 return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String())
Colin Crossb98c8b02016-07-29 13:44:28 -070066 }
Liz Kammer356f7d42021-01-26 09:18:53 -050067 return factory(arch), nil
Colin Crossb98c8b02016-07-29 13:44:28 -070068}
69
Colin Cross97ba0732015-03-23 17:50:24 -070070type Toolchain interface {
Dan Albertbe961682015-03-18 23:38:50 -070071 Name() string
72
Colin Cross3f40fa42015-01-30 17:27:36 -080073 IncludeFlags() string
74
75 ClangTriple() string
Colin Cross33bac242021-07-14 17:03:16 -070076 ToolchainCflags() string
77 ToolchainLdflags() string
78 Asflags() string
79 Cflags() string
80 Cppflags() string
81 Ldflags() string
82 Lldflags() string
83 InstructionSetFlags(string) (string, error)
Colin Cross3f40fa42015-01-30 17:27:36 -080084
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -070085 ndkTriple() string
86
Colin Cross91e90042016-12-02 17:13:24 -080087 YasmFlags() string
88
Colin Cross3f40fa42015-01-30 17:27:36 -080089 Is64Bit() bool
Dan Willemsen490fd492015-11-24 17:53:15 -080090
91 ShlibSuffix() string
92 ExecutableSuffix() string
Dan Willemsen282a4b02016-03-09 10:30:22 -080093
Yi Kong924adc42018-08-31 14:27:44 -070094 LibclangRuntimeLibraryArch() string
Dan Willemsen20acc5c2016-05-25 14:47:21 -070095
96 AvailableLibraries() []string
Dan Willemsen2e47b342016-11-17 01:02:25 -080097
Colin Crossd1a28132021-06-21 17:34:47 -070098 CrtBeginStaticBinary() []string
99 CrtBeginSharedBinary() []string
100 CrtBeginSharedLibrary() []string
101 CrtEndStaticBinary() []string
102 CrtEndSharedBinary() []string
103 CrtEndSharedLibrary() []string
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -0800104 CrtPadSegmentSharedLibrary() []string
Colin Crossd1a28132021-06-21 17:34:47 -0700105
Colin Crossc8544682021-06-21 17:31:50 -0700106 // DefaultSharedLibraries returns the list of shared libraries that will be added to all
107 // targets unless they explicitly specify system_shared_libs.
108 DefaultSharedLibraries() []string
109
Dan Willemsen2e47b342016-11-17 01:02:25 -0800110 Bionic() bool
Colin Cross528d67e2021-07-23 22:23:07 +0000111 Glibc() bool
112 Musl() bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800113}
114
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700115type toolchainBase struct {
116}
117
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -0700118func (t *toolchainBase) ndkTriple() string {
119 return ""
120}
121
122func NDKTriple(toolchain Toolchain) string {
123 triple := toolchain.ndkTriple()
124 if triple == "" {
125 // Use the clang triple if there is no explicit NDK triple
126 triple = toolchain.ClangTriple()
127 }
128 return triple
129}
130
Colin Cross33bac242021-07-14 17:03:16 -0700131func (toolchainBase) InstructionSetFlags(s string) (string, error) {
Dan Willemsen6d11dd82015-11-03 14:27:00 -0800132 if s != "" {
133 return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
134 }
135 return "", nil
136}
137
Colin Cross33bac242021-07-14 17:03:16 -0700138func (toolchainBase) ToolchainCflags() string {
Colin Crossc4bde762015-11-23 16:11:30 -0800139 return ""
140}
141
Colin Cross33bac242021-07-14 17:03:16 -0700142func (toolchainBase) ToolchainLdflags() string {
Dan Willemsene7174922016-03-30 17:33:52 -0700143 return ""
144}
145
Colin Cross33bac242021-07-14 17:03:16 -0700146func (toolchainBase) Asflags() string {
Dan Willemsen32968a22016-01-12 22:25:34 -0800147 return ""
148}
149
Colin Cross91e90042016-12-02 17:13:24 -0800150func (toolchainBase) YasmFlags() string {
151 return ""
152}
153
Yi Kong924adc42018-08-31 14:27:44 -0700154func (toolchainBase) LibclangRuntimeLibraryArch() string {
Colin Cross16b23492016-01-06 14:41:07 -0800155 return ""
156}
157
Colin Crossfc3b0642022-09-01 11:02:15 -0700158type toolchainNoCrt struct{}
Colin Crossc8544682021-06-21 17:31:50 -0700159
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -0800160func (toolchainNoCrt) CrtBeginStaticBinary() []string { return nil }
161func (toolchainNoCrt) CrtBeginSharedBinary() []string { return nil }
162func (toolchainNoCrt) CrtBeginSharedLibrary() []string { return nil }
163func (toolchainNoCrt) CrtEndStaticBinary() []string { return nil }
164func (toolchainNoCrt) CrtEndSharedBinary() []string { return nil }
165func (toolchainNoCrt) CrtEndSharedLibrary() []string { return nil }
166func (toolchainNoCrt) CrtPadSegmentSharedLibrary() []string { return nil }
Colin Crossd1a28132021-06-21 17:34:47 -0700167
Colin Crossc8544682021-06-21 17:31:50 -0700168func (toolchainBase) DefaultSharedLibraries() []string {
169 return nil
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700170}
171
Dan Willemsen2e47b342016-11-17 01:02:25 -0800172func (toolchainBase) Bionic() bool {
Colin Crosse3fee342021-06-21 17:28:25 -0700173 return false
Dan Willemsen2e47b342016-11-17 01:02:25 -0800174}
175
Colin Cross528d67e2021-07-23 22:23:07 +0000176func (toolchainBase) Glibc() bool {
177 return false
178}
179
180func (toolchainBase) Musl() bool {
181 return false
182}
183
Colin Cross3f40fa42015-01-30 17:27:36 -0800184type toolchain64Bit struct {
185}
186
187func (toolchain64Bit) Is64Bit() bool {
188 return true
189}
190
191type toolchain32Bit struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800192}
193
194func (toolchain32Bit) Is64Bit() bool {
195 return false
196}
Colin Crossb98c8b02016-07-29 13:44:28 -0700197
Colin Crossb98c8b02016-07-29 13:44:28 -0700198func variantOrDefault(variants map[string]string, choice string) string {
199 if ret, ok := variants[choice]; ok {
200 return ret
201 }
202 return variants[""]
203}
204
205func addPrefix(list []string, prefix string) []string {
206 for i := range list {
207 list[i] = prefix + list[i]
208 }
209 return list
210}
211
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900212func LibclangRuntimeLibrary(library string) string {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800213 return "libclang_rt." + library
Yi Kong924adc42018-08-31 14:27:44 -0700214}
215
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900216func BuiltinsRuntimeLibrary() string {
217 return LibclangRuntimeLibrary("builtins")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700218}
219
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900220func AddressSanitizerRuntimeLibrary() string {
221 return LibclangRuntimeLibrary("asan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700222}
223
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900224func AddressSanitizerStaticRuntimeLibrary() string {
225 return LibclangRuntimeLibrary("asan.static")
Colin Crossb781d232023-02-15 12:40:20 -0800226}
227
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900228func AddressSanitizerCXXStaticRuntimeLibrary() string {
229 return LibclangRuntimeLibrary("asan_cxx.static")
Colin Crossb781d232023-02-15 12:40:20 -0800230}
231
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900232func HWAddressSanitizerRuntimeLibrary() string {
233 return LibclangRuntimeLibrary("hwasan")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700234}
235
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900236func HWAddressSanitizerStaticLibrary() string {
237 return LibclangRuntimeLibrary("hwasan_static")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700238}
239
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900240func UndefinedBehaviorSanitizerRuntimeLibrary() string {
241 return LibclangRuntimeLibrary("ubsan_standalone")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700242}
243
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900244func UndefinedBehaviorSanitizerMinimalRuntimeLibrary() string {
245 return LibclangRuntimeLibrary("ubsan_minimal")
Ivan Lozano30c5db22018-02-21 15:49:20 -0800246}
247
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900248func ThreadSanitizerRuntimeLibrary() string {
249 return LibclangRuntimeLibrary("tsan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700250}
Dan Willemsen300151b2017-03-13 12:40:30 -0700251
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900252func ScudoRuntimeLibrary() string {
253 return LibclangRuntimeLibrary("scudo")
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700254}
255
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900256func ScudoMinimalRuntimeLibrary() string {
257 return LibclangRuntimeLibrary("scudo_minimal")
Kostya Kortchinskyad73b2e2018-10-11 08:38:39 -0700258}
259
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900260func LibFuzzerRuntimeLibrary() string {
261 return LibclangRuntimeLibrary("fuzzer")
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700262}
263
Kiyoung Kim0d8908c2024-05-07 14:47:35 +0900264func LibFuzzerRuntimeInterceptors() string {
265 return LibclangRuntimeLibrary("fuzzer_interceptors")
Kris Alderd406da12022-10-21 09:34:21 -0700266}