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 58e38d48eac29a9961d840f6839d36b6b3d53ccd..22fc38eaa50a343bba9d2c2abbc608742cf23157 100644 |
--- a/services/service_manager/public/service_manifest.gni |
+++ b/services/service_manager/public/service_manifest.gni |
@@ -2,6 +2,7 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# 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. |
@@ -104,6 +105,10 @@ template("service_manifest") { |
"--output=$rebase_output", |
] |
+ if (is_debug || dcheck_always_on) { |
+ args += [ "--pretty" ] |
+ } |
+ |
if (defined(invoker.overlays)) { |
args += [ "--overlays" ] |
foreach(overlay_path, invoker.overlays) { |
@@ -112,6 +117,7 @@ template("service_manifest") { |
} |
if (defined(invoker.packaged_services)) { |
+ args += [ "--packaged-services" ] |
foreach(name, invoker.packaged_services) { |
input = "$root_out_dir/$packages_directory/$name/manifest.json" |
inputs += [ input ] |
@@ -131,17 +137,134 @@ template("service_manifest") { |
all_deps += invoker.deps |
} |
- group("${target_name}__is_service_manifest") { |
+ 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.") |
+ } |
+ if (defined(invoker.type)) { |
+ assert(invoker.type == "mojo" || invoker.type == "exe", |
+ "\"type\" must be one of \"mojo\" or \"exe\".") |
+ } |
+ |
+ action(target_name) { |
+ script = |
+ "//services/service_manager/public/tools/manifest/manifest_collator.py" |
+ |
+ inputs = [ |
+ 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(invoker.source, root_build_dir) |
+ rebase_output = rebase_path(output, root_build_dir) |
+ |
+ args = [ |
+ "--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 |
+ data_deps += invoker.deps |
+ } |
+ } |
+ |
+ group("${target_name}__is_service_manifest_or_overlay") { |
} |
# Explicitly ensure that all dependencies are service_manifest |
- # targets themselves. |
+ # 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(${toolchain})" ] |
+ deps += [ "${name}__is_service_manifest_or_overlay(${toolchain})" ] |
} |
} |
} |