blob: e497e5c9cd36cca769ea25895b8f394239ba0fea [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
35 darwinCppflags = []string{
Dan Willemsencf7c71b2015-12-14 20:02:44 -080036 "-isystem ${macToolchainRoot}/usr/include/c++/v1",
Colin Cross0af4b842015-04-30 16:36:18 -070037 }
38
39 darwinLdflags = []string{
40 "-isysroot ${macSdkRoot}",
41 "-Wl,-syslibroot,${macSdkRoot}",
Dan Willemsencf7c71b2015-12-14 20:02:44 -080042 "-mmacosx-version-min=${macSdkVersion}",
Colin Cross0af4b842015-04-30 16:36:18 -070043 }
44
45 // Extended cflags
46 darwinX86Cflags = []string{
47 "-m32",
48 }
49
50 darwinX8664Cflags = []string{
51 "-m64",
52 }
53
54 darwinX86Ldflags = []string{
55 "-m32",
56 "-Wl,-rpath,@loader_path/../lib",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070057 "-Wl,-rpath,@loader_path/lib",
Colin Cross0af4b842015-04-30 16:36:18 -070058 }
59
60 darwinX8664Ldflags = []string{
61 "-m64",
62 "-Wl,-rpath,@loader_path/../lib64",
Dan Willemsen3bf6b472015-09-11 17:41:10 -070063 "-Wl,-rpath,@loader_path/lib64",
Colin Cross0af4b842015-04-30 16:36:18 -070064 }
65
66 darwinClangCflags = append([]string{
67 "-integrated-as",
68 }, clangFilterUnknownCflags(darwinCflags)...)
69
70 darwinClangLdflags = clangFilterUnknownCflags(darwinLdflags)
71
72 darwinX86ClangLdflags = clangFilterUnknownCflags(darwinX86Ldflags)
73
74 darwinX8664ClangLdflags = clangFilterUnknownCflags(darwinX8664Ldflags)
75
76 darwinClangCppflags = clangFilterUnknownCflags(darwinCppflags)
Dan Willemsencf7c71b2015-12-14 20:02:44 -080077
78 darwinSupportedSdkVersions = []string{
79 "macosx10.8",
80 "macosx10.9",
81 "macosx10.10",
82 "macosx10.11",
83 }
Colin Cross0af4b842015-04-30 16:36:18 -070084)
85
Dan Willemsen34fc3b12015-12-07 12:30:44 -080086const (
87 darwinGccVersion = "4.2.1"
88)
89
Colin Cross0af4b842015-04-30 16:36:18 -070090func init() {
Dan Willemsencf7c71b2015-12-14 20:02:44 -080091 pctx.VariableFunc("macSdkPath", func(config interface{}) (string, error) {
92 bytes, err := exec.Command("xcode-select", "--print-path").Output()
93 return strings.TrimSpace(string(bytes)), err
94 })
95 pctx.StaticVariable("macToolchainRoot", "${macSdkPath}/Toolchains/XcodeDefault.xctoolchain")
96 pctx.VariableFunc("macSdkRoot", func(config interface{}) (string, error) {
97 return xcrunSdk(config.(common.Config), "--show-sdk-path")
98 })
99 pctx.VariableFunc("macSdkVersion", func(config interface{}) (string, error) {
100 return xcrunSdk(config.(common.Config), "--show-sdk-version")
101 })
102 pctx.VariableFunc("macArPath", func(config interface{}) (string, error) {
103 bytes, err := exec.Command("xcrun", "--find", "ar").Output()
104 return strings.TrimSpace(string(bytes)), err
105 })
Colin Cross0af4b842015-04-30 16:36:18 -0700106
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800107 pctx.StaticVariable("darwinGccVersion", darwinGccVersion)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700108 pctx.SourcePathVariable("darwinGccRoot",
109 "prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${darwinGccVersion}")
Colin Cross0af4b842015-04-30 16:36:18 -0700110
111 pctx.StaticVariable("darwinGccTriple", "i686-apple-darwin11")
112
113 pctx.StaticVariable("darwinCflags", strings.Join(darwinCflags, " "))
114 pctx.StaticVariable("darwinLdflags", strings.Join(darwinLdflags, " "))
115 pctx.StaticVariable("darwinCppflags", strings.Join(darwinCppflags, " "))
116
117 pctx.StaticVariable("darwinClangCflags", strings.Join(darwinClangCflags, " "))
118 pctx.StaticVariable("darwinClangLdflags", strings.Join(darwinClangLdflags, " "))
119 pctx.StaticVariable("darwinClangCppflags", strings.Join(darwinClangCppflags, " "))
120
121 // Extended cflags
122 pctx.StaticVariable("darwinX86Cflags", strings.Join(darwinX86Cflags, " "))
123 pctx.StaticVariable("darwinX8664Cflags", strings.Join(darwinX8664Cflags, " "))
124 pctx.StaticVariable("darwinX86Ldflags", strings.Join(darwinX86Ldflags, " "))
125 pctx.StaticVariable("darwinX8664Ldflags", strings.Join(darwinX8664Ldflags, " "))
126
127 pctx.StaticVariable("darwinX86ClangCflags",
128 strings.Join(clangFilterUnknownCflags(darwinX86Cflags), " "))
129 pctx.StaticVariable("darwinX8664ClangCflags",
130 strings.Join(clangFilterUnknownCflags(darwinX8664Cflags), " "))
131 pctx.StaticVariable("darwinX86ClangLdflags", strings.Join(darwinX86ClangLdflags, " "))
132 pctx.StaticVariable("darwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " "))
133}
134
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800135func xcrunSdk(config common.Config, arg string) (string, error) {
136 if selected := config.Getenv("MAC_SDK_VERSION"); selected != "" {
137 if !inList("macosx"+selected, darwinSupportedSdkVersions) {
138 return "", fmt.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions)
139 }
140
141 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+selected, arg).Output()
142 if err == nil {
143 return strings.TrimSpace(string(bytes)), err
144 }
145 return "", fmt.Errorf("MAC_SDK_VERSION %s is not installed", selected)
146 }
147
148 for _, sdk := range darwinSupportedSdkVersions {
149 bytes, err := exec.Command("xcrun", "--sdk", sdk, arg).Output()
150 if err == nil {
151 return strings.TrimSpace(string(bytes)), err
152 }
153 }
154 return "", fmt.Errorf("Could not find a supported mac sdk: %q", darwinSupportedSdkVersions)
155}
156
Colin Cross0af4b842015-04-30 16:36:18 -0700157type toolchainDarwin struct {
158 cFlags, ldFlags string
159}
160
161type toolchainDarwinX86 struct {
162 toolchain32Bit
163 toolchainDarwin
164}
165
166type toolchainDarwinX8664 struct {
167 toolchain64Bit
168 toolchainDarwin
169}
170
171func (t *toolchainDarwinX86) Name() string {
172 return "x86"
173}
174
175func (t *toolchainDarwinX8664) Name() string {
176 return "x86_64"
177}
178
179func (t *toolchainDarwin) GccRoot() string {
180 return "${darwinGccRoot}"
181}
182
183func (t *toolchainDarwin) GccTriple() string {
184 return "${darwinGccTriple}"
185}
186
187func (t *toolchainDarwin) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800188 return darwinGccVersion
Colin Cross0af4b842015-04-30 16:36:18 -0700189}
190
191func (t *toolchainDarwin) Cflags() string {
192 return "${darwinCflags} ${darwinX86Cflags}"
193}
194
195func (t *toolchainDarwinX8664) Cflags() string {
196 return "${darwinCflags} ${darwinX8664Cflags}"
197}
198
199func (t *toolchainDarwin) Cppflags() string {
200 return "${darwinCppflags}"
201}
202
203func (t *toolchainDarwinX86) Ldflags() string {
204 return "${darwinLdflags} ${darwinX86Ldflags}"
205}
206
207func (t *toolchainDarwinX8664) Ldflags() string {
208 return "${darwinLdflags} ${darwinX8664Ldflags}"
209}
210
211func (t *toolchainDarwin) IncludeFlags() string {
212 return ""
213}
214
215func (t *toolchainDarwinX86) ClangTriple() string {
216 return "i686-darwin-gnu"
217}
218
219func (t *toolchainDarwinX86) ClangCflags() string {
220 return "${darwinClangCflags} ${darwinX86ClangCflags}"
221}
222
223func (t *toolchainDarwinX86) ClangCppflags() string {
224 return "${darwinClangCppflags}"
225}
226
227func (t *toolchainDarwinX8664) ClangTriple() string {
228 return "x86_64-darwin-gnu"
229}
230
231func (t *toolchainDarwinX8664) ClangCflags() string {
232 return "${darwinClangCflags} ${darwinX8664ClangCflags}"
233}
234
235func (t *toolchainDarwinX8664) ClangCppflags() string {
236 return "${darwinClangCppflags}"
237}
238
239func (t *toolchainDarwinX86) ClangLdflags() string {
240 return "${darwinClangLdflags} ${darwinX86ClangLdflags}"
241}
242
243func (t *toolchainDarwinX8664) ClangLdflags() string {
244 return "${darwinClangLdflags} ${darwinX8664ClangLdflags}"
245}
246
Dan Willemsen490fd492015-11-24 17:53:15 -0800247func (t *toolchainDarwin) ShlibSuffix() string {
248 return ".dylib"
249}
250
Colin Cross0af4b842015-04-30 16:36:18 -0700251var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{}
252var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{}
253
Colin Crossc5c24ad2015-11-20 15:35:00 -0800254func darwinX86ToolchainFactory(arch common.Arch) Toolchain {
Colin Cross0af4b842015-04-30 16:36:18 -0700255 return toolchainDarwinX86Singleton
256}
257
Colin Crossc5c24ad2015-11-20 15:35:00 -0800258func darwinX8664ToolchainFactory(arch common.Arch) Toolchain {
Colin Cross0af4b842015-04-30 16:36:18 -0700259 return toolchainDarwinX8664Singleton
260}
261
262func init() {
Dan Willemsen490fd492015-11-24 17:53:15 -0800263 registerHostToolchainFactory(common.Darwin, common.X86, darwinX86ToolchainFactory)
264 registerHostToolchainFactory(common.Darwin, common.X86_64, darwinX8664ToolchainFactory)
Colin Cross0af4b842015-04-30 16:36:18 -0700265}