# 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 has rules for making Dart packages and Dart-based Mojo applications.
# The entrypoint is the dart_pkg rule.

import("../mojo.gni")
import("//build/module_args/mojo.gni")
import("//build/module_args/dart.gni")

template("dartx") {
  bundle_prefix = target_name
  bundle = "$target_gen_dir/${bundle_prefix}.dartx"
  snapshot = "$target_gen_dir/${bundle_prefix}_snapshot.bin"

  if (mojo_use_prebuilt_dart_snapshotter) {
    dart_snapshotter_path =
        rebase_path("mojo/public/tools:copy_dart_snapshotter", ".", mojo_root)
    dart_snapshotter_rule = "$dart_snapshotter_path($host_toolchain)"
  } else {
    dart_snapshotter_rule = dart_snapshotter_bin
  }
  dart_snapshotter_dir =
      get_label_info("$dart_snapshotter_rule", "root_out_dir")
  dart_snapshotter = "$dart_snapshotter_dir/dart_snapshotter"

  action("gen_${bundle_prefix}_snapshot") {
    main_dart = invoker.main_dart

    inputs = [
      dart_snapshotter,
    ]
    outputs = [
      snapshot,
    ]

    if (defined(invoker.sources)) {
      sources = invoker.sources
    }

    script =
        rebase_path("mojo/public/tools/dart_snapshotter.py", ".", mojo_sdk_root)

    args = [
      rebase_path(dart_snapshotter),
      rebase_path(main_dart),
      "--package-root",
      rebase_path("$root_gen_dir/dart-pkg/packages"),
      "--snapshot",
      rebase_path(snapshot),
    ]

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

  action("gen_${bundle_prefix}_bundle") {
    sources = [
      rebase_path("mojo/public/tools/dartx.py", ".", mojo_sdk_root),
      snapshot,
    ]

    outputs = [
      bundle,
    ]

    script = rebase_path("mojo/public/tools/dartx.py", ".", mojo_sdk_root)
    args = [
      "--snapshot",
      rebase_path(snapshot),
      "--output",
      rebase_path(bundle),
    ]

    deps = [
      ":gen_${bundle_prefix}_snapshot",
    ]
  }

  group(target_name) {
    public_deps = [
      ":gen_${bundle_prefix}_bundle",
    ]
  }
}

template("dartx_application") {
  dartx_name = "${target_name}_dartx"

  dartx(dartx_name) {
    main_dart = invoker.main_dart
    if (defined(invoker.sources)) {
      sources = invoker.sources
    }
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }

  if (defined(invoker.output_name)) {
    mojo_output = "$root_out_dir/" + invoker.output_name + ".mojo"
  } else {
    mojo_output = "$root_out_dir/" + target_name + ".mojo"
  }

  action(target_name) {
    script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_sdk_root)

    input = "$target_gen_dir/${dartx_name}.dartx"
    inputs = [
      input,
    ]

    output = mojo_output
    outputs = [
      output,
    ]

    deps = [
      ":$dartx_name",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    line = "#!mojo mojo:dart_content_handler"
    if (is_debug || (defined(invoker.strict) && invoker.strict == true)) {
      line = "#!mojo mojo:dart_content_handler?strict=true"
    }

    rebase_input = rebase_path(input, root_build_dir)
    rebase_output = rebase_path(output, root_build_dir)
    args = [
      "--input=$rebase_input",
      "--output=$rebase_output",
      "--line=$line",
    ]
  }
}

template("dart_pkg_helper") {
  assert(defined(invoker.package_name))
  package_name = invoker.package_name
  pkg_directory = rebase_path("$root_gen_dir/dart-pkg")
  package_root = rebase_path("$root_gen_dir/dart-pkg/packages")
  stamp_file = "$root_gen_dir/dart-pkg/${package_name}.stamp"
  entries_file = "$root_gen_dir/dart-pkg/${package_name}.entries"

  assert(defined(invoker.sources) || defined(invoker.apps) ||
         defined(invoker.libs) || defined(invoker.pkg_dir))

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

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

    list_mojoms_script =
        rebase_path("mojo/public/tools/dart_list_mojoms.py", ".", mojo_sdk_root)
    mojom_sources = []
    foreach(d, deps) {
      root_prefix = rebase_path(".", "", mojo_sdk_root)
      source_directory = rebase_path(get_label_info(d, "dir"))
      mojom_sources += exec_script(list_mojoms_script,
                                   [
                                     source_directory,
                                     root_prefix,
                                   ],
                                   "list lines")
    }

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

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

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

    script = rebase_path("mojo/public/tools/dart_pkg.py", ".", mojo_sdk_root)

    entrypoints = []
    if (defined(invoker.apps)) {
      foreach(app, invoker.apps) {
        entrypoints += [ app[1] ]
      }
    }
    if (defined(invoker.libs)) {
      entrypoints += invoker.libs
    }

    sources = entrypoints
    extra_flags = []
    if (defined(invoker.sources)) {
      sources += invoker.sources
    } else if (defined(invoker.pkg_dir)) {
      list_script = rebase_path("mojo/public/tools/ls.py", ".", mojo_sdk_root)
      extra_flags += [ "--read_only" ]
      ls_sources = exec_script(list_script,
                               [
                                 "--target-directory",
                                 rebase_path(invoker.pkg_dir),
                               ],
                               "list lines")
      sources += ls_sources
    }

    # We have to use foreach to set up outputs instead of rebase_path because
    # GN doesn't like assignments to outputs that aren't obviously under
    # $root_gen_dir somewhere.
    outputs = [
      "$root_gen_dir/dart-pkg/${package_name}",
      "$root_gen_dir/dart-pkg/packages/${package_name}",
      stamp_file,
    ]

    inputs = [
               list_mojoms_script,
               script,
             ] + rebase_path(sources)

    args = [
             "--package-name",
             package_name,
             "--dart-sdk",
             rebase_path(dart_sdk_root),
             "--gen-directory",
             rebase_path("$root_gen_dir/dart-gen"),
             "--pkg-directory",
             pkg_directory,
             "--package-root",
             package_root,
             "--stamp-file",
             rebase_path(stamp_file),
             "--entries-file",
             rebase_path(entries_file),
             "--package-sources",
           ] + rebase_path(sources) + [ "--package-entrypoints" ] +
           rebase_path(entrypoints) + [ "--mojom-sources" ] +
           rebase_path(mojom_sources, "", mojo_sdk_root) +
           [ "--sdk-ext-directories" ] + rebase_path(sdk_ext_directory) +
           [ "--sdk-ext-files" ] + rebase_path(sdk_ext_files) +
           [ "--sdk-ext-mappings" ] + sdk_ext_mappings + extra_flags
  }
}

