# 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("../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:
# mojo_edk_configs
# allow_circular_mojo_edk_includes_from
# mojo_edk_public_deps
# mojo_edk_deps

# Note that it is assumed that the Mojo EDK is a sibling of the Mojo SDK in a
# client repo; the distinctions made above are for the sake of clarity in
# writing targets.
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.mojo_edk_visibility)) {
      mojo_sdk_visibility = invoker.mojo_edk_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
    }
    if (defined(invoker.mojo_edk_configs)) {
      foreach(edk_config, invoker.mojo_edk_configs) {
        # Check that the EDK config was not mistakenly given as an absolute
        # path.
        assert(get_path_info(edk_config, "abspath") != edk_config)
        configs += [ rebase_path(edk_config, ".", mojo_root) ]
      }
    }

    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_edk_public_deps)) {
      # The EDK is required to be a sibling of the SDK, so the relative
      # dependencies are rewritten in the same way.
      mojo_sdk_public_deps = invoker.mojo_edk_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_edk_deps)) {
      # The EDK is required to be a sibling of the SDK, so the relative
      # dependencies are rewritten in the same way.
      mojo_sdk_deps = invoker.mojo_edk_deps
    }
    if (defined(invoker.mojo_sdk_deps)) {
      mojo_sdk_deps += invoker.mojo_sdk_deps
    }
  }
}

# Build EDK things with static thread annotation analysis enabled.
# TODO(vtl): Should we set this at a higher level?
if (is_clang) {
  cflags = [ "-Wthread-safety" ]
}
