# Copyright 2014 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("../../third_party/mojo/src/mojo/public/mojo_sdk.gni")

# A mojo_edk_source_set is a mojo_sdk_source_set that does not restrict
# external dependencies and understands the following additional variables, all
# of which admit a list of the relevant elements specified relative to the
# location of the Mojo EDK:
# allow_circular_mojo_edk_includes_from
template("mojo_edk_source_set") {
  mojo_sdk_source_set(target_name) {
    if (defined(invoker.public_deps) || defined(invoker.deps)) {
      restrict_external_deps = false
    }

    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }
    if (defined(invoker.testonly)) {
      testonly = invoker.testonly
    }
    if (defined(invoker.sources)) {
      sources = invoker.sources
    }
    if (defined(invoker.defines)) {
      defines = invoker.defines
    }
    if (defined(invoker.public_configs)) {
      public_configs = invoker.public_configs
    }

    configs = []
    if (defined(invoker.configs)) {
      configs = invoker.configs
    }

    allow_circular_includes_from = []
    if (defined(invoker.allow_circular_includes_from)) {
      allow_circular_includes_from += invoker.allow_circular_includes_from
    }
    if (defined(invoker.allow_circular_mojo_edk_includes_from)) {
      foreach(edk_target, invoker.allow_circular_mojo_edk_includes_from) {
        # Check that the EDK target was not mistakenly given as an absolute
        # path.
        assert(get_path_info(edk_target, "abspath") != edk_target)
        allow_circular_includes_from +=
            [ rebase_path(edk_target, ".", mojo_root) ]
      }
    }

    if (defined(invoker.public_deps)) {
      public_deps = invoker.public_deps
    }
    mojo_sdk_public_deps = []
    if (defined(invoker.mojo_sdk_public_deps)) {
      mojo_sdk_public_deps += invoker.mojo_sdk_public_deps
    }

    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
    mojo_sdk_deps = []
    if (defined(invoker.mojo_sdk_deps)) {
      mojo_sdk_deps += invoker.mojo_sdk_deps
    }
  }
}
