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

# TODO(brettw) Use "gcc_toolchain.gni" like the Linux toolchains. This requires
# some enhancements since the commands on Mac are slightly different than on
# Linux.

import("//build/config/apple/symbols.gni")
import("//build/config/clang/clang.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/coverage/coverage.gni")
import("//build/toolchain/cc_wrapper.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/toolchain.gni")

assert((target_os == "ios" && host_os == "mac") || host_os != "win")

declare_args() {
  # This makes the linker set timestamps in Mach-O files to 0. This isn't
  # enabled by default because this breaks Xcode's lldb. This has been fixed in
  # https://reviews.llvm.org/rL368199 but that has not yet made it into a public
  # lldb release.
  mac_deterministic_build = false

  # This controls whether whole module optimization is enabled when building
  # Swift modules. If enabled, the compiler will compile the module as one
  # unit, generating just one single object file. Otherwise, it will generate
  # one object file per .swift file. If unspecified, will default to "true"
  # for official builds, and "false" for all other builds.
  swift_whole_module_optimization = -1
}

if (swift_whole_module_optimization == -1) {
  swift_whole_module_optimization = is_official_build
}

# When implementing tools using Python scripts, a TOOL_VERSION=N env
# variable is placed in front of the command. The N should be incremented
# whenever the script is changed, so that the build system rebuilds all
# edges that utilize the script. Ideally this should be changed to use
# proper input-dirty checking, but that could be expensive. Instead, use a
# script to get the tool scripts' modification time to use as the version.
# This won't cause a re-generation of GN files when the tool script changes
# but it will cause edges to be marked as dirty if the ninja files are
# regenerated. See https://crbug.com/619083 for details. A proper fix
# would be to have inputs to tools (https://crbug.com/621119).
tool_versions =
    exec_script("get_tool_mtime.py",
                rebase_path([
                              "//build/toolchain/apple/filter_libtool.py",
                              "//build/toolchain/apple/linker_driver.py",
                              "//build/toolchain/ios/compile_xcassets.py",
                              "//build/toolchain/ios/swiftc.py",
                            ],
                            root_build_dir),
                "trim scope")

