• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2019 Google LLC. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5# import("//gn/skia.gni")
6
7declare_args() {
8  using_fuchsia_sdk = true
9
10  # Fuchsia SDK install dir.
11  fuchsia_sdk_path = "//fuchsia/sdk/$host_os"
12
13  # Clang install dir.
14  fuchsia_toolchain_path = "//fuchsia/toolchain/$host_os"
15
16  # Path to GN-generated GN targets derived from parsing json file at
17  # |fuchsia_sdk_manifest_path|.  The parsing logic can be found in sdk.gni.
18  fuchsia_sdk_root = "//build/fuchsia"
19}
20
21declare_args() {
22  fuchsia_sdk_manifest_path = "${fuchsia_sdk_path}/meta/manifest.json"
23}
24
25template("_fuchsia_sysroot") {
26  assert(defined(invoker.meta), "The meta.json file path must be specified.")
27  assert(target_cpu == "x64" || target_cpu == "arm64",
28         "We currently only support 'x64' and 'arm64' targets for fuchsia.")
29
30  meta_json = read_file(invoker.meta, "json")
31
32  assert(meta_json.type == "sysroot")
33
34  meta_json_versions = meta_json.versions
35  if (target_cpu == "x64") {
36    defs = meta_json_versions.x64
37  } else {
38    defs = meta_json_versions.arm64
39  }
40
41  _libs = []
42  _lib_dirs = []
43  _include_dirs = []
44
45  foreach(link_lib, defs.link_libs) {
46    if (link_lib != "arch/${target_cpu}/sysroot/lib/Scrt1.o") {
47      _libs += [ rebase_path("$fuchsia_sdk_path/$link_lib") ]
48    }
49  }
50
51  defs_include_dir = defs.include_dir
52  _include_dirs += [ rebase_path("$fuchsia_sdk_path/$defs_include_dir") ]
53
54  config_name = "config_$target_name"
55  config(config_name) {
56    lib_dirs = _lib_dirs
57    libs = _libs
58    include_dirs = _include_dirs
59  }
60
61  group(target_name) {
62    public_configs = [ ":$config_name" ]
63  }
64}
65
66template("_fuchsia_fidl_library") {
67  assert(defined(invoker.meta), "The meta.json file path must be specified.")
68  assert(target_cpu == "x64" || target_cpu == "arm64",
69         "We currently only support 'x64' and 'arm64' targets for fuchsia.")
70
71  meta_json = read_file(invoker.meta, "json")
72
73  assert(meta_json.type == "fidl_library")
74
75  _deps = [ "../pkg:fidl_cpp" ]
76
77  library_name = meta_json.name
78  library_name_json = "$library_name.json"
79
80  foreach(dep, meta_json.deps) {
81    _deps += [ ":$dep" ]
82  }
83
84  config_name = "config_$target_name"
85  config(config_name) {
86    include_dirs = [ target_gen_dir ]
87  }
88
89  fidl_gen_target_name = "fidlgen_$target_name"
90  action(fidl_gen_target_name) {
91    script = "//build/fuchsia/fidl_gen_cpp"
92
93    library_name_slashes = string_replace(library_name, ".", "/")
94
95    inputs = [ invoker.meta ]
96
97    outputs = [
98      "$target_gen_dir/$library_name_slashes/c/tables.c",
99      "$target_gen_dir/$library_name_slashes/cpp/fidl.h",
100      "$target_gen_dir/$library_name_slashes/cpp/fidl.cc",
101    ]
102
103    args = [
104      "--fidlc-bin",
105      rebase_path("$fuchsia_sdk_path/tools/fidlc"),
106      "--fidlgen-bin",
107      rebase_path("$fuchsia_sdk_path/tools/fidlgen"),
108      "--sdk-base",
109      rebase_path("$fuchsia_sdk_path"),
110      "--root",
111      rebase_path(invoker.meta),
112      "--json",
113      rebase_path("$target_gen_dir/$library_name_json"),
114      "--include-base",
115      rebase_path("$target_gen_dir"),
116      "--output-base-cc",
117      rebase_path("$target_gen_dir/$library_name_slashes/cpp/fidl"),
118      "--output-c-tables",
119      rebase_path("$target_gen_dir/$library_name_slashes/c/tables.c"),
120      "--output-c-header",
121      rebase_path("$target_gen_dir/$library_name_slashes/c/fidl.h"),
122    ]
123  }
124
125  source_set(target_name) {
126    public_configs = [ ":$config_name" ]
127
128    sources = get_target_outputs(":$fidl_gen_target_name")
129
130    deps = [ ":$fidl_gen_target_name" ]
131
132    public_deps = _deps
133  }
134}
135
136#
137# Produce a cc source library from invoker's json file.
138# Primary output is the source_set.
139#
140template("_fuchsia_cc_source_library") {
141  assert(defined(invoker.meta), "The meta.json file path must be specified.")
142
143  meta_json = read_file(invoker.meta, "json")
144
145  assert(meta_json.type == "cc_source_library")
146
147  _output_name = meta_json.name
148  _include_dirs = []
149  _public_headers = []
150  _sources = []
151  _deps = []
152
153  meta_json_include_dir = meta_json.include_dir
154  _include_dirs += [ rebase_path("$fuchsia_sdk_path/$meta_json_include_dir") ]
155
156  foreach(header, meta_json.headers) {
157    rebased_header = []
158    rebased_header = [ rebase_path("$fuchsia_sdk_path/$header") ]
159    _public_headers += rebased_header
160    _sources += rebased_header
161  }
162
163  foreach(source, meta_json.sources) {
164    _sources += [ "$fuchsia_sdk_path/$source" ]
165  }
166
167  config_name = "config_$target_name"
168  config(config_name) {
169    include_dirs = _include_dirs
170  }
171
172  foreach(dep, meta_json.deps) {
173    _deps += [ "../pkg:$dep" ]
174  }
175
176  foreach(dep, meta_json.fidl_deps) {
177    _deps += [ "../fidl:$dep" ]
178  }
179
180  source_set(target_name) {
181    output_name = _output_name
182    public = _public_headers
183    sources = _sources
184    public_configs = [ ":$config_name" ]
185    public_deps = _deps
186  }
187}
188
189template("_fuchsia_cc_prebuilt_library") {
190  assert(defined(invoker.meta), "The meta.json file path must be specified.")
191  meta_json = read_file(invoker.meta, "json")
192
193  _include_dirs = []
194  _deps = []
195  _libs = []
196
197  meta_json_include_dir = meta_json.include_dir
198  _include_dirs += [ "$fuchsia_sdk_path/$meta_json_include_dir" ]
199
200  foreach(dep, meta_json.deps) {
201    _deps += [ ":$dep" ]
202  }
203
204  meta_json_binaries = meta_json.binaries
205  if (target_cpu == "x64") {
206    meta_json_binaries_arch = meta_json_binaries.x64
207  } else {
208    meta_json_binaries_arch = meta_json_binaries.arm64
209  }
210  prebuilt_lib = meta_json_binaries_arch.link
211  _libs = [ "$fuchsia_sdk_path/$prebuilt_lib" ]
212
213  config_name = "config_$target_name"
214  config(config_name) {
215    include_dirs = _include_dirs
216    libs = _libs
217  }
218
219  group(target_name) {
220    public_configs = [ ":$config_name" ]
221    public_deps = _deps
222  }
223}
224
225#
226# Read SDK manifest json file and produce gn build targets for all
227# "enabled_parts" as specified by the template invoker.
228#
229# Fuchsia SDK manifest is primarily a "parts" array.
230#
231template("fuchsia_sdk") {
232  assert(defined(invoker.meta), "The meta.json file path must be specified.")
233  assert(defined(invoker.enabled_parts),
234         "A list containing the parts of the SDK to generate targets for.")
235
236  meta_json = read_file(invoker.meta, "json")
237
238  foreach(part, meta_json.parts) {
239    part_meta_json = {
240    }
241
242    part_meta = part.meta
243    part_meta_rebased = "$fuchsia_sdk_path/$part_meta"
244
245    part_meta_json = read_file(part_meta_rebased, "json")
246    subtarget_name = part_meta_json.name
247
248    foreach(enabled_part, invoker.enabled_parts) {
249      if (part.type == "cc_source_library") {
250        if (part.type == enabled_part) {
251          _fuchsia_cc_source_library(subtarget_name) {
252            meta = part_meta_rebased
253          }
254        }
255      } else if (part.type == "sysroot") {
256        if (part.type == enabled_part) {
257          _fuchsia_sysroot(subtarget_name) {
258            meta = part_meta_rebased
259          }
260        }
261      } else if (part.type == "fidl_library") {
262        if (part.type == enabled_part) {
263          _fuchsia_fidl_library(subtarget_name) {
264            meta = part_meta_rebased
265          }
266        }
267      } else if (part.type == "cc_prebuilt_library") {
268        if (part.type == enabled_part) {
269          _fuchsia_cc_prebuilt_library(subtarget_name) {
270            meta = part_meta_rebased
271          }
272        }
273      }
274    }
275  }
276
277  group(target_name) {
278  }
279}
280
281#
282# Create package in 'gen' directory.
283#
284template("fuchsia_package") {
285  assert(defined(invoker.name), "The name of the package must be specified.")
286  assert(defined(invoker.version), "The package version must be specified.")
287
288  pkg_dir = target_gen_dir
289  pkg_name = invoker.name
290  pkg_version = invoker.version
291  pkg_manifest = invoker.pkg_manifest
292
293  pkg_id_path = "${pkg_dir}/meta/package"
294  gen_far_target_name = "gen_far_${target_name}"
295  pkg_archive = "${pkg_dir}/${pkg_name}-${pkg_version}.far"
296
297  action(gen_far_target_name) {
298    script = "//build/fuchsia/gen_package"
299
300    pm_binary = rebase_path("$fuchsia_sdk_path/tools/pm")
301
302    inputs = [ pm_binary ]
303
304    outputs = [
305      pkg_id_path,
306      pkg_archive,
307    ]
308
309    args = [
310      "--pm-bin",
311      pm_binary,
312      "--pkg-dir",
313      rebase_path(pkg_dir),
314      "--pkg-name",
315      pkg_name,
316      "--pkg-version",
317      "$pkg_version",
318      "--pkg-manifest",
319      rebase_path(pkg_manifest),
320    ]
321
322    if (defined(invoker.deps)) {
323      deps = invoker.deps
324    }
325    if (defined(invoker.testonly)) {
326      testonly = invoker.testonly
327    }
328  }
329
330  copy(target_name) {
331    if (defined(invoker.testonly)) {
332      testonly = invoker.testonly
333    }
334
335    sources = [ pkg_archive ]
336
337    output_name = "${root_out_dir}/far/${pkg_name}.far"
338    outputs = [ output_name ]
339
340    deps = [ ":$gen_far_target_name" ]
341  }
342}
343
344#
345# Places repo in output ('obj') directory.
346#
347template("fuchsia_repo") {
348  assert(defined(invoker.archives),
349         "The list of archives to publish must be specified.")
350  assert(defined(invoker.repo), "The location of the repo should be specified.")
351
352  action(target_name) {
353    if (defined(invoker.testonly)) {
354      testonly = invoker.testonly
355    }
356    script = "//build/fuchsia/gen_repo"
357
358    pm_binary = rebase_path("$fuchsia_sdk_path/tools/pm")
359    repo_directory = invoker.repo
360
361    inputs = [ pm_binary ]
362
363    archive_flags = []
364
365    foreach(archive, invoker.archives) {
366      assert(get_path_info(archive, "extension") == "far",
367             "Archive '$archive' does not have the .far extension.")
368      inputs += [ archive ]
369      archive_flags += [
370        "--archive",
371        rebase_path(archive),
372      ]
373    }
374
375    outputs = [ repo_directory ]
376
377    args = [
378             "--pm-bin",
379             pm_binary,
380             "--repo-dir",
381             rebase_path(repo_directory),
382           ] + archive_flags
383
384    if (defined(invoker.deps)) {
385      deps = invoker.deps
386    }
387  }
388}
389