# Copyright 2017 The Fuchsia 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("//build/compiled_action.gni")
import("//build/images/manifest.gni")
import("//build/json/validate_json.gni")
import("//build/gn/packages.gni")
import("//build/testing/test_spec.gni")

declare_args() {
  # The package key to use for signing Fuchsia packages made by the
  # `package()` template (and the `system_image` packge).  If this
  # doesn't exist yet when it's needed, it will be generated.  New
  # keys can be generated with the `pm -k FILE genkey` host command.
  system_package_key = "//build/development.key"
}

# Generate a signed, sealed package file from a manifest.
#
# Parameters
#
#   manifest (required)
#     [label] A generate_manifest() target defined earlier in the same file.
#     This provides the contents for the package.
#
#   deps (optional)
#   test (optional)
#   visibility (optional)
#     Same as for any GN `action()` target.

template("pm_build_package") {
  compiled_action(target_name) {
    tool = "//garnet/go/src/pm:pm_bin"
    tool_output_name = "pm"

    deps = []
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])
    pkg_manifest_outputs = get_target_outputs(invoker.manifest)
    pkg_manifest_file = pkg_manifest_outputs[0]
    pkg_out_dir = "$target_out_dir/$target_name"

    deps += [
      "//build/images:system_package_key_check",
      invoker.manifest,
    ]

    inputs = [
      pkg_manifest_file,
      system_package_key,
    ]

    depfile = "$pkg_out_dir/meta.far.d"

    outputs = [
      # produced by seal, must be listed first because of depfile rules.
      "$pkg_out_dir/meta.far",

      # update
      "$pkg_out_dir/meta/contents",

      # sign
      "$pkg_out_dir/meta/pubkey",
      "$pkg_out_dir/meta/signature",

      # seal
      "$pkg_out_dir/meta.far.merkle",

      # package blob manifest
      "$pkg_out_dir/blobs.json",
    ]

    args = [
      "-k",
      rebase_path(system_package_key, root_build_dir),
      "-o",
      rebase_path(pkg_out_dir, root_build_dir),
      "-m",
      rebase_path(pkg_manifest_file, root_build_dir),
      "build",
      "-depfile",
      "-blobsfile",
    ]
  }
}

