Home | History | Annotate | Download | only in public
      1 # Copyright 2016 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import("//mojo/public/mojo_constants.gni")
      6 
      7 # Used to produce a Mojo Application Manifest for an application.
      8 #
      9 # Parameters:
     10 #
     11 #   source
     12 #       The manifest file template for this application, must be valid JSON with
     13 #       a valid 'url' key matching application_name.
     14 #
     15 #   base_manifest (optional)
     16 #       A manifest file template to use as a base for |source|. Any properties
     17 #       defined in |source| will overwrite or be merged with properties defined
     18 #       in |base_manifest|.
     19 #
     20 #   application_name
     21 #       The host portion of the mojo: URL of the application. The script
     22 #       validates that the value of this parameter matches the host name portion
     23 #       of the 'url' property set in the manifest and throws a ValueError if
     24 #       they do not.
     25 #
     26 #   base_deps (optional)
     27 #       Dependencies required to generate |base_manifest| if applicable.
     28 #
     29 #   deps (optional)
     30 #       An array of dependent instances of this template. This template enforces
     31 #       that dependencies can only be instances of this template.
     32 #
     33 #   packaged_applications (optional)
     34 #       An array of application_names of the dependent applications.
     35 #
     36 #   type (default is mojo)
     37 #       Possible values are 'mojo' and 'exe'. Default is 'mojo'.
     38 #
     39 # Outputs:
     40 #
     41 #   An instantiation of this template produces in
     42 #       $outdir/<application_name>/manifest.json
     43 #   a meta manifest from the source template and the output manifest of all
     44 #   dependent children.
     45 #
     46 template("mojo_application_manifest") {
     47   assert(defined(invoker.source),
     48          "\"source\" must be defined for the $target_name template")
     49   assert(defined(invoker.application_name),
     50          "\"application_name\" must be defined for the $target_name template")
     51   if (defined(invoker.deps)) {
     52     assert(defined(invoker.packaged_applications),
     53            "\"packaged_applications\" listing the directory containing the " +
     54                "manifest.json of dependent applications must be provided.")
     55   }
     56   if (defined(invoker.packaged_applications)) {
     57     assert(defined(invoker.deps),
     58            "\"deps\" building the dependent packaged applications must be " +
     59                "provided.")
     60   }
     61   if (defined(invoker.type)) {
     62     assert(invoker.type == "mojo" || invoker.type == "exe",
     63            "\"type\" must be one of \"mojo\" or \"exe\".")
     64   }
     65 
     66   action(target_name) {
     67     script = "//mojo/public/tools/manifest/manifest_collator.py"
     68 
     69     type = "mojo"
     70     if (defined(invoker.type)) {
     71       type = invoker.type
     72     }
     73 
     74     application_name = invoker.application_name
     75     inputs = [
     76       invoker.source,
     77     ]
     78 
     79     if (type == "mojo") {
     80       output = "$root_out_dir/$mojo_application_subdir/$application_name/manifest.json"
     81     } else {
     82       output = "$root_out_dir/${application_name}_manifest.json"
     83     }
     84     outputs = [
     85       output,
     86     ]
     87 
     88     rebase_parent = rebase_path(invoker.source, root_build_dir)
     89     rebase_output = rebase_path(output, root_build_dir)
     90 
     91     args = [
     92       "--application-name=$application_name",
     93       "--parent=$rebase_parent",
     94       "--output=$rebase_output",
     95     ]
     96 
     97     if (defined(invoker.base_manifest)) {
     98       rebase_base = rebase_path(invoker.base_manifest, root_build_dir)
     99       args += [ "--base-manifest=$rebase_base" ]
    100     }
    101 
    102     if (defined(invoker.packaged_applications)) {
    103       foreach(application_name, invoker.packaged_applications) {
    104         input = "$root_out_dir/$mojo_application_subdir/$application_name/manifest.json"
    105         inputs += [ input ]
    106         args += [ rebase_path(input, root_build_dir) ]
    107       }
    108     }
    109     deps = []
    110     data_deps = []
    111     if (defined(invoker.deps)) {
    112       deps += invoker.deps
    113       data_deps += invoker.deps
    114     }
    115     if (defined(invoker.base_deps)) {
    116       deps += invoker.base_deps
    117       data_deps += invoker.base_deps
    118     }
    119   }
    120 
    121   all_deps = []
    122   if (defined(invoker.deps)) {
    123     all_deps += invoker.deps
    124   }
    125 
    126   group("${target_name}__is_mojo_application_manifest") {
    127   }
    128 
    129   # Explicitly ensure that all dependencies are mojo_application_manifest
    130   # targets themselves.
    131   group("${target_name}__check_deps_are_all_mojo_application_manifest") {
    132     deps = []
    133     foreach(d, all_deps) {
    134       name = get_label_info(d, "label_no_toolchain")
    135       toolchain = get_label_info(d, "toolchain")
    136       deps += [ "${name}__is_mojo_application_manifest(${toolchain})" ]
    137     }
    138   }
    139 }
    140