# Copyright 2017 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# The delegated_config template defines a family of configs which delegate to
# real implementations elsewhere. The most notable use of this template is to
# define toolchain-independent compiler configs, such as
# //starboard/build/config:rtti (and its sisters :no_rtti and :default_rtti).
#
# The simplest way to use delegated_config is to specify only a path:
#
#   delegated_config("rtti") {
#     path = "//$starboard_path"
#   }
#
# The sample code above will expand to:
#
#   config("rtti") {
#     configs = [ "//$starboard_path:rtti" ]
#   }
#
#   config("no_rtti") {
#     configs = [ "//$starboard_path:no_rtti" ]
#   }
#
#   config("default_rtti") {
#     configs = [ "//$starboard_path:default_rtti" ]
#   }
#
# The BUILD.gn file is then expected to define each of those three configs (or
# further delegate them to e.g. a toolchain's implementation).
#
# To use a different list of prefixes, set the prefixes option:
#
#   delegated_config("optimizations") {
#     path = "//$starboard_path"
#     prefixes = [ "no", "debuggable", "full" ]
#   }
#
# This will expand to:
#
#   config("no_optimizations") {
#     configs = [ "//$starboard_path:no_optimizations" ]
#   }
#
#   config("debuggable_optimizations") {
#     configs = [ "//$starboard_path:debuggable_optimizations" ]
#   }
#
#   config("full_optimizations") {
#     configs = [ "//$starboard_path:full_optimizations" ]
#   }
#
#   config("default_optimizations") {
#     configs = [ "//$starboard_path:default_optimizations" ]
#   }
#
# Note that the default_optimizations config is generated, even though it is
# not in the list of prefixes. If you don't want the default_optimizations
# config to be generated, set generate_default = false:
#
#   delegated_config("optimizations") {
#     path = "//$starboard_path"
#     prefixes = [ "no", "debuggable", "full" ]
#     generate_default = false
#   }
#
# Now only the no_, debuggable_, and full_ configs will be generated.

template("delegated_config") {
  assert(defined(invoker.path),
         "You need to specify a path to the implementation")

  if (defined(invoker.prefixes)) {
    prefixes = invoker.prefixes
  } else {
    prefixes = [ "", "no" ]
  }

  foreach(prefix, prefixes) {
    assert(prefix != "default",
           "You shouldn't include \"default\" in the list of prefixes " +
               "because it's separately generated.")

    if (prefix == "") {
      prefix_ = prefix
    } else {
      prefix_ = "${prefix}_"
    }

    config("$prefix_$target_name") {
      configs = [ "${invoker.path}:$prefix_$target_name" ]
    }
  }

  if (!(defined(invoker.generate_default) && !invoker.generate_default)) {
    config("default_$target_name") {
      configs = [ "${invoker.path}:default_$target_name" ]
    }
  }
}
