blob: 99cdbc1c5e7c4d6e61cfbef012f1ef572036b9c6 [file] [log] [blame]
# Copyright 2013 The Flutter 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("config/config.gni")
# Internal template for the cmc tool.
#
# Invokes cmc
#
# Example:
#
# ```
# _cmc_tool("validate_cmx") {
# inputs = [ manifest ]
# outputs = [ stamp_file ]
#
# args = [
# "--stamp",
# rebase_path(stamp_file, root_build_dir),
# "validate",
# rebase_path(invoker.manifest),
# ]
# }
# ```
#
# Parameters:
#
# inputs (required)
# List of files that are input for cmc.
# Type: list(path)
#
# outputs (required)
# List paths that are output for the run of cmc.
# Type: list(path)
#
# args (required)
# List command line args for cmc.
# Type: list(path)
#
# deps
# public_deps
# testonly
# visibility
#
template("_cmc_tool") {
action(target_name) {
forward_variables_from(invoker,
[
"deps",
"public_deps",
"testonly",
"visibility",
])
script = "//build/gn_run_binary.py"
_cmc_tool_path = "${fuchsia_tool_dir}/cmc"
assert(defined(invoker.inputs), "inputs is a required parameter.")
assert(defined(invoker.outputs), "outputs is a required parameter.")
assert(defined(invoker.args), "args is a required parameter.")
inputs =
[
_cmc_tool_path,
# Depend on the SDK hash, to ensure rebuild if the SDK tools change.
fuchsia_sdk_manifest_file,
] + invoker.inputs
outputs = invoker.outputs
args = [ rebase_path(_cmc_tool_path, root_build_dir) ] + invoker.args
}
}
# Compiles a Components Framework v2 manifest (.cml) file to .cm
#
# Example:
#
# ```
# cmc_compile(_compiled_manifest_target) {
# forward_variables_from(invoker, [ "deps" ])
# manifest = rebase_path(manifest)
# }
# ```
#
# Parameters:
#
# manifest (required)
# The input Component Framework v2 manifest source (.cml) file.
# The file must have the extension ".cml".
#
# output_name (optional)
# Name of the output file to generate. Defaults to $target_name.
# This should not include a file extension (.cm)
#
# deps
# public_deps
# testonly
# visibility
#
template("cmc_compile") {
output_name = target_name
if (defined(invoker.output_name)) {
output_name = invoker.output_name
}
_cmc_tool(target_name) {
forward_variables_from(invoker,
[
"deps",
"manifest",
"public_deps",
"testonly",
"visibility",
])
assert(defined(manifest), "manifest file required")
inputs = [ manifest ]
output_file = "$target_out_dir/$output_name.cm"
outputs = [ output_file ]
depfile = "$target_out_dir/$target_name.d"
args = [
"compile",
rebase_path(manifest, root_build_dir),
"--output",
rebase_path(output_file, root_build_dir),
"--includeroot",
rebase_path("//", root_build_dir),
"--includepath",
rebase_path("$fuchsia_sdk/pkg/", root_build_dir),
"--depfile",
rebase_path(depfile, root_build_dir),
]
}
}
# Validates a component manifest file
#
# The cmc_validate template will ensure that a given cmx file is conformant to
# the cmx schema, as defined by //tools/cmc/schema.json. A stamp file is
# generated to mark that a given cmx file has passed.
#
# Parameters:
#
# manifest (required)
# [file] The path to the cmx file that is to be validated
#
# deps
# testonly
# visibility
#
template("cmc_validate") {
_cmc_tool(target_name) {
forward_variables_from(invoker,
[
"manifest",
"deps",
"testonly",
"visibility",
])
stamp_file = "$target_gen_dir/$target_name.verified"
assert(defined(manifest), "manifest file required")
inputs = [ manifest ]
outputs = [ stamp_file ]
args = [
"--stamp",
rebase_path(stamp_file, root_build_dir),
"validate",
rebase_path(invoker.manifest),
]
}
}
# Merges multiple component manifest files into one.
#
# Combines mutliple component manifests into a single manifest.
# This is useful for merging fragments of sandbox configurations into
# a single component manifest.
#
# Example
#
# ```
# cmc_merge("combined_cmx") {
# sources = ["sandbox.cmx", "services.cmx", "program.cmx"]
# output_name = "my-component.cmx"
# }
# ```
#
# Parameters
#
# sources
# The list of cmx files to merge together.
#
# Type: list of strings (filepath)
#
# output_name [optional]
# The name of the merged cmx file. This file is created in $target_out_dir.
# If not specified, $target_name.cmx is used.
#
# Type: string
#
# Standard parameters:
# deps
# testonly
# visibility
#
template("cmc_merge") {
_cmc_tool(target_name) {
forward_variables_from(invoker,
[
"deps",
"output_name",
"sources",
"testonly",
"visibility",
])
if (!defined(output_name)) {
# TODO(richkadel): THE GN SDK VERSION OF CMC.GNI IS INCONSISTENT WITH fuchsia.git!
# The default name should be `target_name`, which should already include the
# extension... Or change fuchsia.git to add the extension, and fix calls that
# append .cmx to the target name, like flutter_dart_component.gni.
# With the target_name representing the base of the CMC filename results
# in a "Duplicate definition" error in GN, because "flutter_component()"
# typically has the same target name. My current workaround is to
# redundantly assign `output_name` to the same value as the `target_name`,
# which includes the `.cmx` extension.
output_name = "${target_name}.cmx"
}
merged_output = "${target_out_dir}/${output_name}"
inputs = invoker.sources
outputs = [ merged_output ]
args = [
"merge",
"--output",
rebase_path(merged_output, root_build_dir),
]
foreach(source, sources) {
args += [ rebase_path(source, root_build_dir) ]
}
}
}