# Copyright 2017 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.

import("//build/config/nacl/config.gni")  # To see if jumbo should be turned off
import("//build/toolchain/goma.gni")

declare_args() {
  use_jumbo_build = false
  jumbo_build_excluded = []
  jumbo_file_merge_limit = -1
}

# TODO(crbug.com/994387): Remove all uses of the jumbo_* templates from the
# BUILD.gn files, and then remove this whole file.
assert(!use_jumbo_build,
       "The jumbo build is no longer supported. Please remove any uses of " +
           "'use_jumbo_build', 'jumbo_build_excluded', or " +
           "'jumbo_file_merge_limit' from your args.gn file and re-run GN.")

# Normal builds benefit from lots of jumbification
jumbo_file_merge_default = 50

# Goma builds benefit from more parallelism
jumbo_file_merge_goma = 8

# Use one of the targets jumbo_source_set, jumbo_static_library, or
# jumbo_component to generate a target which merges sources if possible to
# compile much faster.
#
# Special values.
#
#   target_type
#      The kind of target to build. For example the string
#      "static_library".
#
#   always_build_jumbo
#      If set and set to true, then use jumbo compile even when it is
#      globally disabled. Otherwise it has no effect.
#
#   never_build_jumbo
#      If set and set to true, then do not jumbo compile even if it is
#      globally enabled. Otherwise it has no effect.
#
#   jumbo_excluded_sources
#      If set to a list of files, those files will not be merged with
#      the rest. This can be necessary if merging the files causes
#      compilation issues and fixing the issues is impractical.
template("internal_jumbo_target") {
  use_jumbo_build_for_target = use_jumbo_build
  if (defined(invoker.always_build_jumbo) && invoker.always_build_jumbo) {
    use_jumbo_build_for_target = true
  }
  if (defined(invoker.never_build_jumbo) && invoker.never_build_jumbo) {
    use_jumbo_build_for_target = false
  }
  if (is_nacl_irt || is_nacl_nonsfi) {
    # The code is barely compatible with the nacl toolchain anymore and we
    # don't want to stress it further with jumbo compilation units.
    use_jumbo_build_for_target = false
  }

  foreach(excluded_target, jumbo_build_excluded) {
    if (excluded_target == target_name ||
        excluded_target == get_label_info(":" + target_name, "dir") ||
        excluded_target ==
        get_label_info(":" + target_name, "label_no_toolchain")) {
      use_jumbo_build_for_target = false
    }
  }

  excluded_sources = []
  if (defined(invoker.jumbo_excluded_sources)) {
    excluded_sources = invoker.jumbo_excluded_sources
  }

  if (defined(invoker.sources)) {
    invoker_sources = invoker.sources
  } else {
    invoker_sources = []
  }

  gen_target_dir = invoker.target_gen_dir

  not_needed([ "gen_target_dir" ])  # Prevent "unused variable".

  if (use_jumbo_build_for_target) {
    jumbo_files = []

    # Split the sources list into chunks that are not excessively large
    current_file_index = 0
    next_chunk_start = 0
    next_chunk_number = 1
    merge_limit = jumbo_file_merge_limit
    if (merge_limit == -1) {
      if (use_goma) {
        merge_limit = jumbo_file_merge_goma
      } else {
        merge_limit = jumbo_file_merge_default
      }
    }
    has_c_file = false
    has_objective_c_file = false
    sources_in_jumbo_files = []
    assert(merge_limit > 0)
    foreach(source_file, invoker_sources) {
      source_ext = get_path_info(source_file, "extension")
      is_source_file = true
      if (source_ext == "c") {
        has_c_file = true
      } else if (source_ext == "mm") {
        has_objective_c_file = true
      } else if (source_ext == "cc" || source_ext == "cpp") {
        if (current_file_index == next_chunk_start) {
          jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_" +
                           next_chunk_number + ".cc" ]
          next_chunk_number += 1
          next_chunk_start += merge_limit
        }
        current_file_index += 1
      } else {
        is_source_file = false
      }
      if (is_source_file) {
        sources_in_jumbo_files += [ source_file ]
      }
    }

    if (jumbo_files == [] || current_file_index == 1) {
      # Empty sources list or a sources list with only header files or
      # at most one non-header file.
      use_jumbo_build_for_target = false
      not_needed([
                   "sources_in_jumbo_files",
                   "current_file_index",
                   "next_chunk_start",
                   "next_chunk_number",
                 ])
    }

    if (has_c_file) {
      jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_c.c" ]
    }
    if (has_objective_c_file) {
      jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_mm.mm" ]
    }
  }

  if (use_jumbo_build_for_target) {
    merge_action_name = target_name + "__jumbo_merge"
    sources_in_jumbo_files -= excluded_sources

    # Create an action that calls a script that merges all the source files.
    action(merge_action_name) {
      script = "//build/config/merge_for_jumbo.py"
      response_file_contents =
          rebase_path(sources_in_jumbo_files, root_build_dir)
      outputs = jumbo_files
      args = [ "--outputs" ] + rebase_path(outputs, root_build_dir) +
             [ "--file-list={{response_file_name}}" ]

      # For the "gn analyze" step to work, gn needs to know about the
      # original source files. They can't be in |sources| because then
      # they will be compiled, so they have to be somewhere else where
      # gn analyze looks. One alternative is the |data| list but that
      # will affect test packaging with known bad effects on
      # distributed testing. Putting them in this action's input list
      # is the least bad place.
      inputs = []
      foreach(f, invoker_sources - excluded_sources) {
        # Avoid generated files and non non-source files.
        in_source_tree = string_replace(rebase_path(f),
                                        rebase_path(root_out_dir),
                                        "dummy") == rebase_path(f)
        is_source_file = get_path_info(f, "extension") == "cc" ||
                         get_path_info(f, "extension") == "cpp" ||
                         get_path_info(f, "extension") == "c" ||
                         get_path_info(f, "extension") == "mm"
        if (in_source_tree && is_source_file) {
          inputs += [ f ]
        }
      }
    }
  } else {
    # If the list subtraction triggers a gn error,
    # jumbo_excluded_sources lists a file that is not in sources.
    sources_after_exclusion = invoker_sources - excluded_sources
    not_needed([ "sources_after_exclusion" ])
  }

  target_type = invoker.target_type

  # Perform the actual operation, either on the original sources or
  # the sources post-jumbo merging.
  target(target_type, target_name) {
    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    # Take everything else not handled above from the invoker.
    variables_to_not_forward = [ "deps" ]
    if (use_jumbo_build_for_target) {
      deps += [ ":" + merge_action_name ]
      variables_to_not_forward += [ "sources" ]
      assert(jumbo_files != [])
      set_sources_assignment_filter([])  # Prefiltered.
      sources = invoker_sources - sources_in_jumbo_files + jumbo_files

      # Change include_dirs to make sure that the jumbo file can find its
      # #included files.
      variables_to_not_forward += [ "include_dirs" ]
      include_dirs = []
      if (defined(invoker.include_dirs)) {
        include_dirs = invoker.include_dirs
      }
      include_dirs += [ root_build_dir ]
    }
    forward_variables_from(invoker, "*", variables_to_not_forward)
  }
}

