blob: d514c14763c2db404219ad29ffe5c6e16fbfdda2 [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
Colin Cross635c3b02016-05-18 15:37:25 -07008 "android/soong/android"
Colin Cross0af4b842015-04-30 16:36:18 -07009)
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
41 // Extended cflags
42 darwinX86Cflags = []string{
43 "-m32",
44 }
45
46 darwinX8664Cflags = []string{
47 "-m64",
48 }
49
50 darwinX86Ldflags = []string{
51 "-m32",
Colin Cross0af4b842015-04-30 16:36:18 -070052 }
53
54 darwinX8664Ldflags = []string{
55 "-m64",
Colin Cross0af4b842015-04-30 16:36:18 -070056 }
57
Dan Willemsenf534a102016-03-03 17:22:39 -080058 darwinClangCflags = append(clangFilterUnknownCflags(darwinCflags), []string{
Colin Cross0af4b842015-04-30 16:36:18 -070059 "-integrated-as",
Dan Willemsen7a0f8482016-01-12 16:22:40 -080060 "-fstack-protector-strong",
Dan Willemsenf534a102016-03-03 17:22:39 -080061 }...)
Colin Cross0af4b842015-04-30 16:36:18 -070062
Dan Willemsen01fdd3d2016-03-30 00:01:12 -070063 darwinX86ClangCflags = append(clangFilterUnknownCflags(darwinX86Cflags), []string{
64 "-msse3",
65 }...)
66
Colin Cross0af4b842015-04-30 16:36:18 -070067 darwinClangLdflags = clangFilterUnknownCflags(darwinLdflags)
68
69 darwinX86ClangLdflags = clangFilterUnknownCflags(darwinX86Ldflags)
70
71 darwinX8664ClangLdflags = clangFilterUnknownCflags(darwinX8664Ldflags)
72
Dan Willemsencf7c71b2015-12-14 20:02:44 -080073 darwinSupportedSdkVersions = []string{
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -080074 "10.8",
75 "10.9",
76 "10.10",
77 "10.11",
Dan Willemsencf7c71b2015-12-14 20:02:44 -080078 }
Dan Willemsen20acc5c2016-05-25 14:47:21 -070079
80 darwinAvailableLibraries = addPrefix([]string{
81 "c",
Dan Willemsen72ad1752016-07-13 22:17:39 -070082 "dl",
Dan Willemsen20acc5c2016-05-25 14:47:21 -070083 "m",
Dan Willemsen2b1f0942016-07-20 12:47:47 -070084 "ncurses",
Dan Willemsen20acc5c2016-05-25 14:47:21 -070085 "pthread",
Dan Willemsen29d9f872016-06-06 16:26:48 -070086 "z",
Dan Willemsen20acc5c2016-05-25 14:47:21 -070087 }, "-l")
Colin Cross0af4b842015-04-30 16:36:18 -070088)
89
Dan Willemsen34fc3b12015-12-07 12:30:44 -080090const (
91 darwinGccVersion = "4.2.1"
92)
93
Colin Cross0af4b842015-04-30 16:36:18 -070094func init() {
Dan Willemsencf7c71b2015-12-14 20:02:44 -080095 pctx.VariableFunc("macSdkPath", func(config interface{}) (string, error) {
96 bytes, err := exec.Command("xcode-select", "--print-path").Output()
97 return strings.TrimSpace(string(bytes)), err
98 })
99 pctx.StaticVariable("macToolchainRoot", "${macSdkPath}/Toolchains/XcodeDefault.xctoolchain")
100 pctx.VariableFunc("macSdkRoot", func(config interface{}) (string, error) {
Colin Cross635c3b02016-05-18 15:37:25 -0700101 return xcrunSdk(config.(android.Config), "--show-sdk-path")
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800102 })
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -0800103 pctx.StaticVariable("macSdkVersion", darwinSupportedSdkVersions[0])
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800104 pctx.VariableFunc("macArPath", func(config interface{}) (string, error) {
105 bytes, err := exec.Command("xcrun", "--find", "ar").Output()
106 return strings.TrimSpace(string(bytes)), err
107 })
Colin Cross0af4b842015-04-30 16:36:18 -0700108
Colin Crossb8ecdfe2016-05-03 15:10:29 -0700109 pctx.VariableFunc("macStripPath", func(config interface{}) (string, error) {
110 bytes, err := exec.Command("xcrun", "--find", "strip").Output()
111 return strings.TrimSpace(string(bytes)), err
112 })
113
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800114 pctx.StaticVariable("darwinGccVersion", darwinGccVersion)
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700115 pctx.SourcePathVariable("darwinGccRoot",
116 "prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${darwinGccVersion}")
Colin Cross0af4b842015-04-30 16:36:18 -0700117
118 pctx.StaticVariable("darwinGccTriple", "i686-apple-darwin11")
119
120 pctx.StaticVariable("darwinCflags", strings.Join(darwinCflags, " "))
121 pctx.StaticVariable("darwinLdflags", strings.Join(darwinLdflags, " "))
Colin Cross0af4b842015-04-30 16:36:18 -0700122
123 pctx.StaticVariable("darwinClangCflags", strings.Join(darwinClangCflags, " "))
124 pctx.StaticVariable("darwinClangLdflags", strings.Join(darwinClangLdflags, " "))
Dan Willemsen282a4b02016-03-09 10:30:22 -0800125
Colin Cross0af4b842015-04-30 16:36:18 -0700126 // Extended cflags
127 pctx.StaticVariable("darwinX86Cflags", strings.Join(darwinX86Cflags, " "))
128 pctx.StaticVariable("darwinX8664Cflags", strings.Join(darwinX8664Cflags, " "))
129 pctx.StaticVariable("darwinX86Ldflags", strings.Join(darwinX86Ldflags, " "))
130 pctx.StaticVariable("darwinX8664Ldflags", strings.Join(darwinX8664Ldflags, " "))
131
Dan Willemsen01fdd3d2016-03-30 00:01:12 -0700132 pctx.StaticVariable("darwinX86ClangCflags", strings.Join(darwinX86ClangCflags, " "))
Colin Cross0af4b842015-04-30 16:36:18 -0700133 pctx.StaticVariable("darwinX8664ClangCflags",
134 strings.Join(clangFilterUnknownCflags(darwinX8664Cflags), " "))
135 pctx.StaticVariable("darwinX86ClangLdflags", strings.Join(darwinX86ClangLdflags, " "))
136 pctx.StaticVariable("darwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " "))
137}
138
Colin Cross635c3b02016-05-18 15:37:25 -0700139func xcrunSdk(config android.Config, arg string) (string, error) {
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800140 if selected := config.Getenv("MAC_SDK_VERSION"); selected != "" {
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -0800141 if !inList(selected, darwinSupportedSdkVersions) {
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800142 return "", fmt.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions)
143 }
144
145 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+selected, arg).Output()
146 if err == nil {
147 return strings.TrimSpace(string(bytes)), err
148 }
149 return "", fmt.Errorf("MAC_SDK_VERSION %s is not installed", selected)
150 }
151
152 for _, sdk := range darwinSupportedSdkVersions {
Dan Willemsen6fb8b8d2016-03-09 10:41:21 -0800153 bytes, err := exec.Command("xcrun", "--sdk", "macosx"+sdk, arg).Output()
Dan Willemsencf7c71b2015-12-14 20:02:44 -0800154 if err == nil {
155 return strings.TrimSpace(string(bytes)), err
156 }
157 }
158 return "", fmt.Errorf("Could not find a supported mac sdk: %q", darwinSupportedSdkVersions)
159}
160
Colin Cross0af4b842015-04-30 16:36:18 -0700161type toolchainDarwin struct {
162 cFlags, ldFlags string
163}
164
165type toolchainDarwinX86 struct {
166 toolchain32Bit
167 toolchainDarwin
168}
169
170type toolchainDarwinX8664 struct {
171 toolchain64Bit
172 toolchainDarwin
173}
174
175func (t *toolchainDarwinX86) Name() string {
176 return "x86"
177}
178
179func (t *toolchainDarwinX8664) Name() string {
180 return "x86_64"
181}
182
183func (t *toolchainDarwin) GccRoot() string {
184 return "${darwinGccRoot}"
185}
186
187func (t *toolchainDarwin) GccTriple() string {
188 return "${darwinGccTriple}"
189}
190
191func (t *toolchainDarwin) GccVersion() string {
Dan Willemsen34fc3b12015-12-07 12:30:44 -0800192 return darwinGccVersion
Colin Cross0af4b842015-04-30 16:36:18 -0700193}
194
195func (t *toolchainDarwin) Cflags() string {
196 return "${darwinCflags} ${darwinX86Cflags}"
197}
198
199func (t *toolchainDarwinX8664) Cflags() string {
200 return "${darwinCflags} ${darwinX8664Cflags}"
201}
202
203func (t *toolchainDarwin) Cppflags() string {
Dan Willemsen282a4b02016-03-09 10:30:22 -0800204 return ""
Colin Cross0af4b842015-04-30 16:36:18 -0700205}
206
207func (t *toolchainDarwinX86) Ldflags() string {
208 return "${darwinLdflags} ${darwinX86Ldflags}"
209}
210
211func (t *toolchainDarwinX8664) Ldflags() string {
212 return "${darwinLdflags} ${darwinX8664Ldflags}"
213}
214
215func (t *toolchainDarwin) IncludeFlags() string {
216 return ""
217}
218
219func (t *toolchainDarwinX86) ClangTriple() string {
Dan Willemsen01fdd3d2016-03-30 00:01:12 -0700220 return "i686-apple-darwin"
Colin Cross0af4b842015-04-30 16:36:18 -0700221}
222
223func (t *toolchainDarwinX86) ClangCflags() string {
224 return "${darwinClangCflags} ${darwinX86ClangCflags}"
225}
226
Colin Cross0af4b842015-04-30 16:36:18 -0700227func (t *toolchainDarwinX8664) ClangTriple() string {
Dan Willemsen01fdd3d2016-03-30 00:01:12 -0700228 return "x86_64-apple-darwin"
Colin Cross0af4b842015-04-30 16:36:18 -0700229}
230
231func (t *toolchainDarwinX8664) ClangCflags() string {
232 return "${darwinClangCflags} ${darwinX8664ClangCflags}"
233}
234
Dan Willemsen282a4b02016-03-09 10:30:22 -0800235func (t *toolchainDarwin) ClangCppflags() string {
236 return ""
Colin Cross0af4b842015-04-30 16:36:18 -0700237}
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
Dan Willemsen20acc5c2016-05-25 14:47:21 -0700251func (t *toolchainDarwin) AvailableLibraries() []string {
252 return darwinAvailableLibraries
253}
254
Colin Cross0af4b842015-04-30 16:36:18 -0700255var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{}
256var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{}
257
Colin Cross635c3b02016-05-18 15:37:25 -0700258func darwinX86ToolchainFactory(arch android.Arch) Toolchain {
Colin Cross0af4b842015-04-30 16:36:18 -0700259 return toolchainDarwinX86Singleton
260}
261
Colin Cross635c3b02016-05-18 15:37:25 -0700262func darwinX8664ToolchainFactory(arch android.Arch) Toolchain {
Colin Cross0af4b842015-04-30 16:36:18 -0700263 return toolchainDarwinX8664Singleton
264}
265
266func init() {
Colin Crossa1ad8d12016-06-01 17:09:44 -0700267 registerToolchainFactory(android.Darwin, android.X86, darwinX86ToolchainFactory)
268 registerToolchainFactory(android.Darwin, android.X86_64, darwinX8664ToolchainFactory)
Colin Cross0af4b842015-04-30 16:36:18 -0700269}