blob: 85d95d80f7360b147e876fa5a3a57477e07c2240 [file] [log] [blame]
Colin Crossb98c8b02016-07-29 13:44:28 -07001// Copyright 2016 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
15package config
16
17import (
18 "strings"
19
20 "android/soong/android"
21)
22
23var (
24 linuxCflags = []string{
Colin Crossb98c8b02016-07-29 13:44:28 -070025 "-Wa,--noexecstack",
26
27 "-fPIC",
Colin Crossb98c8b02016-07-29 13:44:28 -070028
29 "-U_FORTIFY_SOURCE",
30 "-D_FORTIFY_SOURCE=2",
31 "-fstack-protector",
32
33 // Workaround differences in inttypes.h between host and target.
34 //See bug 12708004.
35 "-D__STDC_FORMAT_MACROS",
36 "-D__STDC_CONSTANT_MACROS",
Colin Cross33bac242021-07-14 17:03:16 -070037
38 "--gcc-toolchain=${LinuxGccRoot}",
Colin Cross4fb4ef22021-07-19 14:11:03 -070039 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Cross5d6904e2021-07-23 22:20:29 +000040 "-fstack-protector-strong",
Colin Cross4fb4ef22021-07-19 14:11:03 -070041 }
42
Colin Crossb98c8b02016-07-29 13:44:28 -070043 linuxLdflags = []string{
44 "-Wl,-z,noexecstack",
45 "-Wl,-z,relro",
46 "-Wl,-z,now",
47 "-Wl,--no-undefined-version",
Colin Cross33bac242021-07-14 17:03:16 -070048
49 "--gcc-toolchain=${LinuxGccRoot}",
50 "--sysroot ${LinuxGccRoot}/sysroot",
Colin Crossb98c8b02016-07-29 13:44:28 -070051 }
52
53 // Extended cflags
54 linuxX86Cflags = []string{
55 "-msse3",
Colin Crossb98c8b02016-07-29 13:44:28 -070056 "-m32",
57 "-march=prescott",
58 "-D_FILE_OFFSET_BITS=64",
59 "-D_LARGEFILE_SOURCE=1",
60 }
61
62 linuxX8664Cflags = []string{
63 "-m64",
64 }
65
66 linuxX86Ldflags = []string{
67 "-m32",
Colin Cross33bac242021-07-14 17:03:16 -070068 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
69 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32",
70 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32",
Colin Crossb98c8b02016-07-29 13:44:28 -070071 }
72
73 linuxX8664Ldflags = []string{
74 "-m64",
Colin Crossb98c8b02016-07-29 13:44:28 -070075 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
76 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}",
77 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64",
Colin Cross33bac242021-07-14 17:03:16 -070078 }
Chih-Hung Hsieh3101a962018-04-17 14:16:05 -070079
Colin Crossb98c8b02016-07-29 13:44:28 -070080 linuxAvailableLibraries = addPrefix([]string{
81 "c",
82 "dl",
83 "gcc",
84 "gcc_s",
85 "m",
86 "ncurses",
87 "pthread",
88 "resolv",
89 "rt",
90 "util",
Colin Crossb98c8b02016-07-29 13:44:28 -070091 }, "-l")
92)
93
94const (
George Burgess IV7294cdc2019-01-23 13:59:10 -080095 linuxGccVersion = "4.8.3"
96 linuxGlibcVersion = "2.17"
Colin Crossb98c8b02016-07-29 13:44:28 -070097)
98
99func init() {
100 pctx.StaticVariable("LinuxGccVersion", linuxGccVersion)
George Burgess IV7294cdc2019-01-23 13:59:10 -0800101 pctx.StaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
102 // Most places use the full GCC version. A few only use up to the first two numbers.
103 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
104 pctx.StaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
105 } else {
106 pctx.StaticVariable("ShortLinuxGccVersion", linuxGccVersion)
107 }
Colin Crossb98c8b02016-07-29 13:44:28 -0700108
109 pctx.SourcePathVariable("LinuxGccRoot",
George Burgess IV7294cdc2019-01-23 13:59:10 -0800110 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
Colin Crossb98c8b02016-07-29 13:44:28 -0700111
112 pctx.StaticVariable("LinuxGccTriple", "x86_64-linux")
113
Colin Cross0523ba22021-07-14 18:45:05 -0700114 pctx.StaticVariable("LinuxCflags", strings.Join(linuxCflags, " "))
115 pctx.StaticVariable("LinuxLdflags", strings.Join(linuxLdflags, " "))
116 pctx.StaticVariable("LinuxLldflags", strings.Join(linuxLdflags, " "))
Colin Crossb98c8b02016-07-29 13:44:28 -0700117
Colin Cross0523ba22021-07-14 18:45:05 -0700118 pctx.StaticVariable("LinuxX86Cflags", strings.Join(linuxX86Cflags, " "))
119 pctx.StaticVariable("LinuxX8664Cflags", strings.Join(linuxX8664Cflags, " "))
120 pctx.StaticVariable("LinuxX86Ldflags", strings.Join(linuxX86Ldflags, " "))
121 pctx.StaticVariable("LinuxX86Lldflags", strings.Join(linuxX86Ldflags, " "))
122 pctx.StaticVariable("LinuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " "))
123 pctx.StaticVariable("LinuxX8664Lldflags", strings.Join(linuxX8664Ldflags, " "))
Greg Hartman09302be2017-10-04 17:31:43 -0700124 // Yasm flags
125 pctx.StaticVariable("LinuxX86YasmFlags", "-f elf32 -m x86")
126 pctx.StaticVariable("LinuxX8664YasmFlags", "-f elf64 -m amd64")
Colin Crossb98c8b02016-07-29 13:44:28 -0700127}
128
129type toolchainLinux struct {
130 cFlags, ldFlags string
131}
132
133type toolchainLinuxX86 struct {
134 toolchain32Bit
135 toolchainLinux
136}
137
138type toolchainLinuxX8664 struct {
139 toolchain64Bit
140 toolchainLinux
141}
142
143func (t *toolchainLinuxX86) Name() string {
144 return "x86"
145}
146
147func (t *toolchainLinuxX8664) Name() string {
148 return "x86_64"
149}
150
151func (t *toolchainLinux) GccRoot() string {
152 return "${config.LinuxGccRoot}"
153}
154
155func (t *toolchainLinux) GccTriple() string {
156 return "${config.LinuxGccTriple}"
157}
158
159func (t *toolchainLinux) GccVersion() string {
160 return linuxGccVersion
161}
162
Colin Crossb98c8b02016-07-29 13:44:28 -0700163func (t *toolchainLinux) IncludeFlags() string {
164 return ""
165}
166
167func (t *toolchainLinuxX86) ClangTriple() string {
168 return "i686-linux-gnu"
169}
170
Colin Cross33bac242021-07-14 17:03:16 -0700171func (t *toolchainLinuxX86) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700172 return "${config.LinuxCflags} ${config.LinuxX86Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700173}
174
Colin Cross33bac242021-07-14 17:03:16 -0700175func (t *toolchainLinuxX86) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800176 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700177}
178
179func (t *toolchainLinuxX8664) ClangTriple() string {
180 return "x86_64-linux-gnu"
181}
182
Colin Cross33bac242021-07-14 17:03:16 -0700183func (t *toolchainLinuxX8664) Cflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700184 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700185}
186
Colin Cross33bac242021-07-14 17:03:16 -0700187func (t *toolchainLinuxX8664) Cppflags() string {
Logan Chienbef00a22018-07-27 06:27:53 +0800188 return ""
Colin Crossb98c8b02016-07-29 13:44:28 -0700189}
190
Colin Cross33bac242021-07-14 17:03:16 -0700191func (t *toolchainLinuxX86) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700192 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700193}
194
Colin Cross33bac242021-07-14 17:03:16 -0700195func (t *toolchainLinuxX86) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700196 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700197}
198
Colin Cross33bac242021-07-14 17:03:16 -0700199func (t *toolchainLinuxX8664) Ldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700200 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}"
Colin Crossb98c8b02016-07-29 13:44:28 -0700201}
202
Colin Cross33bac242021-07-14 17:03:16 -0700203func (t *toolchainLinuxX8664) Lldflags() string {
Colin Cross0523ba22021-07-14 18:45:05 -0700204 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}"
Chih-Hung Hsieh02b4da52018-04-03 11:33:34 -0700205}
206
Greg Hartman09302be2017-10-04 17:31:43 -0700207func (t *toolchainLinuxX86) YasmFlags() string {
208 return "${config.LinuxX86YasmFlags}"
209}
210
211func (t *toolchainLinuxX8664) YasmFlags() string {
212 return "${config.LinuxX8664YasmFlags}"
213}
214
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700215func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
Ivan Lozano9ac32c72020-02-19 15:24:02 -0500216 return "i386"
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700217}
218
219func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
220 return "x86_64"
221}
222
Colin Crossb98c8b02016-07-29 13:44:28 -0700223func (t *toolchainLinux) AvailableLibraries() []string {
224 return linuxAvailableLibraries
225}
226
Colin Cross5d6904e2021-07-23 22:20:29 +0000227var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
228var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
Colin Crossb98c8b02016-07-29 13:44:28 -0700229
Colin Cross5d6904e2021-07-23 22:20:29 +0000230func linuxX86ToolchainFactory(arch android.Arch) Toolchain {
231 return toolchainLinuxX86Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700232}
233
Colin Cross5d6904e2021-07-23 22:20:29 +0000234func linuxX8664ToolchainFactory(arch android.Arch) Toolchain {
235 return toolchainLinuxX8664Singleton
Colin Crossb98c8b02016-07-29 13:44:28 -0700236}
237
238func init() {
Colin Cross5d6904e2021-07-23 22:20:29 +0000239 registerToolchainFactory(android.Linux, android.X86, linuxX86ToolchainFactory)
240 registerToolchainFactory(android.Linux, android.X86_64, linuxX8664ToolchainFactory)
Colin Crossb98c8b02016-07-29 13:44:28 -0700241}