| // Copyright 2016 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package config |
| |
| import ( |
| "os/exec" |
| "path/filepath" |
| "strings" |
| |
| "android/soong/android" |
| ) |
| |
| var ( |
| darwinCflags = []string{ |
| "-fdiagnostics-color", |
| |
| "-fPIC", |
| "-funwind-tables", |
| |
| // Workaround differences in inttypes.h between host and target. |
| //See bug 12708004. |
| "-D__STDC_FORMAT_MACROS", |
| "-D__STDC_CONSTANT_MACROS", |
| |
| "-isysroot ${macSdkRoot}", |
| "-mmacosx-version-min=${macMinVersion}", |
| "-DMACOSX_DEPLOYMENT_TARGET=${macMinVersion}", |
| } |
| |
| darwinLdflags = []string{ |
| "-isysroot ${macSdkRoot}", |
| "-Wl,-syslibroot,${macSdkRoot}", |
| "-mmacosx-version-min=${macMinVersion}", |
| } |
| |
| // Extended cflags |
| darwinX86Cflags = []string{ |
| "-m32", |
| } |
| |
| darwinX8664Cflags = []string{ |
| "-m64", |
| } |
| |
| darwinX86Ldflags = []string{ |
| "-m32", |
| } |
| |
| darwinX8664Ldflags = []string{ |
| "-m64", |
| } |
| |
| darwinClangCflags = append(ClangFilterUnknownCflags(darwinCflags), []string{ |
| "-integrated-as", |
| "-fstack-protector-strong", |
| }...) |
| |
| darwinX86ClangCflags = append(ClangFilterUnknownCflags(darwinX86Cflags), []string{ |
| "-msse3", |
| }...) |
| |
| darwinClangLdflags = ClangFilterUnknownCflags(darwinLdflags) |
| |
| darwinX86ClangLdflags = ClangFilterUnknownCflags(darwinX86Ldflags) |
| |
| darwinX8664ClangLdflags = ClangFilterUnknownCflags(darwinX8664Ldflags) |
| |
| darwinSupportedSdkVersions = []string{ |
| "10.10", |
| "10.11", |
| "10.12", |
| "10.13", |
| } |
| |
| darwinAvailableLibraries = append( |
| addPrefix([]string{ |
| "c", |
| "dl", |
| "m", |
| "ncurses", |
| "objc", |
| "pthread", |
| }, "-l"), |
| "-framework AppKit", |
| "-framework CoreFoundation", |
| "-framework Foundation", |
| "-framework IOKit", |
| "-framework Security", |
| ) |
| ) |
| |
| const ( |
| darwinGccVersion = "4.2.1" |
| ) |
| |
| func init() { |
| pctx.VariableFunc("macSdkPath", func(ctx android.PackageVarContext) string { |
| xcodeselect := ctx.Config().HostSystemTool("xcode-select") |
| bytes, err := exec.Command(xcodeselect, "--print-path").Output() |
| if err != nil { |
| ctx.Errorf("xcode-select failed with: %q", err.Error()) |
| } |
| return strings.TrimSpace(string(bytes)) |
| }) |
| pctx.VariableFunc("macSdkRoot", func(ctx android.PackageVarContext) string { |
| return xcrunSdk(ctx, "--show-sdk-path") |
| }) |
| pctx.StaticVariable("macMinVersion", "10.8") |
| pctx.VariableFunc("MacArPath", func(ctx android.PackageVarContext) string { |
| return xcrun(ctx, "--find", "ar") |
| }) |
| |
| pctx.VariableFunc("MacStripPath", func(ctx android.PackageVarContext) string { |
| return xcrun(ctx, "--find", "strip") |
| }) |
| |
| pctx.VariableFunc("MacToolPath", func(ctx android.PackageVarContext) string { |
| return filepath.Dir(xcrun(ctx, "--find", "ld")) |
| }) |
| |
| pctx.StaticVariable("DarwinGccVersion", darwinGccVersion) |
| pctx.SourcePathVariable("DarwinGccRoot", |
| "prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${DarwinGccVersion}") |
| |
| pctx.StaticVariable("DarwinGccTriple", "i686-apple-darwin11") |
| |
| pctx.StaticVariable("DarwinCflags", strings.Join(darwinCflags, " ")) |
| pctx.StaticVariable("DarwinLdflags", strings.Join(darwinLdflags, " ")) |
| |
| pctx.StaticVariable("DarwinClangCflags", strings.Join(darwinClangCflags, " ")) |
| pctx.StaticVariable("DarwinClangLdflags", strings.Join(darwinClangLdflags, " ")) |
| |
| // Extended cflags |
| pctx.StaticVariable("DarwinX86Cflags", strings.Join(darwinX86Cflags, " ")) |
| pctx.StaticVariable("DarwinX8664Cflags", strings.Join(darwinX8664Cflags, " ")) |
| pctx.StaticVariable("DarwinX86Ldflags", strings.Join(darwinX86Ldflags, " ")) |
| pctx.StaticVariable("DarwinX8664Ldflags", strings.Join(darwinX8664Ldflags, " ")) |
| |
| pctx.StaticVariable("DarwinX86ClangCflags", strings.Join(darwinX86ClangCflags, " ")) |
| pctx.StaticVariable("DarwinX8664ClangCflags", |
| strings.Join(ClangFilterUnknownCflags(darwinX8664Cflags), " ")) |
| pctx.StaticVariable("DarwinX86ClangLdflags", strings.Join(darwinX86ClangLdflags, " ")) |
| pctx.StaticVariable("DarwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " ")) |
| pctx.StaticVariable("DarwinX86YasmFlags", "-f macho -m x86") |
| pctx.StaticVariable("DarwinX8664YasmFlags", "-f macho -m amd64") |
| } |
| |
| func xcrun(ctx android.PackageVarContext, args ...string) string { |
| xcrun := ctx.Config().HostSystemTool("xcrun") |
| bytes, err := exec.Command(xcrun, args...).Output() |
| if err != nil { |
| ctx.Errorf("xcrun failed with: %q", err.Error()) |
| } |
| return strings.TrimSpace(string(bytes)) |
| } |
| |
| func xcrunSdk(ctx android.PackageVarContext, arg string) string { |
| xcrun := ctx.Config().HostSystemTool("xcrun") |
| if selected := ctx.Config().Getenv("MAC_SDK_VERSION"); selected != "" { |
| if !inList(selected, darwinSupportedSdkVersions) { |
| ctx.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions) |
| return "" |
| } |
| |
| bytes, err := exec.Command(xcrun, "--sdk", "macosx"+selected, arg).Output() |
| if err != nil { |
| ctx.Errorf("MAC_SDK_VERSION %s is not installed", selected) |
| } |
| return strings.TrimSpace(string(bytes)) |
| } |
| |
| for _, sdk := range darwinSupportedSdkVersions { |
| bytes, err := exec.Command(xcrun, "--sdk", "macosx"+sdk, arg).Output() |
| if err == nil { |
| return strings.TrimSpace(string(bytes)) |
| } |
| } |
| ctx.Errorf("Could not find a supported mac sdk: %q", darwinSupportedSdkVersions) |
| return "" |
| } |
| |
| type toolchainDarwin struct { |
| cFlags, ldFlags string |
| } |
| |
| type toolchainDarwinX86 struct { |
| toolchain32Bit |
| toolchainDarwin |
| } |
| |
| type toolchainDarwinX8664 struct { |
| toolchain64Bit |
| toolchainDarwin |
| } |
| |
| func (t *toolchainDarwinX86) Name() string { |
| return "x86" |
| } |
| |
| func (t *toolchainDarwinX8664) Name() string { |
| return "x86_64" |
| } |
| |
| func (t *toolchainDarwin) GccRoot() string { |
| return "${config.DarwinGccRoot}" |
| } |
| |
| func (t *toolchainDarwin) GccTriple() string { |
| return "${config.DarwinGccTriple}" |
| } |
| |
| func (t *toolchainDarwin) GccVersion() string { |
| return darwinGccVersion |
| } |
| |
| func (t *toolchainDarwin) Cflags() string { |
| return "${config.DarwinCflags} ${config.DarwinX86Cflags}" |
| } |
| |
| func (t *toolchainDarwinX8664) Cflags() string { |
| return "${config.DarwinCflags} ${config.DarwinX8664Cflags}" |
| } |
| |
| func (t *toolchainDarwin) Cppflags() string { |
| return "" |
| } |
| |
| func (t *toolchainDarwinX86) Ldflags() string { |
| return "${config.DarwinLdflags} ${config.DarwinX86Ldflags}" |
| } |
| |
| func (t *toolchainDarwinX8664) Ldflags() string { |
| return "${config.DarwinLdflags} ${config.DarwinX8664Ldflags}" |
| } |
| |
| func (t *toolchainDarwin) IncludeFlags() string { |
| return "" |
| } |
| |
| func (t *toolchainDarwinX86) ClangTriple() string { |
| return "i686-apple-darwin" |
| } |
| |
| func (t *toolchainDarwinX86) ClangCflags() string { |
| return "${config.DarwinClangCflags} ${config.DarwinX86ClangCflags}" |
| } |
| |
| func (t *toolchainDarwinX8664) ClangTriple() string { |
| return "x86_64-apple-darwin" |
| } |
| |
| func (t *toolchainDarwinX8664) ClangCflags() string { |
| return "${config.DarwinClangCflags} ${config.DarwinX8664ClangCflags}" |
| } |
| |
| func (t *toolchainDarwin) ClangCppflags() string { |
| return "" |
| } |
| |
| func (t *toolchainDarwinX86) ClangLdflags() string { |
| return "${config.DarwinClangLdflags} ${config.DarwinX86ClangLdflags}" |
| } |
| |
| func (t *toolchainDarwinX8664) ClangLdflags() string { |
| return "${config.DarwinClangLdflags} ${config.DarwinX8664ClangLdflags}" |
| } |
| |
| func (t *toolchainDarwinX86) YasmFlags() string { |
| return "${config.DarwinX86YasmFlags}" |
| } |
| |
| func (t *toolchainDarwinX8664) YasmFlags() string { |
| return "${config.DarwinX8664YasmFlags}" |
| } |
| |
| func (t *toolchainDarwin) ShlibSuffix() string { |
| return ".dylib" |
| } |
| |
| func (t *toolchainDarwin) AvailableLibraries() []string { |
| return darwinAvailableLibraries |
| } |
| |
| func (t *toolchainDarwin) Bionic() bool { |
| return false |
| } |
| |
| func (t *toolchainDarwin) ToolPath() string { |
| return "${config.MacToolPath}" |
| } |
| |
| var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{} |
| var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{} |
| |
| func darwinX86ToolchainFactory(arch android.Arch) Toolchain { |
| return toolchainDarwinX86Singleton |
| } |
| |
| func darwinX8664ToolchainFactory(arch android.Arch) Toolchain { |
| return toolchainDarwinX8664Singleton |
| } |
| |
| func init() { |
| registerToolchainFactory(android.Darwin, android.X86, darwinX86ToolchainFactory) |
| registerToolchainFactory(android.Darwin, android.X86_64, darwinX8664ToolchainFactory) |
| } |