# 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)" ]
    }
  }
}
