Index: services/service_manager/public/service_manifest.gni |
diff --git a/services/service_manager/public/service_manifest.gni b/services/service_manager/public/service_manifest.gni |
index 96eb289959130eb242ded7ec67186a07ef2f42c0..70a8d50bccbd1a9621bf579c77a804d9a6982f89 100644 |
--- a/services/service_manager/public/service_manifest.gni |
+++ b/services/service_manager/public/service_manifest.gni |
@@ -3,91 +3,202 @@ |
# found in the LICENSE file. |
import("//build/config/dcheck_always_on.gni") |
+import("//services/service_manager/public/constants.gni") |
# Used to produce a Service Manifest for a Service. |
# |
-# Service manifests may be subsequently aggregated into one or more catalog |
-# manifests (see //services/catalog/public/tools/catalog.gni). A catalog |
-# manifest provides the Service Manager at runtime with a static service layout |
-# configuration to dictate which services are supported by the runtime |
-# environment as well as how individual services may be launched and |
-# interconnected. |
-# |
-# Note that this target may be used to produce partial manifests, and partial |
-# manifests may be aggregated by using one service_manifest target as the |
-# |source_manifest| of another (see below.) |
-# |
# Parameters: |
# |
-# source (optional**) |
-# The manifest template for this service. Must be the name of a valid JSON |
-# file. |
-# |
-# source_manifest (optional**) |
-# The manifest template for this service. Must be the name of another |
-# service_manifest target. |
-# |
-# ** NOTE: Either |source| OR |source_manifest| MUST be specified. |
-# |
-# name (optional) |
-# The name of the service whose manifest is to be generated. A script |
-# validates that the value of this parameter matches the name set in the |
-# source manifest and raises an error if it does not match. |
+# source |
+# The manifest file template for this service, must be valid JSON with |
+# a valid 'url' key matching name. |
# |
# overlays (optional) |
-# A list of other manifest targets whose outputs should be overlayed onto |
-# the source manifest before emitting the final output. Overlays are |
-# applied in-order as the last step of output generation, after any |
-# |packaged_services| manifests are embedded. |
+# A list of partial manifests to overlay onto the source manifest before |
+# emitting the final output. Overlays are applied as the last step, after |
+# any packaged manifests are embedded. |
+# |
+# name |
+# The host portion of the mojo: URL of the service. A script validates |
+# that the value of this parameter matches the host name portion of the |
+# 'url' property set in the manifest and throws a ValueError if they do |
+# not. |
+# |
+# output_name (optional) |
+# The name of the package to output. The default value is copied from |
+# |name|. Note that this has no effect on the contents of the manifest, |
+# but only determines the output subdirectory within ${out}/Packages. |
+# |
+# deps (optional) |
+# An array of dependent instances of this template. This template enforces |
+# that dependencies can only be instances of this template. |
# |
# packaged_services (optional) |
-# A list of other manifest targets whose outputs should be packaged |
-# within this output manifest, specifically within a toplevel "services" |
-# list. |
+# An array of names of the dependent services. |
# |
# Outputs: |
# |
-# An instantiation of this template produces a meta manifest from the source |
-# template and the output manifests of all its |overlay| and |
-# |packaged_services|dependencies. The output file is always |
-# "$target_gen_dir/${target_name}.json". |
+# An instantiation of this template produces in |
+# $outdir/<name>/manifest.json |
+# a meta manifest from the source template and the output manifest of all |
+# dependent children. |
# |
template("service_manifest") { |
- assert( |
- defined(invoker.source) || defined(invoker.source_manifest), |
- "\"source\" or \"source_manifest\" must be defined for the $target_name target") |
- assert( |
- !defined(invoker.source) || !defined(invoker.source_manifest), |
- "Only one of \"source\" or \"source_manifest\" must be defined for the $target_name target") |
+ assert(defined(invoker.source), |
+ "\"source\" must be defined for the $target_name template") |
+ assert(defined(invoker.name), |
+ "\"name\" must be defined for the $target_name template") |
+ if (defined(invoker.deps)) { |
+ assert(defined(invoker.packaged_services) || defined(invoker.overlays), |
+ "\"deps\" implies that you also want \"packaged_services\" and/or" + |
+ "\"overlays\", but you have neither.") |
+ } |
+ if (defined(invoker.packaged_services)) { |
+ assert(defined(invoker.deps), |
+ "\"deps\" building the dependent packaged services must be " + |
+ "provided.") |
+ } |
action(target_name) { |
script = |
"//services/service_manager/public/tools/manifest/manifest_collator.py" |
- deps = [] |
+ name = invoker.name |
+ inputs = [ |
+ invoker.source, |
+ ] |
+ if (defined(invoker.overlays)) { |
+ inputs += invoker.overlays |
+ } |
+ |
+ if (defined(invoker.output_name)) { |
+ output = "$root_out_dir/$packages_directory/${invoker.output_name}/manifest.json" |
+ } else { |
+ output = "$root_out_dir/$packages_directory/$name/manifest.json" |
+ } |
+ outputs = [ |
+ output, |
+ ] |
+ |
+ rebase_parent = rebase_path(invoker.source, root_build_dir) |
+ rebase_output = rebase_path(output, root_build_dir) |
+ |
+ args = [ |
+ "--name=$name", |
+ "--parent=$rebase_parent", |
+ "--output=$rebase_output", |
+ ] |
+ |
+ if (is_debug || dcheck_always_on) { |
+ args += [ "--pretty" ] |
+ } |
+ |
+ if (defined(invoker.overlays)) { |
+ args += [ "--overlays" ] |
+ foreach(overlay_path, invoker.overlays) { |
+ args += [ rebase_path(overlay_path, root_build_dir) ] |
+ } |
+ } |
+ |
+ if (defined(invoker.packaged_services)) { |
+ args += [ "--packaged-services" ] |
+ foreach(name, invoker.packaged_services) { |
+ input = "$root_out_dir/$packages_directory/$name/manifest.json" |
+ inputs += [ input ] |
+ args += [ rebase_path(input, root_build_dir) ] |
+ } |
+ } |
+ deps = [] |
+ data_deps = [] |
if (defined(invoker.deps)) { |
deps += invoker.deps |
- } |
- |
- if (defined(invoker.source)) { |
- source = invoker.source |
- } else { |
- source_target_dir = |
- get_label_info(invoker.source_manifest, "target_gen_dir") |
- source_target_name = get_label_info(invoker.source_manifest, "name") |
- source = "$source_target_dir/${source_target_name}.json" |
- deps += [ invoker.source_manifest ] |
- } |
+ data_deps += invoker.deps |
+ } |
+ } |
+ |
+ all_deps = [] |
+ if (defined(invoker.deps)) { |
+ all_deps += invoker.deps |
+ } |
+ |
+ group("${target_name}__is_service_manifest_or_overlay") { |
+ } |
+ |
+ # Explicitly ensure that all dependencies are service_manifest |
+ # or service_manifest_overlay targets themselves. |
+ group("${target_name}__check_deps_are_all_service_manifest") { |
+ deps = [] |
+ foreach(d, all_deps) { |
+ name = get_label_info(d, "label_no_toolchain") |
+ toolchain = get_label_info(d, "toolchain") |
+ deps += [ "${name}__is_service_manifest_or_overlay(${toolchain})" ] |
+ } |
+ } |
+} |
+ |
+# A simple derivative of the service_manifest template above. This allows for |
+# embedding of packaged services into a manifest overlay. |
+# |
+# Parameters: |
+# |
+# source |
+# The manifest overlay file to procss. |
+# |
+# overlays (optional) |
+# A list of partial manifests to overlay onto the source manifest before |
+# emitting the final output. Overlays are applied as the last step, after |
+# any packaged manifests are embedded. |
+# |
+# output_name (optional) |
+# The output name of the manifest. Defaults to the target name. |
+# |
+# deps (optional) |
+# An array of the service_manifest targets this overlay depends on. |
+# |
+# packaged_services (optional) |
+# An array of names of the services packaged into this overlay. |
+# |
+# Outputs: |
+# |
+# An instantiation of this template produces in |
+# ${root_gen_dir}/${output_name}.json |
+# |
+template("service_manifest_overlay") { |
+ assert(defined(invoker.source), |
+ "\"source\" must be defined for the $target_name template") |
+ if (defined(invoker.deps)) { |
+ assert(defined(invoker.packaged_services) || defined(invoker.overlays), |
+ "\"deps\" implies that you also want \"packaged_services\" and/or" + |
+ "\"overlays\", but you have neither.") |
+ } |
+ if (defined(invoker.packaged_services)) { |
+ assert(defined(invoker.deps), |
+ "\"deps\" building the dependent packaged services must be " + |
+ "provided.") |
+ } |
+ |
+ action(target_name) { |
+ script = |
+ "//services/service_manager/public/tools/manifest/manifest_collator.py" |
+ |
inputs = [ |
- source, |
- ] |
- |
- output = "$target_gen_dir/${target_name}.json" |
+ invoker.source, |
+ ] |
+ if (defined(invoker.overlays)) { |
+ inputs += invoker.overlays |
+ } |
+ |
+ output_name = target_name |
+ if (defined(invoker.output_name)) { |
+ output_name = invoker.output_name |
+ } |
+ output = "${root_gen_dir}/${output_name}.json" |
+ |
outputs = [ |
output, |
] |
- rebase_parent = rebase_path(source, root_build_dir) |
+ rebase_parent = rebase_path(invoker.source, root_build_dir) |
rebase_output = rebase_path(output, root_build_dir) |
args = [ |
@@ -95,56 +206,45 @@ |
"--output=$rebase_output", |
] |
- if (defined(invoker.name)) { |
- args += [ |
- "--name", |
- invoker.name, |
- ] |
- } |
- |
if (is_debug || dcheck_always_on) { |
args += [ "--pretty" ] |
} |
if (defined(invoker.overlays)) { |
args += [ "--overlays" ] |
- foreach(manifest_target, invoker.overlays) { |
- manifest_target_dir = get_label_info(manifest_target, "target_gen_dir") |
- manifest_target_name = get_label_info(manifest_target, "name") |
- manifest_filename = "$manifest_target_dir/${manifest_target_name}.json" |
- |
- inputs += [ manifest_filename ] |
- deps += [ manifest_target ] |
- args += [ rebase_path(manifest_filename, root_build_dir) ] |
- |
- # Ensure that each entry does in fact reference a manifest rule. |
- label_no_toolchain = |
- get_label_info(manifest_target, "label_no_toolchain") |
- toolchain = get_label_info(manifest_target, "toolchain") |
- deps += [ "${label_no_toolchain}__is_service_manifest(${toolchain})" ] |
+ foreach(overlay_path, invoker.overlays) { |
+ args += [ rebase_path(overlay_path, root_build_dir) ] |
} |
} |
if (defined(invoker.packaged_services)) { |
args += [ "--packaged-services" ] |
- foreach(manifest_target, invoker.packaged_services) { |
- manifest_target_dir = get_label_info(manifest_target, "target_gen_dir") |
- manifest_target_name = get_label_info(manifest_target, "name") |
- manifest_filename = "$manifest_target_dir/${manifest_target_name}.json" |
- |
- inputs += [ manifest_filename ] |
- deps += [ manifest_target ] |
- args += [ rebase_path(manifest_filename, root_build_dir) ] |
- |
- # Ensure that each entry does in fact reference a manifest rule. |
- label_no_toolchain = |
- get_label_info(manifest_target, "label_no_toolchain") |
- toolchain = get_label_info(manifest_target, "toolchain") |
- deps += [ "${label_no_toolchain}__is_service_manifest(${toolchain})" ] |
- } |
- } |
- } |
- |
- group("${target_name}__is_service_manifest") { |
+ foreach(name, invoker.packaged_services) { |
+ input = "$root_out_dir/$packages_directory/$name/manifest.json" |
+ inputs += [ input ] |
+ args += [ rebase_path(input, root_build_dir) ] |
+ } |
+ } |
+ |
+ deps = [] |
+ data_deps = [] |
+ if (defined(invoker.deps)) { |
+ deps += invoker.deps |
+ data_deps += invoker.deps |
+ } |
+ } |
+ |
+ group("${target_name}__is_service_manifest_or_overlay") { |
+ } |
+ |
+ # Explicitly ensure that all dependencies are service_manifest |
+ # or service_manifest_overlay targets themselves. |
+ group("${target_name}__check_deps_are_all_service_manifest") { |
+ deps = [] |
+ foreach(d, all_deps) { |
+ name = get_label_info(d, "label_no_toolchain") |
+ toolchain = get_label_info(d, "toolchain") |
+ deps += [ "${name}__is_service_manifest_or_overlay(${toolchain})" ] |
+ } |
} |
} |