# Copyright 2018 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Template to generate wayland protocol code with wayland-scanner.
#
# Generates C source and header files from XML manifest files that declare
# Wayland protocols.
#
# The invoker MUST define `sources` which is the list of XML files.
#
# The invoker MAY define `generator_type` which is one of: protocol-marshalling,
# protocol-server, protocol-client, all (default assumed if the parameter is not
# specified).
#
# Example:
# wayland_protocol("foo") {
# sources = [ "foo.xml", "bar.xml" ]
# generator_type = "protocol-client" # optional, "all" is the default
# }
template("wayland_protocol") {
assert(defined(invoker.sources), "Need sources for wayland protocol")
if (defined(invoker.generator_type)) {
assert(invoker.generator_type == "protocol-marshalling" ||
invoker.generator_type == "protocol-client" ||
invoker.generator_type == "protocol-server")
generator_type = invoker.generator_type
} else {
generator_type = "all"
}
# Calculate the output paths.
protocol_outputs = []
output_dirs = []
foreach(protocol, invoker.sources) {
dir = "$root_gen_dir/" + rebase_path(get_path_info(protocol, "dir"), "//")
name = get_path_info(protocol, "name")
if (generator_type == "protocol-marshalling") {
# If it's a protocol marshalling code, only private marshalling code will
# be generated.
protocol_outputs += [ "${dir}/${name}-protocol.c" ]
} else if (generator_type == "protocol-server") {
# In case of server protocol generation, only server headers are generated.
protocol_outputs += [
"${dir}/${name}-server-protocol-core.h",
"${dir}/${name}-server-protocol.h",
]
} else if (generator_type == "protocol-client") {
# In case of server protocol generation, only client headers are generated.
protocol_outputs += [
"${dir}/${name}-client-protocol-core.h",
"${dir}/${name}-client-protocol.h",
]
} else {
assert(generator_type == "all")
# In all the other cases(generation of protocols from
# //third_party/wayland-protocols), private source with server and client
# headers are generated.
protocol_outputs += [
"${dir}/${name}-protocol.c",
"${dir}/${name}-server-protocol.h",
"${dir}/${name}-client-protocol.h",
]
}
output_dirs += [ dir ]
}
action_name = "${target_name}_gen"
config_name = "${target_name}_config"
source_set_name = "${target_name}"
# Action which runs wayland-scanner to generate the code.
action(action_name) {
visibility = [ ":$source_set_name" ]
script = "//third_party/wayland/wayland_scanner_wrapper.py"
sources = invoker.sources
outputs = protocol_outputs
# Paths in invoker.sources are relative to the invoker.
# Make it relative to the src root.
args = rebase_path(invoker.sources, "//")
args += [
"--src-root",
rebase_path("//", root_build_dir),
]
args += [
"--root-gen-dir",
rebase_path(root_gen_dir, root_build_dir),
]
args += [
"--generator-type",
generator_type,
]
wayland_scanner_label =
"//third_party/wayland:wayland_scanner($host_toolchain)"
deps = [ wayland_scanner_label ]
wayland_scanner_path = get_label_info(wayland_scanner_label,
"root_out_dir") + "/wayland_scanner"
args += [
"--cmd",
"./" + rebase_path(wayland_scanner_path, root_build_dir),
]
sources += [ wayland_scanner_path ]
}
# Config to include the generated headers only with the file names.
# e.g. #include <foo-client-protocol.h>
config(config_name) {
include_dirs = output_dirs
}
# Source set which consists of the generated code.
source_set(source_set_name) {
sources = get_target_outputs(":$action_name")
deps = [
":$action_name",
"//third_party/wayland:wayland_util",
]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
public_configs = [ ":$config_name" ]
}
}