blob: bff9a03fe4b8ae768199502171796876fd618edc [file] [log] [blame]
Colin Cross0af4b842015-04-30 16:36:18 -07001package cc
2
3import (
Dan Willemsencf7c71b2015-12-14 20:02:44 -08004 "fmt"
5 "os/exec"
Colin Cross0af4b842015-04-30 16:36:18 -07006 "strings"
7
8 "android/soong/common"
9)
10
11var (
12 darwinCflags = []string{
13 "-fno-exceptions", // from build/core/combo/select.mk
14 "-Wno-multichar", // from build/core/combo/select.mk
15
Dan Willemsen490fd492015-11-24 17:53:15 -080016 "-fdiagnostics-color",
17
Colin Cross0af4b842015-04-30 16:36:18 -070018 "-fPIC",
19 "-funwind-tables",
Colin Cross0af4b842015-04-30 16:36:18 -070020
21 // Workaround differences in inttypes.h between host and target.
22 //See bug 12708004.
23 "-D__STDC_FORMAT_MACROS",
24 "-D__STDC_CONSTANT_MACROS",
25
26 // HOST_RELEASE_CFLAGS
27 "-O2", // from build/core/combo/select.mk
28 "-g", // from build/core/combo/select.mk
29 "-fno-strict-aliasing", // from build/core/combo/select.mk
30 "-isysroot ${macSdkRoot}",
Dan Willemsencf7c71b2015-12-14 20:02:44 -080031 "-mmacosx-version-min=${macSdkVersion}",
32 "-DMACOSX_DEPLOYMENT_TARGET=${macSdkVersion}",
Colin Cross0af4b842015-04-30 16:36:18 -070033 }
34
Colin Cross0af4b842015-04-30 16:36:18 -070035 darwinLdflags = []string{
36 "-isysroot ${macSdkRoot}",
37 "-Wl,-syslibroot,${macSdkRoot}",
Dan Willemsencf7c71b2015-12-14 20:02:44 -080038 "-mmacosx-version-min=${macSdkVersion}",
Colin Cross0af4b842015-04-30 16:36:18 -070039 }
40
Dan Willemsen282a4b02016-03-09 10:30:22 -080041 darwinSystemCppCppflags = []string{
42 "-isystem ${macToolchainRoot}/usr/include/c++/v1",
43 }
44
45 darwinSystemCppLdflags = []string{
46 "-stdlib=libc++",
47 }
48
Colin Cross0af4b842015-04-30 16:36:18 -070049 // Extended cflags
50 darwinX86Cflags = []string{
51 "-m32",
52 }
53
54 darwinX8664Cflags = []string{
55 "-m64",
56 }
57
58 darwinX86Ldflags = []string{
59 "-m32",
60 "-Wl,-rpath,@loader_path/../lib",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070061 "-Wl,-rpath,@loader_path/lib",
Colin Cross0af4b842015-04-30 16:36:18 -070062 }
63
64 darwinX8664Ldflags = []string{
65 "-m64",
66 "-Wl,-rpath,@loader_path/../lib64",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070067 "-Wl,-rpath,@loader_path/lib64",
Colin Cross0af4b842015-04-30 16:36:18 -070068 }
69
Dan Willemsenf534a102016-03-03 17:22:39 -080070 darwinClangCflags = append(clangFilterUnknownCflags(darwinCflags), []string{
Colin Cross0af4b842015-04-30 16:36:18 -070071 "-integrated-as",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080072 "-fstack-protector-strong",
Dan Willemsenf534a102016-03-03 17:22:39 -080073 }...)
Colin Cross0af4b842015-04-30 16:36:18 -070074
75 darwinClangLdflags = clangFilterUnknownCflags(darwinLdflags)
76
77 darwinX86ClangLdflags = clangFilterUnknownCflags(darwinX86Ldflags)
78
79 darwinX8664ClangLdflags = clangFilterUnknownCflags(darwinX8664Ldflags)
80
Dan Willemsencf7c71b2015-12-14 20:02:44 -080081 darwinSupportedSdkVersions = []string{
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -080082 "10.8",
83 "10.9",
84 "10.10",
85 "10.11",
Dan Willemsencf7c71b2015-12-14 20:02:44 -080086 }
Colin Cross0af4b842015-04-30 16:36:18 -070087)
88
Dan Willemsen34fc3b12015-12-07 12:30:44 -080089const (
90 darwinGccVersion = "4.2.1"
91)
92
Colin Cross0af4b842015-04-30 16:36:18 -070093func init() {
Dan Willemsencf7c71b2015-12-14 20:02:44 -080094 pctx.VariableFunc("macSdkPath", func(config interface{}) (string, error) {
95 bytes, err := exec.Command("xcode-select", "--print-path").Output()
96 return strings.TrimSpace(string(bytes)), err
97 })
98 pctx.StaticVariable("macToolchainRoot", "${macSdkPath}/Toolchains/XcodeDefault.xctoolchain")
99 pctx.VariableFunc("macSdkRoot", func(config interface{}) (string, error) {
100 return xcrunSdk(config.(common.Config), "--show-sdk-path")
101 })
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -0800102 pctx.StaticVariable("macSdkVersion", darwinSupportedSdkVersions[0])
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800103 pctx.VariableFunc("macArPath", func(config interface{}) (string, error) {
104 bytes, err := exec.Command("xcrun", "--find", "ar").Output()
105 return strings.TrimSpace(string(bytes)), err
106 })
Colin Cross0af4b842015-04-30 16:36:18 -0700107
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800108 pctx.StaticVariable("darwinGccVersion", darwinGccVersion)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700109 pctx.SourcePathVariable("darwinGccRoot",
110 "prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${darwinGccVersion}")
Colin Cross0af4b842015-04-30 16:36:18 -0700111
112 pctx.StaticVariable("darwinGccTriple", "i686-apple-darwin11")
113
114 pctx.StaticVariable("darwinCflags", strings.Join(darwinCflags, " "))
115 pctx.StaticVariable("darwinLdflags", strings.Join(darwinLdflags, " "))
Colin Cross0af4b842015-04-30 16:36:18 -0700116
117 pctx.StaticVariable("darwinClangCflags", strings.Join(darwinClangCflags, " "))
118 pctx.StaticVariable("darwinClangLdflags", strings.Join(darwinClangLdflags, " "))
Dan Willemsen282a4b02016-03-09 10:30:22 -0800119
120 pctx.StaticVariable("darwinSystemCppCppflags", strings.Join(darwinSystemCppCppflags, " "))
121 pctx.StaticVariable("darwinSystemCppLdflags", strings.Join(darwinSystemCppLdflags, " "))
Colin Cross0af4b842015-04-30 16:36:18 -0700122
123 // Extended cflags
124 pctx.StaticVariable("darwinX86Cflags", strings.Join(darwinX86Cflags, " "))
125 pctx.StaticVariable("darwinX8664Cflags", strings.Join(darwinX8664Cflags, " "))
126 pctx.StaticVariable("darwinX86Ldflags", strings.Join(darwinX86Ldflags, " "))
127 pctx.StaticVariable("darwinX8664Ldflags", strings.Join(darwinX8664Ldflags, " "))
128
129 pctx.StaticVariable("darwinX86ClangCflags",
130 strings.Join(clangFilterUnknownCflags(darwinX86Cflags), " "))
131 pctx.StaticVariable("darwinX8664ClangCflags",
132 strings.Join(clangFilterUnknownCflags(darwinX8664Cflags), " "))
133 pctx.StaticVariable("darwinX86ClangLdflags", strings.Join(darwinX86ClangLdflags, " "))
134 pctx.StaticVariable("darwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " "))
135}
136
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800137func xcrunSdk(config common.Config, arg string) (string, error) {
138 if selected := config.Getenv("MAC_SDK_VERSION"); selected != "" {
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -0800139 if !inList(selected, darwinSupportedSdkVersions) {
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800140 return "", fmt.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions)
141 }
142
143 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+selected, arg).Output()
144 if err == nil {
145 return strings.TrimSpace(string(bytes)), err
146 }
147 return "", fmt.Errorf("MAC_SDK_VERSION %s is not installed", selected)
148 }
149
150 for _, sdk := range darwinSupportedSdkVersions {
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -0800151 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+sdk, arg).Output()
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800152 if err == nil {
153 return strings.TrimSpace(string(bytes)), err
154 }
155 }
156 return "", fmt.Errorf("Could not find a supported mac sdk: %q", darwinSupportedSdkVersions)
157}
158
Colin Cross0af4b842015-04-30 16:36:18 -0700159type toolchainDarwin struct {
160 cFlags, ldFlags string
161}
162
163type toolchainDarwinX86 struct {
164 toolchain32Bit
165 toolchainDarwin
166}
167
168type toolchainDarwinX8664 struct {
169 toolchain64Bit
170 toolchainDarwin
171}
172
173func (t *toolchainDarwinX86) Name() string {
174 return "x86"
175}
176
177func (t *toolchainDarwinX8664) Name() string {
178 return "x86_64"
179}
180
181func (t *toolchainDarwin) GccRoot() string {
182 return "${darwinGccRoot}"
183}
184
185func (t *toolchainDarwin) GccTriple() string {
186 return "${darwinGccTriple}"
187}
188
189func (t *toolchainDarwin) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800190 return darwinGccVersion
Colin Cross0af4b842015-04-30 16:36:18 -0700191}
192
193func (t *toolchainDarwin) Cflags() string {
194 return "${darwinCflags} ${darwinX86Cflags}"
195}
196
197func (t *toolchainDarwinX8664) Cflags() string {
198 return "${darwinCflags} ${darwinX8664Cflags}"
199}
200
201func (t *toolchainDarwin) Cppflags() string {
Dan Willemsen282a4b02016-03-09 10:30:22 -0800202 return ""
Colin Cross0af4b842015-04-30 16:36:18 -0700203}
204
205func (t *toolchainDarwinX86) Ldflags() string {
206 return "${darwinLdflags} ${darwinX86Ldflags}"
207}
208
209func (t *toolchainDarwinX8664) Ldflags() string {
210 return "${darwinLdflags} ${darwinX8664Ldflags}"
211}
212
213func (t *toolchainDarwin) IncludeFlags() string {
214 return ""
215}
216
217func (t *toolchainDarwinX86) ClangTriple() string {
218 return "i686-darwin-gnu"
219}
220
221func (t *toolchainDarwinX86) ClangCflags() string {
222 return "${darwinClangCflags} ${darwinX86ClangCflags}"
223}
224
Colin Cross0af4b842015-04-30 16:36:18 -0700225func (t *toolchainDarwinX8664) ClangTriple() string {
226 return "x86_64-darwin-gnu"
227}
228
229func (t *toolchainDarwinX8664) ClangCflags() string {
230 return "${darwinClangCflags} ${darwinX8664ClangCflags}"
231}
232
Dan Willemsen282a4b02016-03-09 10:30:22 -0800233func (t *toolchainDarwin) ClangCppflags() string {
234 return ""
Colin Cross0af4b842015-04-30 16:36:18 -0700235}
236
237func (t *toolchainDarwinX86) ClangLdflags() string {
238 return "${darwinClangLdflags} ${darwinX86ClangLdflags}"
239}
240
241func (t *toolchainDarwinX8664) ClangLdflags() string {
242 return "${darwinClangLdflags} ${darwinX8664ClangLdflags}"
243}
244
Dan Willemsen490fd492015-11-24 17:53:15 -0800245func (t *toolchainDarwin) ShlibSuffix() string {
246 return ".dylib"
247}
248
Dan Willemsen282a4b02016-03-09 10:30:22 -0800249func (t *toolchainDarwin) SystemCppCppflags() string {
250 return "${darwinSystemCppCppflags}"
251}
252
253func (t *toolchainDarwin) SystemCppLdflags() string {
254 return "${darwinSystemCppLdflags}"
255}
256
Colin Cross0af4b842015-04-30 16:36:18 -0700257var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{}
258var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{}
259
Colin Crossc5c24ad2015-11-20 15:35:00 -0800260func darwinX86ToolchainFactory(arch common.Arch) Toolchain {
Colin Cross0af4b842015-04-30 16:36:18 -0700261 return toolchainDarwinX86Singleton
262}
263
Colin Crossc5c24ad2015-11-20 15:35:00 -0800264func darwinX8664ToolchainFactory(arch common.Arch) Toolchain {
Colin Cross0af4b842015-04-30 16:36:18 -0700265 return toolchainDarwinX8664Singleton
266}
267
268func init() {
Dan Willemsen490fd492015-11-24 17:53:15 -0800269 registerHostToolchainFactory(common.Darwin, common.X86, darwinX86ToolchainFactory)
270 registerHostToolchainFactory(common.Darwin, common.X86_64, darwinX8664ToolchainFactory)
Colin Cross0af4b842015-04-30 16:36:18 -0700271}