# Defines a package
#
# The package template is used to define a unit of related code and data.
# A package always has a name (defaulting to the target name) and lists of
# scopes describing the components of the package.
#
# Parameters
#
#   deprecated_system_image (optional, default `false`)
#     [bool] If true, the package is stored in the /system filesystem image
#     rather than in a Fuchsia package.
#
#     TODO(PKG-46): Will be removed entirely eventually.
#
#     If this package uses the `drivers` parameter,
#     `deprecated_system_image` must be set to `true` because we are not
#     yet sophisticated enough to load drivers out of packages.
#
#   meta (optional)
#     [list of scopes] Defines the metadata entries in the package. A metadata
#     entry is typically a source file and is placed in the `meta/` directory of
#     the assembled package.
#
#     Requires `deprecated_system_image` to be `false`.
#
#     Entries in a scope in the meta list:
#
#       path (required)
#         [path] Location of entry in source or build directory. If the
#         resource is checked in, this will typically be specified as a
#         path relative to the BUILD.gn file containing the `package()`
#         target. If the resource is generated, this will typically be
#         specified relative to `$target_gen_dir`.
#
#       dest (required)
#         [path] Location the resource will be placed within `meta/`.
#
#   binary (optional)
#     [string] The path to the the primary binary for the package, relative to
#     `$root_out_dir`. The binary will be placed in the assembled package at
#     `bin/app` and will be executed by default when running the package.
#
#     Requires `deprecated_system_image` to be `false`.
#
#   binaries (optional)
#     [list of scopes] Defines the binaries in the package. A binary is
#     typically produced by the build system and is placed in the `bin/`
#     directory of the assembled package.
#
#     Entries in a scope in the binaries list:
#
#       name (required)
#         [string] Name of the binary.
#
#       source (optional)
#         [path] Location of the binary in the build directory if it is not
#         at `$root_out_dir/$name`.
#
#       dest (optional)
#         [path] Location the binary will be placed within `bin/`.
#
#   tests (optional)
#     [list of scopes] Defines the test binaries in the package. A test is
#     typically produced by the build system and is placed in the `test/`
#     directory of the assembled package.
#
#     Entries in a scope in the tests list:
#
#       name (required)
#         [string] Name of the test.
#
#       dest (optional)
#         [path] Location the binary will be placed within `test/`.
#
#       environments (optional):
#         [list of scopes] Target device environments in which the test will
#         run. The scopes must mirror the Environment go struct found in the
#         testexec package in https://fuchsia.googlesource.com/infra/infra. If
#         not present, the default QEMU environment will be used.
#
#       disabled (optional)
#         [bool] Whether to disable the test on continuous integration
#         jobs. This can be used when a test is temporarily broken, or if
#         it is too flaky or slow for CI. The test will also be skipped by
#         the `runtests` command.
#
#   drivers (optional)
#     [list of scopes] Defines the drivers in the package. A driver is
#     typically produced by the build system and is placed in the `driver/`
#     directory of the assembled package.
#
#     Requires `deprecated_system_image` to be `true`.
#
#     Entries in a scope in the drivers list:
#
#       name (required)
#         [string] Name of the driver.
#
#   loadable_modules (optional)
#     [list of scopes] Defines the loadable modules in the package.  These
#     are produced by `loadable_module()` GN targets, and are typically
#     placed in the `lib/` directory of the assembled packaged.
#
#     Entries in a scope in the loadable_modules list:
#
#       name (required)
#         [string] Name of the loadable_module.
#
#       dest (optional, default: "lib")
#         [string] Location the binary will be placed in the package.
#
#   libraries (optional, *DEPRECATED*)
#     [list of scopes] Defines the (shared) libraries in the package. A library
#     is placed in the `lib/` directory of the assembled package.
#
#     This is deprecated but is necessary in some `system_image` packages
#     that install libraries used by things that don't properly isolate
#     their dependencies.  Do not use it unless you are sure you have to.
#
#     Entries in a scope in the libraries list:
#
#       name (required)
#         [string] Name of the library
#
#       source (optional)
#         [path] Location of the binary in the build directory if it is not at
#         `$root_out_dir/$name`
#
#       dest (optional)
#         [path] Location the binary will be placed within `lib/`
#
#   resources (optional)
#     [list of scopes] Defines the resources in the package. A resource is a
#     data file that may be produced by the build system, checked in to a
#     source repository, or produced by another system that runs before the
#     build. Resources are placed in the `data/` directory of the assembled
#     package.
#
#     Entries in a scope in the resources list:
#
#       path (required)
#         [path] Location of resource in source or build directory. If the
#         resource is checked in, this will typically be specified as a
#         path relative to the BUILD.gn file containing the `package()`
#         target. If the resource is generated, this will typically be
#         specified relative to `$target_gen_dir`.
#
#       dest (required)
#         [path] Location the resource will be placed within `data/`.
#
#   extra (optional)
#     [list of paths] Manifest files containing extra entries, which
#     might be generated by the build.
#
#   deps (optional)
#   public_deps (optional)
#   data_deps (optional)
#   testonly (optional)
#     Usual GN meanings.
#
template("package") {
  if (current_toolchain == target_toolchain) {
    forward_variables_from(invoker, [ "testonly" ])
    pkg_target_name = target_name
    pkg = {
      package_version = "0"  # placeholder
      forward_variables_from(invoker,
                             [
                               "binaries",
                               "binary",
                               "data_deps",
                               "deprecated_system_image",
                               "deps",
                               "public_deps",
                               "drivers",
                               "extra",
                               "libraries",
                               "loadable_modules",
                               "meta",
                               "package_name",
                               "resources",
                               "visibility",
                               "tests",
                             ])
      if (!defined(binaries)) {
        binaries = []
      }
      if (!defined(deprecated_system_image)) {
        deprecated_system_image = false
      }
      if (!defined(deps)) {
        deps = []
      }
      if (!defined(data_deps)) {
        data_deps = []
      }
      if (!defined(public_deps)) {
        public_deps = []
      }
      if (!defined(extra)) {
        extra = []
      }
      if (!defined(drivers)) {
        drivers = []
      }
      if (!defined(loadable_modules)) {
        loadable_modules = []
      }
      if (!defined(libraries)) {
        libraries = []
      }
      if (!defined(meta)) {
        meta = []
      }
      if (!defined(package_name)) {
        package_name = pkg_target_name
      }
      if (!defined(resources)) {
        resources = []
      }
      if (!defined(tests)) {
        tests = []
      }
      package_set = ""
    }

    pkg_label = get_label_info(":$pkg_target_name", "label_no_toolchain")
    pkg_desc = "Package ${pkg_label} (${pkg.package_name}):"
    if (pkg.deprecated_system_image) {
      assert(pkg.meta == [],
             "$pkg_desc deprecated_system_image incompatible with meta")
      assert(!defined(pkg.binary),
             "$pkg_desc deprecated_system_image incompatible with binary")
    } else {
      assert(pkg.drivers == [],
             "$pkg_desc drivers requires deprecated_system_image")
      assert(pkg.libraries == [],
             "$pkg_desc libraries requires deprecated_system_image")
      if (defined(pkg.binary)) {
        pkg.binaries += [
          {
            name = "app"
            source = pkg.binary
          },
        ]
      }
    }

    # Validate .cmx files
    foreach(meta, pkg.meta) {
      if (get_path_info(meta.dest, "extension") == "cmx") {
        validate = "validate_" + pkg_target_name + "_" +
                   get_path_info(meta.dest, "file")
        validate_json(validate) {
          data = meta.path
          schema = "//garnet/lib/cmx/schema.json"

          # the cmx file may be generated by one of this package's dependencies,
          # but we don't know which one, so depend on all package deps here.
          deps = pkg.deps
        }
        pkg.deps += [ ":$validate" ]
      }
    }

    # Collect the package's primary manifest.  For a system_image package,
    # this is its contributions to the /system manifest.  For an isolated
    # package, this is the manifest for the package's `pkg/` filesystem.
    pkg_manifest = []
    foreach(meta, pkg.meta) {
      pkg_manifest += [
        {
          dest = "meta/${meta.dest}"
          source = rebase_path(meta.path)
        },
      ]
    }
    foreach(binary, pkg.binaries) {
      pkg_manifest += [
        {
          if (defined(binary.dest)) {
            dest = binary.dest
          } else {
            dest = binary.name
          }
          dest = "bin/${dest}"

          if (defined(binary.source)) {
            source = binary.source
          } else {
            source = binary.name
          }
          source = rebase_path(source, "", root_out_dir)
        },
      ]
    }
    foreach(test, pkg.tests) {
      is_disabled = defined(test.disabled) && test.disabled
      pkg_manifest += [
        {
          if (defined(test.dest)) {
            dest = test.dest
          } else {
            dest = test.name
          }
          if (is_disabled) {
            dest = "disabled/${dest}"
          }
          dest = "test/${dest}"
          source = rebase_path(test.name, "", root_out_dir)

          if (!is_disabled) {
            test_spec(test.name) {
              if (pkg.deprecated_system_image) {
                path = "/system/$dest"
              } else {
                path = "/pkgfs/packages/${pkg.package_name}/${pkg.package_version}/$dest"
              }

              # Encode the package name in the output directory to disambiguate
              # during post-processing - cross-referencing with packages.json -
              # whether a given test spec came from a package that was actually
              # included in the build.
              output_dir = "$target_out_dir/${pkg.package_name}"
              if (defined(test.environments)) {
                environments = test.environments
              }
            }
          }
        },
      ]
    }
    foreach(module, pkg.loadable_modules) {
      pkg_manifest += [
        {
          if (defined(module.dest)) {
            dest = module.dest
          } else {
            dest = "lib"
          }
          dest += "/${module.name}"
          source = rebase_path(module.name, "", root_out_dir)
        },
      ]
    }
    foreach(driver, pkg.drivers) {
      pkg_manifest += [
        {
          dest = "driver/${driver.name}"
          source = rebase_path(driver.name, "", root_out_dir)
        },
      ]
    }
    foreach(resource, pkg.resources) {
      pkg_manifest += [
        {
          dest = "data/${resource.dest}"
          source = rebase_path(resource.path)
        },
      ]
    }

    # TODO(mcgrathr): Remove this when we can!  Packages installing
    # libraries in the system image is all kinds of wrong.
    foreach(library, pkg.libraries) {
      pkg_manifest += [
        {
          if (defined(library.dest)) {
            dest = library.dest
          } else {
            dest = library.name
          }
          dest = "lib/${dest}"
          if (defined(library.source)) {
            source = library.source
          } else {
            # TODO(mcgrathr): This breaks when everything is a variant so
            # that only this here is using the non-variant shlib build.
            source = get_label_info(shlib_toolchain, "name")
            source += "/${library.name}"
          }
          source = rebase_path(source, "", root_out_dir)
        },
      ]
    }

    # Collect all the arguments describing input manifest files
    # and all the entries we've just synthesized in `pkg_manifest`.
    manifest_sources = pkg.extra
    manifest_args = []
    foreach(manifest_file, pkg.extra) {
      manifest_file = rebase_path(manifest_file, root_build_dir)
      manifest_args += [ "--manifest=${manifest_file}" ]
    }
    manifest_args += [ "--entry-manifest=${pkg_label}" ]
    foreach(entry, pkg_manifest) {
      manifest_sources += [ entry.source ]
      manifest_args += [ "--entry=${entry.dest}=${entry.source}" ]
    }

    # An empty package() target doesn't actually generate a package at all.
    # Conveniently, an empty system_image package has exactly that effect.
    if (manifest_sources == []) {
      pkg.deprecated_system_image = true
    }

    if (pkg.deprecated_system_image) {
      # Dummy target to deposit an empty ids.txt file for
      # //build/images:ids.txt to collect.
      action("${pkg_target_name}.manifest") {
        script = "/bin/cp"

        # Add sources and deps so that the package gets rebuilt whenever they
        # change.
        sources = manifest_sources
        data_deps = pkg.data_deps
        deps = pkg.deps
        public_deps = pkg.public_deps
        outputs = [
          "$target_out_dir/${target_name}.ids.txt",
        ]
        args = [
                 "-f",
                 "/dev/null",
               ] + rebase_path(outputs, root_build_dir)
      }
    } else {
      # Synthesize the meta/package file.
      pkg_meta_package = "${pkg_target_name}_meta_package.json"
      action(pkg_meta_package) {
        visibility = [ ":${pkg_target_name}.manifest" ]
        script = "//build/gn/write_package_json.py"
        outputs = [
          "$target_out_dir/$pkg_meta_package",
        ]
        args = [
          "--name",
          pkg.package_name,
          "--version",
          pkg.package_version,
          rebase_path(pkg_meta_package, root_build_dir, target_out_dir),
        ]
      }

      # For a real package, generate the package manifest with all its
      # dynamically linked libraries resolved.
      generate_manifest("${pkg_target_name}.manifest") {
        sources = manifest_sources + get_target_outputs(":$pkg_meta_package")
        args = manifest_args +
               [ "--entry=meta/package=" +
                 rebase_path(pkg_meta_package, "", target_out_dir) ]
        deps = pkg.deps + [ ":$pkg_meta_package" ]
        public_deps = pkg.public_deps
      }

      # Next generate a signed, sealed package file.
      pm_build_package("${pkg_target_name}.meta") {
        manifest = ":${pkg_target_name}.manifest"
      }

      # Clear it so we don't put anything into the system image.
      manifest_args = []
    }

    generate_response_file(pkg_target_name) {
      if (defined(pkg.visibility)) {
        visibility = pkg.visibility + [
                       "//build/gn:packages",
                       "//build/images:system_image.manifest",
                     ]
      }
      deps = pkg.deps + [ ":${pkg_target_name}.manifest" ]
      data_deps = pkg.data_deps
      public_deps = pkg.public_deps
      output_name = "${pkg_target_name}.system.rsp"
      response_file_contents = manifest_args
    }

    generate_response_file("${pkg_target_name}.blob.rsp") {
      if (pkg.deprecated_system_image) {
        # A system_image package has no blobs of its own.
        response_file_contents = []
      } else {
        # A real package needs blobs for all its contents and for its
        # synthesized meta.far file.
        deps = [
          ":${pkg_target_name}.manifest",
          ":${pkg_target_name}.meta",
        ]
        response_file_contents = [
          "--exclude=meta/*",
          "--manifest=" + rebase_path("${pkg_target_name}.manifest",
                                      root_build_dir,
                                      target_out_dir),
          "--reset-exclude",
          "--entry-manifest=${pkg_label}",
          "--entry=${pkg.package_name}/meta.far=" +
              rebase_path("${pkg_target_name}.meta/meta.far",
                          root_build_dir,
                          target_out_dir),
        ]
      }
    }

    # Determine why this package is being built.
    if (!pkg.deprecated_system_image) {
      foreach(name, available_packages) {
        if (name == pkg_label) {
          pkg.package_set = "available"
        }
      }
      foreach(name, preinstall_packages) {
        if (name == pkg_label) {
          pkg.package_set = "preinstall"
        }
      }
      foreach(name, monolith_packages) {
        if (name == pkg_label) {
          pkg.package_set = "monolith"
        }
      }
    }

    generate_response_file("${pkg_target_name}.system_index.rsp") {
      if (pkg.deprecated_system_image) {
        # A system_image package will be included directly in the system package.
        response_file_contents = []
      } else {
        deps = [
          ":${pkg_target_name}.meta",
        ]
        if (pkg.package_set == "") {
          package_tags = ""
        } else {
          package_tags = "#${pkg.package_set}"
        }
        response_file_contents = [
          "--entry=${pkg.package_name}/${pkg.package_version}${package_tags}=" +
              rebase_path("${pkg_target_name}.meta/blobs.json",
                          root_build_dir,
                          target_out_dir),
        ]
      }
    }

    foreach(index,
            [
              {
                name = "pkgsvr_index"
                file = "meta.far.merkle"
              },
              {
                name = "amber_index"
                file = "meta.far"
              },
            ]) {
      generate_response_file("${pkg_target_name}.${index.name}.rsp") {
        if (pkg.deprecated_system_image) {
          # A system_image package has no index entry.
          response_file_contents = []
        } else {
          # A real package needs has a pkgsvr index entry mapping its package
          # name and version to its meta.far file's merkleroot.
          # The amber index is the same, but needs the meta.far filename
          # in the build, rather than its merkleroot.
          # TODO(mcgrathr): Make amber publish use pkgsvr index directly.
          deps = [
            ":${pkg_target_name}.manifest",
            ":${pkg_target_name}.meta",
          ]
          response_file_contents = [
            "--entry-manifest=${pkg_label}",
            "--entry=${pkg.package_name}/${pkg.package_version}=" +
                rebase_path("${pkg_target_name}.meta/${index.file}",
                            root_build_dir,
                            target_out_dir),
          ]
        }
      }
    }
  } else {
    group(target_name) {
      forward_variables_from(invoker,
                             [
                               "public_deps",
                               "deps",
                               "testonly",
                             ])
    }

    # Suppress unused variable warnings.
    not_needed(invoker, "*")
  }
}
