blob: a0ef5759553818f0c7ce3e64b3f75ca796c23dd0 [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"
19
Colin Cross635c3b02016-05-18 15:37:25 -070020 "android/soong/android"
Colin Cross3f40fa42015-01-30 17:27:36 -080021)
22
Spandan Das65503582023-05-17 22:19:53 +000023func init() {
24 exportedVars.ExportStringListStaticVariable("DarwinAvailableLibraries", darwinAvailableLibraries)
25 exportedVars.ExportStringListStaticVariable("LinuxAvailableLibraries", linuxAvailableLibraries)
26 exportedVars.ExportStringListStaticVariable("WindowsAvailableLibraries", windowsAvailableLibraries)
27}
28
Colin Cross635c3b02016-05-18 15:37:25 -070029type toolchainFactory func(arch android.Arch) Toolchain
Colin Cross3f40fa42015-01-30 17:27:36 -080030
Colin Crossa1ad8d12016-06-01 17:09:44 -070031var toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
Colin Cross3f40fa42015-01-30 17:27:36 -080032
Colin Crossa1ad8d12016-06-01 17:09:44 -070033func registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) {
34 if toolchainFactories[os] == nil {
35 toolchainFactories[os] = make(map[android.ArchType]toolchainFactory)
36 }
37 toolchainFactories[os][arch] = factory
Colin Cross3f40fa42015-01-30 17:27:36 -080038}
39
Liz Kammer356f7d42021-01-26 09:18:53 -050040type toolchainContext interface {
41 Os() android.OsType
42 Arch() android.Arch
43}
44
Liz Kammer356f7d42021-01-26 09:18:53 -050045func FindToolchainWithContext(ctx toolchainContext) Toolchain {
46 t, err := findToolchain(ctx.Os(), ctx.Arch())
47 if err != nil {
Liz Kammer3bf97bd2022-04-26 09:38:20 -040048 panic(err)
Liz Kammer356f7d42021-01-26 09:18:53 -050049 }
50 return t
51}
52
Colin Crossb98c8b02016-07-29 13:44:28 -070053func FindToolchain(os android.OsType, arch android.Arch) Toolchain {
Liz Kammer356f7d42021-01-26 09:18:53 -050054 t, err := findToolchain(os, arch)
55 if err != nil {
56 panic(err)
57 }
58 return t
59}
60
61func findToolchain(os android.OsType, arch android.Arch) (Toolchain, error) {
Colin Crossb98c8b02016-07-29 13:44:28 -070062 factory := toolchainFactories[os][arch.ArchType]
63 if factory == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -050064 return nil, fmt.Errorf("Toolchain not found for %s arch %q", os.String(), arch.String())
Colin Crossb98c8b02016-07-29 13:44:28 -070065 }
Liz Kammer356f7d42021-01-26 09:18:53 -050066 return factory(arch), nil
Colin Crossb98c8b02016-07-29 13:44:28 -070067}
68
Colin Cross97ba0732015-03-23 17:50:24 -070069type Toolchain interface {
Dan Albertbe961682015-03-18 23:38:50 -070070 Name() string
71
Colin Cross3f40fa42015-01-30 17:27:36 -080072 IncludeFlags() string
73
74 ClangTriple() string
Colin Cross33bac242021-07-14 17:03:16 -070075 ToolchainCflags() string
76 ToolchainLdflags() string
77 Asflags() string
78 Cflags() string
79 Cppflags() string
80 Ldflags() string
81 Lldflags() string
82 InstructionSetFlags(string) (string, error)
Colin Cross3f40fa42015-01-30 17:27:36 -080083
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -070084 ndkTriple() string
85
Colin Cross91e90042016-12-02 17:13:24 -080086 YasmFlags() string
87
Colin Cross3f40fa42015-01-30 17:27:36 -080088 Is64Bit() bool
Dan Willemsen490fd492015-11-24 17:53:15 -080089
90 ShlibSuffix() string
91 ExecutableSuffix() string
Dan Willemsen282a4b02016-03-09 10:30:22 -080092
Yi Kong924adc42018-08-31 14:27:44 -070093 LibclangRuntimeLibraryArch() string
Dan Willemsen20acc5c2016-05-25 14:47:21 -070094
95 AvailableLibraries() []string
Dan Willemsen2e47b342016-11-17 01:02:25 -080096
Colin Crossd1a28132021-06-21 17:34:47 -070097 CrtBeginStaticBinary() []string
98 CrtBeginSharedBinary() []string
99 CrtBeginSharedLibrary() []string
100 CrtEndStaticBinary() []string
101 CrtEndSharedBinary() []string
102 CrtEndSharedLibrary() []string
103
Colin Crossc8544682021-06-21 17:31:50 -0700104 // DefaultSharedLibraries returns the list of shared libraries that will be added to all
105 // targets unless they explicitly specify system_shared_libs.
106 DefaultSharedLibraries() []string
107
Dan Willemsen2e47b342016-11-17 01:02:25 -0800108 Bionic() bool
Colin Cross528d67e2021-07-23 22:23:07 +0000109 Glibc() bool
110 Musl() bool
Colin Cross3f40fa42015-01-30 17:27:36 -0800111}
112
Tim Kilbourn1a9bf262015-03-18 12:28:32 -0700113type toolchainBase struct {
114}
115
Chih-Hung Hsieh1e7d1bf2018-03-15 18:44:57 -0700116func (t *toolchainBase) ndkTriple() string {
117 return ""
118}
119
120func NDKTriple(toolchain Toolchain) string {
121 triple := toolchain.ndkTriple()
122 if triple == "" {
123 // Use the clang triple if there is no explicit NDK triple
124 triple = toolchain.ClangTriple()
125 }
126 return triple
127}
128
Colin Cross33bac242021-07-14 17:03:16 -0700129func (toolchainBase) InstructionSetFlags(s string) (string, error) {
Dan Willemsen6d11dd82015-11-03 14:27:00 -0800130 if s != "" {
131 return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
132 }
133 return "", nil
134}
135
Colin Cross33bac242021-07-14 17:03:16 -0700136func (toolchainBase) ToolchainCflags() string {
Colin Crossc4bde762015-11-23 16:11:30 -0800137 return ""
138}
139
Colin Cross33bac242021-07-14 17:03:16 -0700140func (toolchainBase) ToolchainLdflags() string {
Dan Willemsene7174922016-03-30 17:33:52 -0700141 return ""
142}
143
Colin Cross33bac242021-07-14 17:03:16 -0700144func (toolchainBase) Asflags() string {
Dan Willemsen32968a22016-01-12 22:25:34 -0800145 return ""
146}
147
Colin Cross91e90042016-12-02 17:13:24 -0800148func (toolchainBase) YasmFlags() string {
149 return ""
150}
151
Yi Kong924adc42018-08-31 14:27:44 -0700152func (toolchainBase) LibclangRuntimeLibraryArch() string {
Colin Cross16b23492016-01-06 14:41:07 -0800153 return ""
154}
155
Colin Crossfc3b0642022-09-01 11:02:15 -0700156type toolchainNoCrt struct{}
Colin Crossc8544682021-06-21 17:31:50 -0700157
Colin Crossfc3b0642022-09-01 11:02:15 -0700158func (toolchainNoCrt) CrtBeginStaticBinary() []string { return nil }
159func (toolchainNoCrt) CrtBeginSharedBinary() []string { return nil }
160func (toolchainNoCrt) CrtBeginSharedLibrary() []string { return nil }
161func (toolchainNoCrt) CrtEndStaticBinary() []string { return nil }
162func (toolchainNoCrt) CrtEndSharedBinary() []string { return nil }
163func (toolchainNoCrt) CrtEndSharedLibrary() []string { return nil }
Colin Crossd1a28132021-06-21 17:34:47 -0700164
Colin Crossc8544682021-06-21 17:31:50 -0700165func (toolchainBase) DefaultSharedLibraries() []string {
166 return nil
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700167}
168
Dan Willemsen2e47b342016-11-17 01:02:25 -0800169func (toolchainBase) Bionic() bool {
Colin Crosse3fee342021-06-21 17:28:25 -0700170 return false
Dan Willemsen2e47b342016-11-17 01:02:25 -0800171}
172
Colin Cross528d67e2021-07-23 22:23:07 +0000173func (toolchainBase) Glibc() bool {
174 return false
175}
176
177func (toolchainBase) Musl() bool {
178 return false
179}
180
Colin Cross3f40fa42015-01-30 17:27:36 -0800181type toolchain64Bit struct {
182}
183
184func (toolchain64Bit) Is64Bit() bool {
185 return true
186}
187
188type toolchain32Bit struct {
Colin Cross3f40fa42015-01-30 17:27:36 -0800189}
190
191func (toolchain32Bit) Is64Bit() bool {
192 return false
193}
Colin Crossb98c8b02016-07-29 13:44:28 -0700194
Colin Crossb98c8b02016-07-29 13:44:28 -0700195func variantOrDefault(variants map[string]string, choice string) string {
196 if ret, ok := variants[choice]; ok {
197 return ret
198 }
199 return variants[""]
200}
201
202func addPrefix(list []string, prefix string) []string {
203 for i := range list {
204 list[i] = prefix + list[i]
205 }
206 return list
207}
208
Yi Kong924adc42018-08-31 14:27:44 -0700209func LibclangRuntimeLibrary(t Toolchain, library string) string {
Colin Cross4c4c1be2022-02-10 11:41:18 -0800210 return "libclang_rt." + library
Yi Kong924adc42018-08-31 14:27:44 -0700211}
212
213func BuiltinsRuntimeLibrary(t Toolchain) string {
214 return LibclangRuntimeLibrary(t, "builtins")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700215}
216
217func AddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700218 return LibclangRuntimeLibrary(t, "asan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700219}
220
Colin Crossb781d232023-02-15 12:40:20 -0800221func AddressSanitizerStaticRuntimeLibrary(t Toolchain) string {
222 return LibclangRuntimeLibrary(t, "asan.static")
223}
224
225func AddressSanitizerCXXStaticRuntimeLibrary(t Toolchain) string {
226 return LibclangRuntimeLibrary(t, "asan_cxx.static")
227}
228
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700229func HWAddressSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700230 return LibclangRuntimeLibrary(t, "hwasan")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700231}
232
233func HWAddressSanitizerStaticLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700234 return LibclangRuntimeLibrary(t, "hwasan_static")
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -0700235}
236
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700237func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700238 return LibclangRuntimeLibrary(t, "ubsan_standalone")
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700239}
240
Ivan Lozano30c5db22018-02-21 15:49:20 -0800241func UndefinedBehaviorSanitizerMinimalRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700242 return LibclangRuntimeLibrary(t, "ubsan_minimal")
Ivan Lozano30c5db22018-02-21 15:49:20 -0800243}
244
Pirama Arumuga Nainar16b626b2017-03-27 11:00:38 -0700245func ThreadSanitizerRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700246 return LibclangRuntimeLibrary(t, "tsan")
Evgenii Stepanovaf36db12016-08-15 14:18:24 -0700247}
Dan Willemsen300151b2017-03-13 12:40:30 -0700248
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700249func ScudoRuntimeLibrary(t Toolchain) string {
Yi Kong924adc42018-08-31 14:27:44 -0700250 return LibclangRuntimeLibrary(t, "scudo")
Kostya Kortchinskyd18ae5c2018-06-12 14:46:54 -0700251}
252
Kostya Kortchinskyad73b2e2018-10-11 08:38:39 -0700253func ScudoMinimalRuntimeLibrary(t Toolchain) string {
254 return LibclangRuntimeLibrary(t, "scudo_minimal")
255}
256
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700257func LibFuzzerRuntimeLibrary(t Toolchain) string {
258 return LibclangRuntimeLibrary(t, "fuzzer")
259}
260
Kris Alderd406da12022-10-21 09:34:21 -0700261func LibFuzzerRuntimeInterceptors(t Toolchain) string {
262 return LibclangRuntimeLibrary(t, "fuzzer_interceptors")
263}
264
Colin Cross0d0ba592018-02-20 13:33:42 -0800265var inList = android.InList