1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117

build / config / mac / BUILD.gn [blame]

# Copyright 2013 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/apple/symbols.gni")
import("//build/config/c++/c++.gni")
import("//build/config/mac/mac_sdk.gni")
import("//build/config/sysroot.gni")
import("//build/toolchain/rbe.gni")
import("//build/toolchain/siso.gni")

# This is included by reference in the //build/config/compiler config that
# is applied to all targets. It is here to separate out the logic.
config("compiler") {
  # These flags are shared between the C compiler and linker.
  common_mac_flags = []

  # CPU architecture.
  if (current_cpu == "x64") {
    clang_arch = "x86_64"
  } else if (current_cpu == "x86") {
    clang_arch = "i386"
  } else if (current_cpu == "arm64") {
    clang_arch = current_cpu
  } else {
    assert(false, "unknown current_cpu $current_cpu")
  }
  common_mac_flags += [ "--target=$clang_arch-apple-macos" ]

  # This is here so that all files get recompiled after an Xcode update.
  # (defines are passed via the command line, and build system rebuild things
  # when their commandline changes). Nothing should ever read this define.
  defines = [ "CR_XCODE_VERSION=$xcode_version" ]

  asmflags = common_mac_flags
  cflags = common_mac_flags

  ldflags = common_mac_flags

  if (save_unstripped_output) {
    ldflags += [ "-Wcrl,unstripped," + rebase_path(root_out_dir) ]
  }

  if (export_libcxxabi_from_executables) {
    ldflags += [ "-Wl,-undefined,dynamic_lookup" ]
  }
}

# This is included by reference in the //build/config/compiler:runtime_library
# config that is applied to all targets. It is here to separate out the logic
# that is Mac-only. Please see that target for advice on what should go in
# :runtime_library vs. :compiler.
config("runtime_library") {
  common_flags = [
    "-isysroot",
    rebase_path(sysroot, root_build_dir),
    "-mmacos-version-min=$mac_deployment_target",
  ]

  asmflags = common_flags
  cflags = common_flags
  ldflags = common_flags
}

# On Mac, this is used for everything except static libraries.
config("mac_dynamic_flags") {
  ldflags = [ "-Wl,-ObjC" ]  # Always load Objective-C categories and classes.

  if (is_component_build) {
    ldflags += [
      # Path for loading shared libraries for unbundled binaries.
      "-Wl,-rpath,@loader_path/.",

      # Path for loading shared libraries for bundled binaries. Get back from
      # Binary.app/Contents/MacOS.
      "-Wl,-rpath,@loader_path/../../..",
    ]

    # Path for loading shared libraries for unbundled binaries for
    # the host toolchain (see https://crbug.com/1315433). Only used
    # for when building for iOS.
    if (target_os == "ios" && current_toolchain == host_toolchain) {
      ldflags += [ "-Wl,-rpath,@loader_path/" + rebase_path(
                       get_label_info(":mac_dynamic_flags", "root_out_dir"),
                       root_build_dir) ]
    }
  }
}

# When building with RBE, all inputs must be relative to the build directory.
# If using the system Xcode, which typically resides outside the build root, a
# symlink to the SDK is created in the build directory, and the path to that
# link is stored in $mac_sdk_path. If an action references a file in the SDK as
# an input, GN will complain that no target generates the file because it is
# below the $root_build_dir. The below action lists as outputs the files in the
# SDK that are referenced as inputs to actions, so that GN thinks a target has
# generated them. The list is centralized here, as multiple targets need to
# reference the same files, and an output can only be generated once.
#
# The symbolic link for $mac_sdk_path is set up by
# //build/config/apple/sdk_info.py in //build/config/mac/mac_sdk.gni.
if (mac_use_xcode_symlinks && current_toolchain == default_toolchain) {
  action("sdk_inputs") {
    script = "//build/noop.py"
    outputs = [
      "$mac_sdk_path/usr/include/mach/exc.defs",
      "$mac_sdk_path/usr/include/mach/mach_exc.defs",
      "$mac_sdk_path/usr/include/mach/notify.defs",
    ]
  }
} else {
  group("sdk_inputs") {
    if (current_toolchain != default_toolchain) {
      public_deps = [ ":sdk_inputs($default_toolchain)" ]
    }
  }
}