# See documentation above by "internal_jumbo_target".
template("jumbo_source_set") {
  internal_jumbo_target(target_name) {
    target_type = "source_set"
    forward_variables_from(invoker, "*")
  }
}

set_defaults("jumbo_source_set") {
  # This sets the default list of configs when the jumbo_source_set target
  # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
  # is the list normally applied to static libraries and source sets.
  configs = default_compiler_configs
}

# See documentation above by "internal_jumbo_target".
template("jumbo_static_library") {
  internal_jumbo_target(target_name) {
    target_type = "static_library"
    forward_variables_from(invoker, "*")
  }
}

set_defaults("jumbo_static_library") {
  # This sets the default list of configs when the jumbo_static_library target
  # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
  # is the list normally applied to static libraries and source sets.
  configs = default_compiler_configs
}

# See documentation above by "internal_jumbo_target".
template("jumbo_component") {
  internal_jumbo_target(target_name) {
    target_type = "component"
    forward_variables_from(invoker, "*")
  }
}

set_defaults("jumbo_component") {
  # This sets the default list of configs when the jumbo_component
  # target is defined. This code is a clone of set_defaults for the
  # ordinary "component" template.
  if (is_component_build) {
    configs = default_shared_library_configs
    if (is_android) {
      configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
    }
  } else {
    configs = default_compiler_configs
  }
}