# This is the entrypoint for organizing Dart code for Mojo.
#
# There should be a one to one mapping between dart_pkg rules and pubspec.yamls.
#
# This build rule will result in a package under $root_gen_dir/dart-pkg/
#
# The name of the package is taken from the 'pubspec.yaml' file.
#
# For each app in |apps|, it makes a .mojo Mojo application using the dartx
# format as well as an assemblage of the app under $root_gen_dir/dart-pkg for
# use in local development.
#
# For each library in |libs|, it invokes the Dart analyzer on that library. The
# build will fail if the library is not analyzer clean.
#
# All other sources go in |sources|. This should at least contain the
# 'pubspec.yaml' file.
#
# Even if a package will not be uploaded to pub, an attempt should be made not
# to conflict with the names of existing pub packages, for example by using the
# prefix 'mojo_dart_'.
#
#   sources
#       List of sources to include in the package. This should at least contain
#       the pubspec.yaml for the package.
#
#   apps (optional)
#       List of pairs. [mojo_app_name, entrypoint.dart]. Each entrypoint
#       script must contain a main() function. A .mojo Mojo application will be
#       generated for each application.
#
#   libs (optional)
#       List of library entrypoints to pass to the analyzer. If none are
#       defined, the analyzer is not run.
#
#   strict (optional)
#       If |apps| are specified, |strict| can be set to true to
#       instruct the content handler to run the apps in Dart VM's strict
#       compilation mode (with assertions and type-checks, etc.).
#
#   deps (optional)
#       List of other dart_pkg targets for Dart packages imported by this
#       dart_pkg, as well as the mojom targets needed by this dart_pkg.
#
#   pkg_dir (optional)
#       Directory containing the package sources. This overrides sources and
#       entrypoints. The analyzer will not be run.
#
#   datadeps (optional)
#
#   sdk_ext_directory (optional)
#       Directory containing sdk-ext .dart sources.
#
#   sdk_ext_files (optional)
#       List of sources to include in sdk-ext.
#
#   sdk_ext_mappings (optional)
#       Mappings for dart libraries that are part of of sdk_ext.
template("dart_pkg") {
  if (defined(invoker.pkg_dir)) {
    pubspec_yaml_path = rebase_path("pubspec.yaml", "", invoker.pkg_dir)
  } else {
    pubspec_yaml_path = rebase_path("pubspec.yaml")
  }
  dart_package_name_script =
      rebase_path("mojo/public/tools/dart_package_name.py", ".", mojo_sdk_root)
  dart_package_name = exec_script(dart_package_name_script,
                                  [
                                    "--pubspec",
                                    pubspec_yaml_path,
                                  ],
                                  "trim string",
                                  [ pubspec_yaml_path ])

  dart_pkg_target_name = "${target_name}_pkg_helper"
  dart_pkg_helper(dart_pkg_target_name) {
    package_name = dart_package_name
    if (defined(invoker.sources)) {
      sources = invoker.sources
    }
    if (defined(invoker.apps)) {
      apps = invoker.apps
    }
    if (defined(invoker.libs)) {
      libs = invoker.libs
    }
    if (defined(invoker.pkg_dir)) {
      pkg_dir = invoker.pkg_dir
    }
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }
    if (defined(invoker.sdk_ext_directory)) {
      sdk_ext_directory = invoker.sdk_ext_directory
    }
    if (defined(invoker.sdk_ext_files)) {
      sdk_ext_files = invoker.sdk_ext_files
    }
    if (defined(invoker.sdk_ext_mappings)) {
      sdk_ext_mappings = invoker.sdk_ext_mappings
    }
  }

  if (defined(invoker.apps)) {
    pkg_helper_output_dir = "$root_gen_dir/dart-pkg/${dart_package_name}"
    foreach(app, invoker.apps) {
      app_name = app[0]
      app_entrypoint = app[1]
      dartx_output_name = app_name
      dartx_application("${app_name}_dart_app") {
        output_name = dartx_output_name
        main_dart = rebase_path(app_entrypoint, "", pkg_helper_output_dir)
        sources = [
          "$root_gen_dir/dart-pkg/${dart_package_name}.stamp",
        ]
        deps = [
          ":$dart_pkg_target_name",
        ]
        deps += invoker.deps
        if (defined(invoker.strict)) {
          strict = invoker.strict
        }
      }
    }
  }

  group(target_name) {
    deps = [
      ":$dart_pkg_target_name",
    ]
    if (defined(invoker.apps)) {
      foreach(app, invoker.apps) {
        app_name = app[0]
        dartx_target_name = "${app_name}_dart_app"
        deps += [ ":$dartx_target_name" ]
      }
    }
  }
}

# Used to create dart_pkgs from a directory populated by fetch_dart_packages.py
#
# This build rule will result in a many packages under $root_gen_dir/dart-pkg/.
#
#   base_dir (optional)
#       Directory populated by fetch_dart_packages.py. Defaults to BUILD.gn
#       directory.
template("dart_packages") {
  base_dir = "."
  if (defined(invoker.base_dir)) {
    base_dir = invoker.base_dir
  }

  # Determine list of packages.
  list_script = rebase_path("mojo/public/dart/tools/fetch_dart_packages.py",
                            ".",
                            mojo_sdk_root)
  packages = exec_script(list_script,
                         [
                           "--directory",
                           rebase_path(base_dir),
                           "--list",
                         ],
                         "list lines",
                         [
                           rebase_path("pubspec.yaml"),
                           rebase_path("pubspec.lock"),
                         ])

  # Generate dart_pkg for each package.
  foreach(package_dir, packages) {
    dart_pkg("$package_dir") {
      pkg_dir = rebase_path("$package_dir")
    }
  }

  # Generate target group.
  group(target_name) {
    deps = []
    foreach(package_dir, packages) {
      deps += [ ":$package_dir" ]
    }
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}