# Shared toolchain definition. Invocations should set current_os to set the
# build args in this definition.
template("apple_toolchain") {
  toolchain(target_name) {
    # When invoking this toolchain not as the default one, these args will be
    # passed to the build. They are ignored when this is the default toolchain.
    assert(defined(invoker.toolchain_args),
           "Toolchains must declare toolchain_args")
    toolchain_args = {
      # Populate toolchain args from the invoker.
      forward_variables_from(invoker.toolchain_args, "*")

      # The host toolchain value computed by the default toolchain's setup
      # needs to be passed through unchanged to all secondary toolchains to
      # ensure that it's always the same, regardless of the values that may be
      # set on those toolchains.
      host_toolchain = host_toolchain
    }

    # When the invoker has explicitly overridden use_goma or cc_wrapper in the
    # toolchain args, use those values, otherwise default to the global one.
    # This works because the only reasonable override that toolchains might
    # supply for these values are to force-disable them.
    if (defined(toolchain_args.use_goma)) {
      toolchain_uses_goma = toolchain_args.use_goma
    } else {
      toolchain_uses_goma = use_goma
    }
    if (defined(toolchain_args.cc_wrapper)) {
      toolchain_cc_wrapper = toolchain_args.cc_wrapper
    } else {
      toolchain_cc_wrapper = cc_wrapper
    }
    if (defined(toolchain_args.use_xcode_clang)) {
      toolchain_uses_xcode_clang = toolchain_args.use_xcode_clang
    } else {
      toolchain_uses_xcode_clang = use_xcode_clang
    }

    # Supports building with the version of clang shipped with Xcode when
    # targeting iOS by not respecting clang_base_path.
    if (toolchain_uses_xcode_clang) {
      prefix = invoker.bin_path
    } else {
      prefix = rebase_path("$clang_base_path/bin/", root_build_dir)
    }

    _cc = "${prefix}clang"
    _cxx = "${prefix}clang++"

    swiftmodule_switch = "-Wl,-add_ast_path,"

    # Compute the compiler prefix.
    if (toolchain_uses_goma) {
      assert(toolchain_cc_wrapper == "",
             "Goma and cc_wrapper can't be used together.")
      compiler_prefix = "$goma_dir/gomacc "
    } else if (toolchain_cc_wrapper != "") {
      compiler_prefix = toolchain_cc_wrapper + " "
    } else {
      compiler_prefix = ""
    }

    cc = compiler_prefix + _cc
    cxx = compiler_prefix + _cxx
    ld = _cxx

    # Set the explicit search path for clang++ so it uses the right linker
    # binary.
    if (!use_lld) {
      ld += " -B " + invoker.bin_path
    }

    if (defined(toolchain_args.coverage_instrumentation_input_file)) {
      toolchain_coverage_instrumentation_input_file =
          toolchain_args.coverage_instrumentation_input_file
    } else {
      toolchain_coverage_instrumentation_input_file =
          coverage_instrumentation_input_file
    }
    _use_clang_coverage_wrapper =
        toolchain_coverage_instrumentation_input_file != ""
    if (_use_clang_coverage_wrapper) {
      _coverage_wrapper =
          rebase_path("//build/toolchain/clang_code_coverage_wrapper.py",
                      root_build_dir) + " --files-to-instrument=" +
          rebase_path(toolchain_coverage_instrumentation_input_file,
                      root_build_dir) + " --target-os=" + target_os
      cc = "$python_path $_coverage_wrapper ${cc}"
      cxx = "$python_path $_coverage_wrapper ${cxx}"
    }

    linker_driver =
        "TOOL_VERSION=${tool_versions.linker_driver} " +
        rebase_path("//build/toolchain/apple/linker_driver.py", root_build_dir)

    # Specify an explicit path for the strip binary.
    _strippath = invoker.bin_path + "strip"
    linker_driver += " -Wcrl,strippath," + _strippath

    if (mac_deterministic_build) {
      linker_driver += " --deterministic"
    }

    # On iOS, the final applications are assembled using lipo (to support fat
    # builds). The correct flags are passed to the linker_driver.py script
    # directly during the lipo call. The test is against the target_os because
    # there is no need to create .dSYMs for targets compiled for the host.
    if (defined(invoker.strip_with_lipo) && invoker.strip_with_lipo) {
      _enable_dsyms = false
      _save_unstripped_output = false
    } else {
      _enable_dsyms = enable_dsyms
      _save_unstripped_output = save_unstripped_output
    }

    # Make these apply to all tools below.
    lib_switch = "-l"
    lib_dir_switch = "-L"

    # Object files go in this directory. Use label_name instead of
    # target_output_name since labels will generally have no spaces and will be
    # unique in the directory.
    object_subdir = "{{target_out_dir}}/{{label_name}}"

    # If dSYMs are enabled, this flag will be added to the link tools.
    if (_enable_dsyms) {
      dsym_switch = " -Wcrl,dsym,{{root_out_dir}} "
      dsym_switch += "-Wcrl,dsymutilpath," +
                     rebase_path("//tools/clang/dsymutil/bin/dsymutil",
                                 root_build_dir) + " "

      dsym_output_dir =
          "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.dSYM"
      dsym_output = [
        "$dsym_output_dir/Contents/Info.plist",
        "$dsym_output_dir/Contents/Resources/DWARF/" +
            "{{target_output_name}}{{output_extension}}",
      ]
    } else {
      dsym_switch = ""
    }

    if (_save_unstripped_output) {
      _unstripped_output = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.unstripped"
    }

    tool("cc") {
      depfile = "{{output}}.d"
      precompiled_header_type = "gcc"
      command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "CC {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
    }

    tool("cxx") {
      depfile = "{{output}}.d"
      precompiled_header_type = "gcc"
      command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "CXX {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
    }

    tool("asm") {
      # For GCC we can just use the C compiler to compile assembly.
      depfile = "{{output}}.d"
      command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "ASM {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
    }

    tool("objc") {
      depfile = "{{output}}.d"
      precompiled_header_type = "gcc"
      command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "OBJC {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
    }

    tool("objcxx") {
      depfile = "{{output}}.d"
      precompiled_header_type = "gcc"
      command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "OBJCXX {{output}}"
      outputs = [ "$object_subdir/{{source_name_part}}.o" ]
    }

    tool("alink") {
      rspfile = "{{output}}.rsp"

      if (!use_lld) {
        # Note about -filelist: Apple's linker reads the file list file and
        # interprets each newline-separated chunk of text as a file name. It
        # doesn't do the things one would expect from the shell like unescaping
        # or handling quotes. In contrast, when Ninja finds a file name with
        # spaces, it single-quotes them in $inputs_newline as it would normally
        # do for command-line arguments. Thus any source names with spaces, or
        # label names with spaces (which GN bases the output paths on) will be
        # corrupted by this process. Don't use spaces for source files or
        # labels.
        rspfile_content = "{{inputs_newline}}"

        script = rebase_path("//build/toolchain/apple/filter_libtool.py",
                             root_build_dir)

        # Specify explicit path for libtool.
        libtool = invoker.bin_path + "libtool"
        command = "rm -f {{output}} && TOOL_VERSION=${tool_versions.filter_libtool} $python_path $script $libtool -static -D {{arflags}} -o {{output}} -filelist $rspfile"
        description = "LIBTOOL-STATIC {{output}}"
      } else {
        rspfile_content = "{{inputs}}"
        ar = "${prefix}llvm-ar"
        command = "\"$ar\" {{arflags}} -r -c -s -D {{output}} \"@$rspfile\""

        # Remove the output file first so that ar doesn't try to modify the
        # existing file.
        command = "rm -f {{output}} && $command"
        description = "AR {{output}}"
      }
      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
      default_output_dir = "{{target_out_dir}}"
      default_output_extension = ".a"
      output_prefix = "lib"
    }

    tool("solink") {
      # E.g. "./libfoo.dylib":
      dylib = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      rspfile = dylib + ".rsp"
      pool = "//build/toolchain:link_pool($default_toolchain)"

      # These variables are not built into GN but are helpers that implement
      # (1) linking to produce a .dylib, (2) extracting the symbols from that
      # file to a temporary file, (3) if the temporary file has differences from
      # the existing .TOC file, overwrite it, otherwise, don't change it.
      #
      # As a special case, if the library reexports symbols from other dynamic
      # libraries, we always update the .TOC and skip the temporary file and
      # diffing steps, since that library always needs to be re-linked.
      tocname = dylib + ".TOC"
      temporary_tocname = dylib + ".tmp"

      # Use explicit paths to binaries. The binaries present on the default
      # search path in /usr/bin are thin wrappers around xcrun, which requires a
      # full CommandLineTools or Xcode install, and still may not choose the
      # appropriate binary if there are multiple installs.
      if (host_os == "mac") {
        nm = invoker.bin_path + "nm"
        otool = invoker.bin_path + "otool"
      } else {
        nm = "${prefix}llvm-nm"
        otool = "${prefix}llvm-otool"
      }

      does_reexport_command = "[ ! -e \"$dylib\" -o ! -e \"$tocname\" ] || $otool -l \"$dylib\" | grep -q LC_REEXPORT_DYLIB"

      link_command = "$linker_driver $ld -shared "
      if (is_component_build) {
        link_command += " -Wl,-install_name,@rpath/\"{{target_output_name}}{{output_extension}}\" "
      }
      link_command += dsym_switch
      link_command += "{{ldflags}} -o \"$dylib\" -Wl,-filelist,\"$rspfile\" {{frameworks}} {{swiftmodules}} {{solibs}} {{libs}}"

      replace_command = "if ! cmp -s \"$temporary_tocname\" \"$tocname\"; then mv \"$temporary_tocname\" \"$tocname\""
      extract_toc_command = "{ $otool -l \"$dylib\" | grep LC_ID_DYLIB -A 5; $nm -gPp \"$dylib\" | cut -f1-2 -d' ' | grep -v U\$\$; true; }"

      command = "if $does_reexport_command ; then $link_command && $extract_toc_command > \"$tocname\"; else $link_command && $extract_toc_command > \"$temporary_tocname\" && $replace_command ; fi; fi"

      rspfile_content = "{{inputs_newline}}"

      description = "SOLINK {{output}}"

      # Use this for {{output_extension}} expansions unless a target manually
      # overrides it (in which case {{output_extension}} will be what the target
      # specifies).
      default_output_dir = "{{root_out_dir}}"
      default_output_extension = ".dylib"

      output_prefix = "lib"

      # Since the above commands only updates the .TOC file when it changes, ask
      # Ninja to check if the timestamp actually changed to know if downstream
      # dependencies should be recompiled.
      restat = true

      # Tell GN about the output files. It will link to the dylib but use the
      # tocname for dependency management.
      outputs = [
        dylib,
        tocname,
      ]
      link_output = dylib
      depend_output = tocname

      if (_enable_dsyms) {
        outputs += dsym_output
      }
      if (_save_unstripped_output) {
        outputs += [ _unstripped_output ]
      }
    }

    tool("solink_module") {
      # E.g. "./libfoo.so":
      sofile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      rspfile = sofile + ".rsp"
      pool = "//build/toolchain:link_pool($default_toolchain)"

      link_command = "$linker_driver $ld -bundle {{ldflags}} -o \"$sofile\" -Wl,-filelist,\"$rspfile\""
      if (is_component_build) {
        link_command += " -Wl,-install_name,@rpath/{{target_output_name}}{{output_extension}}"
      }
      link_command += dsym_switch
      link_command += " {{frameworks}} {{swiftmodules}} {{solibs}} {{libs}}"
      command = link_command

      rspfile_content = "{{inputs_newline}}"

      description = "SOLINK_MODULE {{output}}"

      # Use this for {{output_extension}} expansions unless a target manually
      # overrides it (in which case {{output_extension}} will be what the target
      # specifies).
      default_output_dir = "{{root_out_dir}}"
      default_output_extension = ".so"

      outputs = [ sofile ]

      if (_enable_dsyms) {
        outputs += dsym_output
      }
      if (_save_unstripped_output) {
        outputs += [ _unstripped_output ]
      }
    }

    tool("link") {
      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      rspfile = "$outfile.rsp"
      pool = "//build/toolchain:link_pool($default_toolchain)"

      # Note about -filelist: Apple's linker reads the file list file and
      # interprets each newline-separated chunk of text as a file name. It
      # doesn't do the things one would expect from the shell like unescaping
      # or handling quotes. In contrast, when Ninja finds a file name with
      # spaces, it single-quotes them in $inputs_newline as it would normally
      # do for command-line arguments. Thus any source names with spaces, or
      # label names with spaces (which GN bases the output paths on) will be
      # corrupted by this process. Don't use spaces for source files or labels.
      command = "$linker_driver $ld $dsym_switch {{ldflags}} -o \"$outfile\" -Wl,-filelist,\"$rspfile\" {{frameworks}} {{swiftmodules}} {{solibs}} {{libs}}"
      description = "LINK $outfile"
      rspfile_content = "{{inputs_newline}}"
      outputs = [ outfile ]

      if (_enable_dsyms) {
        outputs += dsym_output
      }
      if (_save_unstripped_output) {
        outputs += [ _unstripped_output ]
      }

      default_output_dir = "{{root_out_dir}}"
    }

    # These two are really entirely generic, but have to be repeated in
    # each toolchain because GN doesn't allow a template to be used here.
    # See //build/toolchain/toolchain.gni for details.
    tool("stamp") {
      command = stamp_command
      description = stamp_description
    }
    tool("copy") {
      command = copy_command
      description = copy_description
    }

    tool("copy_bundle_data") {
      # copy_command use hardlink if possible but this does not work with
      # directories. Also when running EG2 tests from Xcode, Xcode tries to
      # copy some files into the application bundle which fails if source
      # and destination are hardlinked together.
      #
      # Instead use clonefile to copy the files which is as efficient as
      # hardlink but ensure the file have distinct metadata (thus avoid the
      # error with ditto, see https://crbug.com/1042182).
      if (host_os == "mac") {
        command = "rm -rf {{output}} && cp -Rc {{source}} {{output}}"
      } else {
        command = "rm -rf {{output}} && cp -Rl {{source}} {{output}}"
      }
      description = "COPY_BUNDLE_DATA {{source}} {{output}}"
      pool = "//build/toolchain/apple:bundle_pool($default_toolchain)"
    }

    # Swift is only used on iOS, not macOS. We want to minimize the number
    # of Xcode-based tools used by the macOS toolchain, so we intentionally
    # disallow future uses of Swift on macOS. https://crbug.com/965663.
    if (toolchain_args.current_os == "ios") {
      tool("swift") {
        _tool = rebase_path("//build/toolchain/ios/swiftc.py", root_build_dir)

        depfile = "{{target_out_dir}}/{{module_name}}.d"
        depsformat = "gcc"

        outputs = [
          # The module needs to be the first output listed. The blank line after
          # the module is required to prevent `gn format` from changing the file
          # order.
          "{{target_gen_dir}}/{{module_name}}.swiftmodule",

          "{{target_gen_dir}}/{{module_name}}.h",
          "{{target_gen_dir}}/{{module_name}}.swiftdoc",
          "{{target_gen_dir}}/{{module_name}}.swiftsourceinfo",
        ]

        if (swift_whole_module_optimization) {
          _extra_flags = "-whole-module-optimization"
          _objects_dir = "{{target_out_dir}}"

          outputs += [ "$_objects_dir/{{module_name}}.o" ]
        } else {
          _extra_flags = ""
          _objects_dir = "{{target_out_dir}}/{{label_name}}"

          partial_outputs = [ "$_objects_dir/{{source_name_part}}.o" ]
        }

        _env_vars = "TOOL_VERSION=${tool_versions.swiftc}"
        if (invoker.sdk_developer_dir != "") {
          _env_vars += " DEVELOPER_DIR=${toolchain_args.sdk_developer_dir}"
        }

        command =
            "$_env_vars $_tool -module-name {{module_name}} " +
            "-object-dir $_objects_dir " +
            "-module-path {{target_gen_dir}}/{{module_name}}.swiftmodule " +
            "-header-path {{target_gen_dir}}/{{module_name}}.h " +
            "-depfile {{target_out_dir}}/{{module_name}}.d " +
            "-depfile-filter {{target_gen_dir}}/{{module_name}}.swiftmodule " +
            "-bridge-header {{bridge_header}} $_extra_flags " +
            "{{swiftflags}} {{include_dirs}} {{module_dirs}} {{inputs}}"
      }
    }

    # xcassets are only used on iOS, not macOS. We want to minimize the number
    # of Xcode-based tools used by the macOS toolchain, so we intentionally
    # disallow future uses of xcassets on macOS. https://crbug.com/965663.
    if (toolchain_args.current_os == "ios") {
      tool("compile_xcassets") {
        _tool = rebase_path("//build/toolchain/ios/compile_xcassets.py",
                            root_build_dir)

        command =
            "rm -f \"{{output}}\" && " +
            "TOOL_VERSION=${tool_versions.compile_xcassets} " +
            "$python_path $_tool -p \"${invoker.sdk_name}\" " +
            "-t \"${invoker.deployment_target}\" " +
            "-T \"{{bundle_product_type}}\" " +
            "-P \"{{bundle_partial_info_plist}}\" " + "-o {{output}} {{inputs}}"

        description = "COMPILE_XCASSETS {{output}}"
        pool = "//build/toolchain/apple:bundle_pool($default_toolchain)"
      }
    }

    tool("action") {
      pool = "//build/toolchain:action_pool($default_toolchain)"
    }
  }
}
