| # 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) ] |
| } |
| } |
| } |