blob: 33fd505834716d7812f51f33398e4a9243b494dd [file] [log] [blame]
# Copyright 2016 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.
import("//build/config/dcheck_always_on.gni")
# Generates a static catalog manifest to be loaded at runtime. This manifest
# contains the union of all individual service manifests specified by the
# template parameters.
#
# The output of a catalog rule is always a file named:
#
# ${target_gen_dir}/${target_name}.json
#
# A Service Manager embedder uses a catalog manifest as its singular source of
# truth regarding available services in the system.
#
# Parameters:
#
# embedded_services (optional)
# A list of service manifest targets whose outputs correspond to services
# embedded by the Service Manager embedder's binary. Outputs of targets
# listed here will be embedded in the catalog within its
# "embedded_services" list.
#
# standalone_services (optional)
# A list of service manifest targets whose outputs correspond to services
# with standalone binaries which must be available to the Service Manager
# at runtime. Outputs of targets listed here will be embedded in the
# catalog within its "standalone_services" list.
#
# Typically a standalone service binary is expected to live next to
# the Service Manager embedder's binary, with the name
# "${service_name}.service", with an additional ".exe" suffix on Windows.
# Binaries following this naming scheme are typically output by "service"
# targets (see //services/service_manager/public/cpp/service.gni).
#
# executable_overrides (optional)
# A list of overrides to apply in catalog metadata for individual
# services. An override string must be of the form
#
# "<service_name>:<executable_path>"
#
# The special token @EXE_DIR may be used in |executable_path| to denote
# a path relative to the Service Manager embedder's binary, substituted
# at runtime. For example:
#
# "content_browser:@EXE_DIR/chrome"
#
# would indicate to the Service Manager embedder that the
# "content_browser" service can be started by running the "chrome"
# executable in the embedder's own directory.
#
# This overrides the default binary name expectation described in
# |standalone_services| above.
#
# catalog_deps (optional)
# A list of other catalog targets whose outputs will be included within
# this catalog. Targets in this list
#
template("catalog") {
output_filename = "$target_gen_dir/${target_name}.json"
action(target_name) {
testonly = defined(invoker.testonly) && invoker.testonly
script = "//services/catalog/public/tools/generate_manifest.py"
inputs = []
outputs = [
output_filename,
]
args = [ "--output=" + rebase_path(output_filename, root_build_dir) ]
if (is_debug || dcheck_always_on) {
args += [ "--pretty" ]
}
deps = []
if (defined(invoker.deps)) {
deps += invoker.deps
}
if (defined(invoker.embedded_services)) {
args += [ "--embedded-services" ]
foreach(manifest_target, invoker.embedded_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 service 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})" ]
}
}
if (defined(invoker.standalone_services)) {
args += [ "--standalone-services" ]
foreach(manifest_target, invoker.standalone_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 service 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})" ]
}
}
if (defined(invoker.executable_overrides)) {
args +=
[ "--override-service-executables" ] + invoker.executable_overrides
}
if (defined(invoker.catalog_deps)) {
args += [ "--include-catalogs" ]
foreach(catalog_target, invoker.catalog_deps) {
catalog_target_dir = get_label_info(catalog_target, "target_gen_dir")
catalog_target_name = get_label_info(catalog_target, "name")
catalog_filename = "$catalog_target_dir/${catalog_target_name}.json"
inputs += [ "$catalog_filename" ]
deps += [ catalog_target ]
args += [ rebase_path(catalog_filename, root_build_dir) ]
}
}
}
}
# Generates a source_set target which defines a single string contstant
# containing the contents of a compiled catalog manifest.
#
# Parameters:
#
# catalog
# The catalog target whose output should be stringified.
#
# generated_function_name
# The fully qualified symbol name of the C++ string constant to define in
# the generate source_set.
#
template("catalog_cpp_source") {
assert(defined(invoker.catalog), "catalog is required")
assert(defined(invoker.generated_function_name),
"generated_function_name is required")
catalog_target = invoker.catalog
catalog_target_dir = get_label_info(catalog_target, "target_gen_dir")
catalog_target_name = get_label_info(catalog_target, "name")
catalog_filename = "$catalog_target_dir/${catalog_target_name}.json"
generator_target_name = "${target_name}__generator"
generated_filename_base = "${target_gen_dir}/${target_name}"
action(generator_target_name) {
testonly = defined(invoker.testonly) && invoker.testonly
script = "//services/catalog/public/tools/sourcify_manifest.py"
inputs = [
catalog_filename,
"//services/catalog/public/tools/catalog.cc.tmpl",
"//services/catalog/public/tools/catalog.h.tmpl",
]
outputs = [
"${generated_filename_base}.cc",
"${generated_filename_base}.h",
]
args = [
"--input=" + rebase_path(catalog_filename, root_build_dir),
"--output-filename-base=" +
rebase_path(generated_filename_base, root_build_dir),
"--output-function-name=" + invoker.generated_function_name,
"--module-path=" + rebase_path(generated_filename_base, root_gen_dir),
]
if (is_debug || dcheck_always_on) {
args += [ "--pretty" ]
}
deps = [
catalog_target,
]
}
source_set(target_name) {
testonly = defined(invoker.testonly) && invoker.testonly
sources = get_target_outputs(":$generator_target_name")
deps = [
":$generator_target_name",
"//base",
]
}
}