xref: /aosp_15_r20/external/cronet/build/cipd/cipd.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1# Copyright 2020 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5# Build targets for constructing CIPD packages.
6#
7# Prepares a CIPD archive and generates a manifest file.
8#
9# TODO(crbug.com/1042819): Add support for including directories.
10#
11# Parameters:
12#   package_definition_yaml: CIPD package definition filename. "cipd.yaml"
13#                            if unspecified.
14#   package: The path where the package will be located inside the CIPD
15#            repository.
16#   description: Sets the "description" field in CIPD package definition.
17#   install_mode: String, should be either "symlink" or "copy". Defaults to
18#                 "symlink".
19#   deps: A list of targets to build prior to copying files.
20#   sources: A list of files to copy into the staging root.
21#   source_directories: A list of directories to include in the package. Should
22#                       only be used when listing out all the files (in a given
23#                       directory) in |sources| is unfeasible.
24#
25# Example:
26#   cipd_package_definition("chromedriver") {
27#     package = "path/to/cipd/package"
28#     description = "Prebuilt test binary."
29#     install_mode = "copy"
30#     deps = [ "//path/to:test_binary_target" ]
31#     sources = [ "//path/to:test_binary_file" ]
32#   }
33#
34template("cipd_package_definition") {
35  forward_variables_from(invoker,
36                         [
37                           "deps",
38                           "data",
39                           "source_directories",
40                           "data_deps",
41                           "sources",
42                           "testonly",
43                         ])
44
45  assert(defined(sources) || defined(source_directories),
46         "At least one sources input must be specified.")
47
48  _install_mode = "symlink"
49  if (defined(invoker.install_mode)) {
50    _install_mode = invoker.install_mode
51  }
52  assert(_install_mode == "copy" || _install_mode == "symlink",
53         "\"install_mode\" arg should be either \"copy\" or \"symlink\".")
54
55  _cipd_definition_yaml = "cipd.yaml"
56  if (defined(invoker.package_definition_yaml)) {
57    _cipd_definition_yaml = invoker.package_definition_yaml
58  }
59
60  _package_staging_dir = "${target_gen_dir}/${target_name}"
61
62  _yaml_contents = [
63    "package: ${invoker.package}",
64    "description: ${invoker.description}",
65    "root: " + rebase_path(_package_staging_dir),
66    "install_mode: ${_install_mode}",
67    "data:",
68  ]
69
70  if (defined(sources)) {
71    foreach(source, sources) {
72      _yaml_contents += [ "  - file: " + get_path_info(source, "file") ]
73    }
74    copy(target_name) {
75      outputs = [ "${_package_staging_dir}/{{source_file_part}}" ]
76    }
77  }
78
79  if (defined(source_directories)) {
80    foreach(directory, source_directories) {
81      _yaml_contents += [ "  - dir: " + directory ]
82    }
83  }
84
85  write_file("${_package_staging_dir}/${_cipd_definition_yaml}", _yaml_contents)
86}
87
88# Create a cipd file based on inputs and FILES.cfg config. Most of the arguments
89# are similar with |cipd_package_definition| above.
90#
91# Additional parameters:
92#
93#   package_definition_yaml: The output yaml file. Default is
94#                            ${target_name}_cipd.yaml.
95#   files_file: The file defines what files and directories to include.
96#               Example: //tools/build/chromeos/FILES.cfg.
97#   buildtype: str, required. It can be "dev" or "official".
98#              Only when the file has the same buildtype, it will be included.
99#   arch: str, required. It can be "32bit", "64bit", "arm".
100#
101# Example:
102# cipd_package_definition_by_file("chrome_cipd") {
103#     package = "path/to/cipd/package"
104#     description = "Prebuilt test binary."
105#     install_mode = "copy"
106#     files_file = "//chrome/tools/build/chromeos/FILES.json"
107#     buildtype = "dev"
108#     arch = "64bit"
109#     deps = [ "//path/to:test_binary_target" ]
110#   }
111template("cipd_package_definition_by_file") {
112  forward_variables_from(invoker,
113                         [
114                           "deps",
115                           "data",
116                           "data_deps",
117                           "sources",
118                           "testonly",
119                         ])
120  _output_yaml_filename = "${target_name}_cipd.yaml"
121  if (defined(invoker.package_definition_yaml)) {
122    _output_yaml_filename = invoker.package_definition_yaml
123  }
124  action(target_name) {
125    script = "//build/cipd/cipd_from_file.py"
126    inputs = [ invoker.files_file ]
127    args = [
128      "--description=" + invoker.description,
129      "--buildtype=" + invoker.buildtype,
130      "--arch=" + invoker.arch,
131      "--files_file=" + rebase_path(invoker.files_file, root_build_dir),
132      "--package=" + invoker.package,
133      "--install_mode=" + invoker.install_mode,
134      "--output_yaml_file=" +
135          rebase_path("${root_out_dir}/" + _output_yaml_filename,
136                      root_build_dir),
137    ]
138    outputs = [ "${root_out_dir}/" + _output_yaml_filename ]
139  }
140}
141