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

template("split_static_library") {
  assert(defined(invoker.split_count),
         "Must define split_count for split_static_library")

  # In many conditions the number of inputs will be 1 (because the count will
  # be conditional on platform or configuration) so optimize that.
  if (invoker.split_count == 1) {
    static_library(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    group_name = target_name

    generated_static_libraries = []
    current_library_index = 0
    foreach(current_sources, split_list(invoker.sources, invoker.split_count)) {
      current_name = "${target_name}_$current_library_index"
      assert(
          current_sources != [],
          "Your values for splitting a static library generate one that has no sources.")
      generated_static_libraries += [ ":$current_name" ]

      static_library(current_name) {
        # Generated static library shard gets everything but sources (which
        # we're redefining) and visibility (which is set to be the group
        # below).
        forward_variables_from(invoker,
                               "*",
                               [
                                 "check_includes",
                                 "sources",
                                 "visibility",
                               ])
        sources = current_sources
        visibility = [ ":$group_name" ]

        # When splitting a target's sources up into a series of static
        # libraries, those targets will naturally include headers from each
        # other arbitrarily. We could theoretically generate a web of
        # dependencies and allow_circular_includes_from between all pairs of
        # targets, but that's very cumbersome. Typical usage in Chrome is that
        # only official Windows builds use split static libraries due to the
        # Visual Studio size limits, and this means we'll still get header
        # checking coverage for the other configurations.
        check_includes = false

        # Uniquify the output name if one is specified.
        if (defined(invoker.output_name)) {
          output_name = "${invoker.output_name}_$current_library_index"
        }
      }

      current_library_index = current_library_index + 1
    }

    group(group_name) {
      public_deps = generated_static_libraries
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
    }
  }
}

set_defaults("split_static_library") {
  configs = default_compiler_configs
}
