blob: 94509a040dd88421de40c039a0e4c76769ca96b2 [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Write a JSON file for the $target_name "build API module". The file goes
# at `$root_build_dir/$target_name.json`. The contents are in JSON format.
#
# The $target_name is the name of the build API module. It's up to each
# module to define the JSON schema that constitutes the API contract with
# users of this build API module. Usually somewhere in the JSON structure
# will be strings naming Ninja targets (i.e. output files to produce, or
# actions to take for side-effect such as running tests).
#
# Every build_api_module() should be preceded by a documentation comment
# describing the schema and meaning of the JSON it produces.
#
# Note, this is evaluated only in $default_toolchain context (so that only
# one file is ever generated by each target). Hence, to define a build API
# module, this target must be reached in the dependency graph from the
# $default_toolchain. Usually the module needs to express information
# collected from other toolchains. That is done by having the $deps here
# (eventually) reach targets in other toolchains in the metadata walk.
#
# The //:api build_api_module() target is the root of the whole build API.
# Each other build_api_module() must be reached from its $deps.
#
# Parameters
#
# contents
# Optional: Fixed contents of the file, any GN type, serialized as JSON.
# This must be present if $data_keys et al are not.
# Type: any
#
# deps, data_keys, walk_keys
# Specifies a metadata query to produce the contents of the file.
# In this case, the file always contains a JSON list. If $contents
# is omitted then $data_keys is required.
# Type: See generated_file().
#
# rebase (optional)
#
template("build_api_module") {
if (current_toolchain == default_toolchain) {
generated_file(target_name) {
outputs = [ "$root_build_dir/$target_name.json" ]
forward_variables_from(invoker,
[
"contents",
"data_keys",
"deps",
"metadata",
"testonly",
"visibility",
"walk_keys",
"rebase",
])
output_conversion = "json"
metadata = {
# Used to populate the api.json file that is uploaded by
# artifactory (see tools/artifactory/modules.go)
build_api_modules = [ target_name ]
# This information will be used exclusively by build/api/client.py
# The script expects a series of lines such as: <name>=<file_path>
build_api_client_info =
[ "${target_name}=" + rebase_path(outputs[0], root_build_dir) ]
if (defined(invoker.metadata)) {
forward_variables_from(invoker.metadata, "*", [ "build_api_modules" ])
}
}
}
} else {
not_needed([ "target_name" ])
not_needed(invoker, "*")
}
}