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

## This file is automatically generated by mojo/public/tools/mojom_fetcher/mojom_gn.py.
## Manual changes may be overwritten.

import("//build/module_args/mojo.gni")
import("$mojo_sdk_root/mojo/public/tools/bindings/mojom.gni")

mojom("{{group_name}}") {
  deps = [{% for mojom in mojoms %}
    ":{{mojom.target_name}}",{% endfor %}
  ]
}
{% for mojom in mojoms %}
mojom("{{mojom.target_name}}") {
  sources = [
    "{{mojom.filename}}",
  ]{% if mojom.import_dirs %}
  import_dirs = [{% for dir in mojom.import_dirs %}
    get_path_info("{{dir}}", "abspath"),{% endfor %}
  ]{% endif %}{% if mojom.mojo_sdk_deps %}
  mojo_sdk_deps = [{% for dep in mojom.mojo_sdk_deps %}
    "{{dep}}",{% endfor %}
  ]{% endif %}{% if mojom.deps %}
  deps = [{% for dep in mojom.deps %}
    "{{dep}}",{% endfor %}
  ]{% endif %}
}{% endfor %}
