• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2022 Google LLC
2//
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5
6package main
7
8import (
9	"flag"
10	"fmt"
11	"os"
12	"runtime/pprof"
13
14	"go.skia.org/infra/go/common"
15	"go.skia.org/infra/go/skerr"
16	"go.skia.org/skia/bazel/exporter"
17	"go.skia.org/skia/bazel/exporter/interfaces"
18)
19
20var gniExportDescs = []exporter.GNIExportDesc{
21	{GNI: "gn/codec.gni", Vars: []exporter.GNIFileListExportDesc{
22		{Var: "skia_codec_public",
23			Rules: []string{
24				"//include/codec:any_codec_hdrs",
25				"//include/codec:core_hdrs",
26			},
27		},
28		{Var: "skia_codec_shared",
29			Rules: []string{
30				"//src/codec:any_decoder",
31				"//include/codec:any_codec_hdrs",
32			},
33		},
34		{Var: "skia_codec_decode_bmp",
35			Rules: []string{
36				"//src/codec:bmp_decode",
37				"//src/codec:wbmp_decode",
38			},
39		},
40		{Var: "skia_codec_xmp",
41			Rules: []string{
42				"//src/codec:xmp_srcs",
43			},
44		},
45		{Var: "skia_codec_jpeg_xmp",
46			Rules: []string{
47				"//src/codec:jpeg_xmp_hdrs",
48				"//src/codec:jpeg_xmp_srcs",
49			},
50		},
51		{Var: "skia_codec_png_base",
52			Rules: []string{
53				"//src/codec:png_codec_base_hdrs",
54				"//src/codec:png_codec_base_srcs",
55			},
56		},
57		// TODO(https://crbug.com/381900683): Replace this with more granular lists
58		// (with `skia_codec_png_base` + `skia_codec_libpng_srcs`).
59		{Var: "skia_codec_png",
60			Rules: []string{
61				"//src/codec:buffet_libpng_srcs",
62				"//src/codec:common_libpng_srcs",
63				"//src/codec:png_codec_base_hdrs",
64				"//src/codec:png_codec_base_srcs",
65			},
66		},
67		{Var: "skia_codec_libpng_srcs",
68			Rules: []string{
69				"//src/codec:buffet_libpng_srcs",
70				"//src/codec:common_libpng_srcs",
71			},
72		},
73		{Var: "skia_codec_rust_png_public",
74			Rules: []string{
75				"//experimental/rust_png/decoder:hdrs",
76			},
77		},
78		{Var: "skia_codec_rust_png",
79			Rules: []string{
80				"//experimental/rust_png/decoder:srcs",
81				"//experimental/rust_png/ffi:utils",
82			},
83		},
84		{Var: "skia_codec_rust_png_ffi_rs_srcs",
85			Rules: []string{
86				"//experimental/rust_png/ffi:rs_srcs",
87			},
88		},
89		{Var: "skia_codec_rust_png_ffi_cxx_bridge_srcs",
90			Rules: []string{
91				"//experimental/rust_png/ffi:cxx_bridge_srcs",
92			},
93		},
94		{Var: "skia_codec_rust_png_ffi_cpp_hdrs",
95			Rules: []string{
96				"//experimental/rust_png/ffi:ffi_cpp",
97			},
98		},
99	}},
100	{GNI: "gn/core.gni", Vars: []exporter.GNIFileListExportDesc{
101		{Var: "skia_core_public",
102			Rules: []string{
103				"//include/core:core_hdrs",
104			}},
105		{Var: "skia_core_sources",
106			Rules: []string{
107				"//include/private:core_priv_hdrs",
108				"//include/private/base:private_hdrs",
109				"//include/private/base:shared_gpu_private_hdrs",
110				"//include/private/chromium:core_hdrs",
111				"//include/private/chromium:shared_private_hdrs",
112				"//src/base:private_hdrs",
113				"//src/base:skslc_srcs",
114				"//src/base:srcs",
115				"//src/core:core_priv_hdrs",
116				"//src/core:core_priv_srcs",
117				"//src/core:core_srcs",
118				"//src/core:textual_hdrs",
119				"//src/image:image_hdrs",
120				"//src/image:image_srcs",
121				"//src/lazy:lazy_hdrs",
122				"//src/lazy:lazy_srcs",
123				"//src/opts:textual_hdrs",
124				"//src/shaders:shader_hdrs",
125				"//src/shaders:shader_srcs",
126				"//src/text:text_hdrs",
127				"//src/text:text_srcs",
128			}},
129		{Var: "skia_pathops_public",
130			Rules: []string{"//include/pathops:public_hdrs"}},
131		{Var: "skia_pathops_sources",
132			Rules: []string{
133				"//src/pathops:_pathops_hdrs",
134				"//src/pathops:_pathops_srcs",
135			}},
136		{Var: "skia_encode_public",
137			Rules: []string{"//include/encode:encode_hdrs"}},
138		{Var: "skia_encode_srcs",
139			Rules: []string{
140				"//src/encode:encoder_common",
141				"//src/encode:icc_support",
142			}},
143		{Var: "skia_encode_jpeg_public",
144			Rules: []string{"//include/encode:jpeg_hdrs"}},
145		{Var: "skia_encode_jpeg_srcs",
146			Rules: []string{"//src/encode:jpeg_encode_srcs",
147				"//src/encode:jpeg_encode_hdrs"}},
148		{Var: "skia_encode_rust_png_public",
149			Rules: []string{"//experimental/rust_png/encoder:hdrs"}},
150		{Var: "skia_encode_rust_png_srcs",
151			Rules: []string{
152				"//experimental/rust_png/encoder:srcs",
153				"//experimental/rust_png/ffi:utils",
154			}},
155		{Var: "skia_encode_png_base",
156			Rules: []string{
157				"//src/encode:png_encode_base_srcs",
158				"//src/encode:png_encode_base_hdrs",
159			}},
160		{Var: "skia_encode_libpng_srcs",
161			Rules: []string{
162				"//src/encode:png_encode_srcs",
163				"//src/encode:png_encode_hdrs",
164			}},
165		// TODO(https://crbug.com/381900683): Rename this list.
166		{Var: "skia_encode_png_public",
167			Rules: []string{"//include/encode:png_hdrs"}},
168		// TODO(https://crbug.com/381900683): Replace this with more granular lists
169		// (with `skia_encode_libpng_srcs` + `skia_encode_png_base`.
170		{Var: "skia_encode_png_srcs",
171			Rules: []string{
172				"//src/encode:png_encode_base_srcs",
173				"//src/encode:png_encode_base_hdrs",
174				"//src/encode:png_encode_srcs",
175				"//src/encode:png_encode_hdrs",
176			}},
177		{Var: "skia_encode_webp_public",
178			Rules: []string{"//include/encode:webp_hdrs"}},
179		{Var: "skia_encode_webp_srcs",
180			Rules: []string{"//src/encode:webp_encode_srcs"}},
181		{Var: "skia_no_encode_jpeg_srcs",
182			Rules: []string{"//src/encode:no_jpeg_encode_srcs"}},
183		{Var: "skia_no_encode_png_srcs",
184			Rules: []string{"//src/encode:no_png_encode_srcs"}},
185		{Var: "skia_no_encode_webp_srcs",
186			Rules: []string{"//src/encode:no_webp_encode_srcs"}},
187		{Var: "skia_discardable_memory_chromium",
188			Rules: []string{"//include/private/chromium:discardable_memory_hdrs"}},
189		{Var: "skia_no_slug_srcs",
190			Rules: []string{}},
191	},
192	},
193	{GNI: "gn/effects.gni", Vars: []exporter.GNIFileListExportDesc{
194		{Var: "skia_effects_public",
195			Rules: []string{
196				"//include/effects:core_hdrs",
197			}},
198		{Var: "skia_effects_sources",
199			Rules: []string{
200				"//src/effects:effects_hdrs",
201				"//src/effects:effects_srcs",
202				"//src/shaders/gradients:gradient_hdrs",
203				"//src/shaders/gradients:gradient_srcs",
204			}},
205		{Var: "skia_colorfilters_sources",
206			Rules: []string{
207				"//src/effects/colorfilters:colorfilter_srcs",
208				"//src/effects/colorfilters:colorfilter_hdrs",
209			}},
210	}},
211	{GNI: "gn/effects_imagefilters.gni", Vars: []exporter.GNIFileListExportDesc{
212		{Var: "skia_effects_imagefilter_public",
213			Rules: []string{
214				"//include/effects:public_imagefilters_hdrs",
215			}},
216		{Var: "skia_effects_imagefilter_sources",
217			Rules: []string{
218				"//src/effects/imagefilters:srcs",
219			}}},
220	},
221	{GNI: "gn/ports.gni", Vars: []exporter.GNIFileListExportDesc{
222		{Var: "skia_ports_sources",
223			Rules: []string{
224				"//src/ports:global_init",
225				"//src/ports:osfile",
226			}},
227		{Var: "skia_ports_freetype_sources",
228			Rules: []string{
229				"//src/ports:freetype_support",
230			}},
231		{Var: "skia_ports_fontmgr_android_public",
232			Rules: []string{
233				"//include/ports:android_fontmgr_hdrs",
234			}},
235		{Var: "skia_ports_fontmgr_android_sources",
236			Rules: []string{
237				"//src/ports:fontmgr_android_freetype",
238			}},
239		{Var: "skia_ports_fontmgr_android_ndk_public",
240			Rules: []string{
241				"//include/ports:android_ndk_fontmgr_hdrs",
242			}},
243		{Var: "skia_ports_fontmgr_android_ndk_sources",
244			Rules: []string{
245				"//src/ports:fontmgr_android_ndk_freetype",
246			}},
247		{Var: "skia_ports_fontmgr_custom_sources",
248			Rules: []string{
249				"//src/ports:fontmgr_custom",
250			}},
251		{Var: "skia_ports_fontmgr_coretext_public",
252			Rules: []string{
253				"//include/ports:mac_typeface",
254				"//include/ports:coretext_fontmgr_hdrs",
255			}},
256		{Var: "skia_ports_fontmgr_coretext_sources",
257			Rules: []string{
258				"//src/ports:fontmgr_coretext",
259				"//src/ports:typeface_mac_srcs",
260				"//src/ports:typeface_mac_hdrs",
261			}},
262		{Var: "skia_ports_fontmgr_directory_public",
263			Rules: []string{
264				"//include/ports:directory_fontmgr_hdrs",
265			}},
266		{Var: "skia_ports_fontmgr_directory_sources",
267			Rules: []string{
268				"//src/ports:fontmgr_directory_freetype",
269			}},
270		{Var: "skia_ports_fontmgr_embedded_public",
271			Rules: []string{
272				"//include/ports:data_fontmgr_hdrs",
273			}},
274		{Var: "skia_ports_fontmgr_embedded_sources",
275			Rules: []string{
276				"//src/ports:fontmgr_data_freetype",
277			}},
278		{Var: "skia_ports_fontmgr_empty_public",
279			Rules: []string{
280				"//include/ports:empty_fontmgr_hdrs",
281			}},
282		{Var: "skia_ports_fontmgr_empty_sources",
283			Rules: []string{
284				"//src/ports:fontmgr_empty_freetype",
285			}},
286		{Var: "skia_ports_fontmgr_fontconfig_public",
287			Rules: []string{
288				"//include/ports:fontconfig_fontmgr_hdrs",
289			}},
290		{Var: "skia_ports_fontmgr_fontconfig_sources",
291			Rules: []string{
292				"//src/ports:fontmgr_fontconfig_freetype",
293			}},
294		{Var: "skia_ports_fontmgr_fontations_public",
295			Rules: []string{
296				"//include/ports:fontmgr_fontations_hdrs",
297			}},
298		{Var: "skia_ports_fontmgr_fontations_sources",
299			Rules: []string{
300				"//src/ports:fontmgr_fontations_empty_srcs",
301			}},
302		{Var: "skia_ports_fontmgr_fuchsia_public",
303			Rules: []string{
304				"//include/ports:fuchsia_fontmgr_hdrs",
305			}},
306		{Var: "skia_ports_fontmgr_fuchsia_sources",
307			Rules: []string{
308				"//src/ports:fontmgr_fuchsia_srcs",
309			}},
310		{Var: "skia_ports_typeface_fontations_sources",
311			Rules: []string{
312				"//src/ports:typeface_fontations_hdrs",
313				"//src/ports:typeface_fontations_srcs",
314			}},
315		{Var: "skia_ports_typeface_proxy_sources",
316			Rules: []string{
317				"//src/ports:typeface_proxy_hdrs",
318				"//src/ports:typeface_proxy_srcs",
319			}},
320		{Var: "skia_ports_windows_sources",
321			Rules: []string{
322				"//src/ports:osfile_win",
323			}},
324		{Var: "skia_ports_windows_fonts_public",
325			Rules: []string{
326				"//include/ports:typeface_windows_hdrs",
327			}},
328		{Var: "skia_ports_windows_fonts_sources",
329			Rules: []string{
330				"//src/ports:windows_fonts_srcs",
331			}},
332		{Var: "skia_ports_fci_public",
333			Rules: []string{
334				"//include/ports:fci_fontmgr_hdrs",
335			}},
336		{Var: "skia_ports_fci_sources",
337			Rules: []string{
338				"//src/ports:fontconfig_interface_srcs",
339			}},
340		{Var: "skia_ports_fonthost_win_sources",
341			Rules: []string{
342				"//src/ports:fonthost_win_srcs",
343			}},
344	}},
345	{GNI: "gn/pdf.gni", Vars: []exporter.GNIFileListExportDesc{
346		{Var: "skia_pdf_public",
347			Rules: []string{"//include/docs:pdf_hdrs"}},
348		{Var: "skia_pdf_sources",
349			Rules: []string{
350				"//src/pdf:_pdf_hdrs",
351				"//src/pdf:_pdf_srcs",
352			}},
353	}},
354	{GNI: "gn/sksl.gni", Vars: []exporter.GNIFileListExportDesc{
355		{Var: "skia_sksl_core_sources",
356			Rules: []string{
357				"//include/sksl:core_hdrs",
358				"//src/sksl/analysis:analysis_hdrs",
359				"//src/sksl/analysis:analysis_srcs",
360				"//src/sksl/codegen:rasterpipeline_hdrs",
361				"//src/sksl/codegen:rasterpipeline_srcs",
362				"//src/sksl/ir:ir_hdrs",
363				"//src/sksl/ir:ir_srcs",
364				"//src/sksl/tracing:private_hdrs",
365				"//src/sksl/tracing:skopts_hdrs",
366				"//src/sksl/tracing:srcs",
367				"//src/sksl/transform:transform_hdrs",
368				"//src/sksl/transform:transform_srcs",
369				"//src/sksl:sksl_hdrs",
370				"//src/sksl:sksl_srcs",
371			}},
372		{Var: "skia_sksl_core_module_sources",
373			Rules: []string{
374				"//src/sksl:sksl_default_module_srcs",
375				"//src/sksl:sksl_graphite_modules_hdrs",
376			}},
377		{Var: "skia_sksl_graphite_modules_sources",
378			Rules: []string{
379				"//src/sksl:sksl_graphite_modules_srcs",
380				"//src/sksl:sksl_graphite_modules_hdrs",
381			}},
382		{Var: "skia_sksl_tracing_sources",
383			Rules: []string{
384				"//src/sksl/tracing:enabled_hdrs",
385				"//src/sksl/tracing:enabled_srcs",
386			}},
387		{Var: "skia_sksl_pipeline_sources",
388			Rules: []string{
389				"//src/sksl/codegen:gpu",
390			}},
391		{Var: "skia_sksl_codegen_sources",
392			Rules: []string{
393				"//src/sksl/codegen:codegen_shared_exported",
394				"//src/sksl/codegen:codegen_shared_priv",
395				"//src/sksl/codegen:glsl",
396				"//src/sksl/codegen:metal",
397				"//src/sksl/codegen:spirv",
398				"//src/sksl/codegen:wgsl",
399			}},
400		{Var: "skia_sksl_hlsl_sources",
401			Rules: []string{
402				"//src/sksl/codegen:hlsl",
403			}},
404		{Var: "skia_sksl_validate_spirv_sources",
405			Rules: []string{
406				"//src/sksl/codegen:spirv_validator",
407			}},
408		{Var: "skia_sksl_validate_wgsl_sources",
409			Rules: []string{
410				"//src/sksl/codegen:wgsl_validator",
411			}},
412		{Var: "skslc_deps",
413			Rules: []string{
414				"//src/base:skslc_srcs",
415				"//src/core:core_skslc_hdrs",
416				"//src/core:core_skslc_srcs",
417				"//src/gpu/ganesh:core_skslc_hdrs",
418				"//src/gpu/ganesh:core_skslc_srcs",
419				"//src/ports:malloc",
420				"//src/ports:osfile",
421				"//src/sksl:sksl_skslc_module_srcs",
422				"//src/utils:utils_skslc_hdrs",
423				"//src/utils:utils_skslc_srcs",
424			}}},
425	},
426	{GNI: "gn/sksl_tests.gni", Vars: []exporter.GNIFileListExportDesc{
427		// This order was the order the original file was in. It could be alphabetized if we like.
428		{Var: "sksl_error_tests", Rules: []string{"//resources/sksl:sksl_error_tests"}},
429		{Var: "sksl_glsl_tests", Rules: []string{"//resources/sksl:sksl_glsl_tests"}},
430		{Var: "sksl_mesh_tests", Rules: []string{"//resources/sksl:sksl_mesh_tests"}},
431		{Var: "sksl_mesh_error_tests", Rules: []string{"//resources/sksl:sksl_mesh_error_tests"}},
432		{Var: "sksl_metal_tests", Rules: []string{"//resources/sksl:sksl_metal_tests"}},
433		{Var: "sksl_spirv_tests", Rules: []string{"//resources/sksl:sksl_spirv_tests"}},
434		{Var: "sksl_wgsl_tests", Rules: []string{"//resources/sksl:sksl_wgsl_tests"}},
435		{Var: "sksl_shared_tests", Rules: []string{"//resources/sksl:sksl_shared_tests"}},
436		{Var: "sksl_compute_tests", Rules: []string{"//resources/sksl:sksl_compute_tests"}},
437		{Var: "sksl_folding_tests", Rules: []string{"//resources/sksl:sksl_folding_tests"}},
438		{Var: "sksl_inliner_tests", Rules: []string{"//resources/sksl:sksl_inliner_tests"}},
439		{Var: "sksl_blend_tests", Rules: []string{"//resources/sksl:sksl_blend_tests"}},
440		{Var: "sksl_settings_tests", Rules: []string{"//resources/sksl:sksl_settings_tests"}},
441		{Var: "sksl_rte_tests", Rules: []string{"//resources/sksl:sksl_rte_tests"}},
442		{Var: "sksl_rte_error_tests", Rules: []string{"//resources/sksl:sksl_rte_error_tests"}},
443	}},
444	{GNI: "gn/utils.gni", Vars: []exporter.GNIFileListExportDesc{
445		{Var: "skia_utils_public",
446			Rules: []string{
447				"//include/utils:core_hdrs",
448				"//include/utils/mac:public_hdrs"}},
449		{Var: "skia_utils_chromium",
450			Rules: []string{
451				"//include/docs:multi_picture_document_hdrs",
452			}},
453		{Var: "skia_utils_private",
454			Rules: []string{
455				"//src/utils/mac:mac_utils_priv",
456				"//src/utils/mac:mac_utils",
457				"//src/utils/win:core_hdrs",
458				"//src/utils/win:core_srcs",
459				"//src/utils:core_priv_hdrs",
460				"//src/utils:core_srcs",
461				"//src/utils:char_to_glyphcache",
462				"//src/utils:canvas_state_utils",
463				"//src/utils:multi_picture_document",
464				"//src/utils:clip_stack_utils",
465				"//src/utils:float_to_decimal",
466				"//src/utils:utils_skslc_hdrs",
467				"//src/utils:utils_skslc_srcs",
468			}},
469	},
470	},
471	{GNI: "gn/xps.gni", Vars: []exporter.GNIFileListExportDesc{
472		{Var: "skia_xps_public",
473			Rules: []string{"//include/docs:xps_hdrs"}},
474		{Var: "skia_xps_sources",
475			Rules: []string{
476				"//src/xps:core_hdrs",
477				"//src/xps:core_srcs",
478			}}},
479	},
480	{GNI: "gn/xml.gni", Vars: []exporter.GNIFileListExportDesc{
481		{Var: "skia_xml_sources",
482			Rules: []string{
483				"//src/xml:_xml_hdrs",
484				"//src/xml:_xml_srcs",
485			}}},
486	},
487	{GNI: "gn/gpu.gni", Vars: []exporter.GNIFileListExportDesc{
488		{Var: "skia_gpu_public",
489			Rules: []string{
490				"//include/gpu/ganesh/mock:public_hdrs",
491				"//include/gpu:shared_gpu_hdrs",
492				"//include/gpu/ganesh:ganesh_hdrs",
493			}},
494		{Var: "skia_ganesh_private",
495			Rules: []string{
496				"//include/private/gpu/ganesh:private_hdrs",
497				"//src/gpu/ganesh/effects:effects_hdrs",
498				"//src/gpu/ganesh/effects:effects_srcs",
499				"//src/gpu/ganesh/geometry:geometry_hdrs",
500				"//src/gpu/ganesh/geometry:geometry_srcs",
501				"//src/gpu/ganesh/glsl:glsl_hdrs",
502				"//src/gpu/ganesh/glsl:glsl_srcs",
503				"//src/gpu/ganesh/gradients:gradient_hdrs",
504				"//src/gpu/ganesh/gradients:gradient_srcs",
505				"//src/gpu/ganesh/image:image_hdrs",
506				"//src/gpu/ganesh/image:image_srcs",
507				"//src/gpu/ganesh/mock:mock_hdrs",
508				"//src/gpu/ganesh/mock:mock_srcs",
509				"//src/gpu/ganesh/ops:ops_hdrs",
510				"//src/gpu/ganesh/ops:ops_srcs",
511				"//src/gpu/ganesh/surface:surface_srcs",
512				"//src/gpu/ganesh/surface:surface_srcs",
513				"//src/gpu/ganesh/tessellate:tessellate_hdrs",
514				"//src/gpu/ganesh/tessellate:tessellate_srcs",
515				"//src/gpu/ganesh/text:private_hdrs",
516				"//src/gpu/ganesh/text:srcs",
517				"//src/gpu/ganesh:core_hdrs",
518				"//src/gpu/ganesh:core_skslc_hdrs",
519				"//src/gpu/ganesh:core_skslc_srcs",
520				"//src/gpu/ganesh:core_srcs",
521			}},
522		{Var: "skia_gpu_android_private",
523			Rules: []string{
524				"//src/gpu/ganesh/surface:android_srcs",
525				"//src/gpu/ganesh:android_srcs",
526				"//src/image:android_srcs",
527			}},
528		{Var: "skia_gpu_chromium_public",
529			Rules: []string{
530				"//include/private/chromium:ganesh_private_hdrs",
531			}},
532		{Var: "skia_gpu_gl_public",
533			Rules: []string{
534				"//include/gpu/ganesh/gl:public_hdrs",
535			}},
536		{Var: "skia_gpu_gl_private",
537			Rules: []string{
538				"//src/gpu/ganesh/gl:core_hdrs",
539				"//src/gpu/ganesh/gl:core_srcs",
540				"//src/gpu/ganesh/gl/builders:builder_hdrs",
541				"//src/gpu/ganesh/gl/builders:builder_srcs",
542			}},
543		{Var: "skia_android_gl_sources",
544			Rules: []string{
545				"//src/gpu/ganesh/gl:android_srcs",
546			}},
547		{Var: "skia_null_gpu_sources",
548			Rules: []string{
549				"//src/gpu/ganesh/gl:native_interface_none",
550			}},
551		{Var: "skia_gpu_vk_public",
552			Rules: []string{
553				"//include/gpu/vk:shared_public_hdrs",
554				"//include/gpu/ganesh/vk:public_hdrs",
555			}},
556		{Var: "skia_gpu_vk_chromium_public",
557			Rules: []string{
558				"//include/private/chromium:vk_ganesh_hdrs",
559			}},
560		{Var: "skia_gpu_vk_private",
561			Rules: []string{
562				"//src/gpu/ganesh/vk:vk_hdrs",
563				"//src/gpu/ganesh/vk:vk_srcs",
564			}},
565		{Var: "skia_gpu_vk_android_private",
566			Rules: []string{
567				"//src/gpu/ganesh/vk:android_srcs",
568			}},
569		{Var: "skia_gpu_vk_chromium_private",
570			Rules: []string{
571				"//src/gpu/ganesh/vk:vk_chromium_srcs",
572			}},
573		{Var: "skia_direct3d_sources",
574			Rules: []string{
575				"//include/private/gpu/ganesh:d3d_private_hdrs",
576				"//src/gpu/ganesh/d3d:d3d_hdrs",
577				"//src/gpu/ganesh/d3d:d3d_srcs",
578			}},
579		{Var: "skia_gpu_metal_public",
580			Rules: []string{
581				"//include/gpu/ganesh/mtl:public_hdrs",
582			}},
583		{Var: "skia_gpu_metal_private",
584			Rules: []string{
585				"//src/gpu/ganesh/surface:mtl_objc_srcs",
586				"//src/gpu/ganesh/mtl:mtl_hdrs",
587				"//src/gpu/ganesh/mtl:mtl_srcs",
588			}},
589		{Var: "skia_gpu_metal_cpp",
590			Rules: []string{
591				"//src/gpu/ganesh/mtl:mtl_cpp_hdrs",
592			}},
593		{Var: "skia_shared_gpu_sources",
594			Rules: []string{
595				"//include/gpu:shared_gpu_hdrs",
596				"//include/private/base:shared_gpu_private_hdrs",
597				"//include/private/chromium:shared_private_hdrs",
598				"//src/gpu:shared_hdrs",
599				"//src/gpu:shared_srcs",
600				"//src/gpu/tessellate:tessellate_hdrs",
601				"//src/gpu/tessellate:tessellate_srcs",
602				"//src/text/gpu:gpu_hdrs",
603				"//src/text/gpu:gpu_srcs",
604			}},
605		{Var: "skia_shared_vk_sources",
606			Rules: []string{
607				"//include/private/gpu/vk:private_hdrs",
608				"//src/gpu/vk:_vk_hdrs",
609				"//src/gpu/vk:_vk_srcs"}},
610		{Var: "skia_vma_sources",
611			Rules: []string{
612				"//src/gpu/vk/vulkanmemoryallocator:vma_srcs",
613			}},
614		{Var: "skia_shared_mtl_sources",
615			Rules: []string{
616				"//include/gpu/mtl:public_hdrs",
617				"//src/gpu/mtl:mtl_hdrs",
618				"//src/gpu/mtl:mtl_srcs",
619			}},
620		{Var: "skia_shared_android_sources",
621			Rules: []string{
622				"//src/gpu/android:shared_android_srcs",
623			}},
624	}},
625	{GNI: "modules/svg/svg.gni", Vars: []exporter.GNIFileListExportDesc{
626		{Var: "skia_svg_public",
627			Rules: []string{"//modules/svg/include:public_hdrs"}},
628		{Var: "skia_svg_sources",
629			Rules: []string{
630				"//modules/svg/src:private_hdrs",
631				"//modules/svg/src:srcs",
632			}},
633	}},
634	{GNI: "modules/bentleyottmann/bentleyottmann.gni", Vars: []exporter.GNIFileListExportDesc{
635		{Var: "bentleyottmann_public",
636			Rules: []string{
637				"//modules/bentleyottmann/include:hdrs",
638			}},
639		{Var: "bentleyottmann_sources",
640			Rules: []string{
641				"//modules/bentleyottmann/src:srcs",
642			}},
643		{Var: "bentleyottmann_tests",
644			Rules: []string{
645				"//modules/bentleyottmann/tests:tests",
646			}},
647	}},
648	{GNI: "modules/skparagraph/skparagraph.gni", Vars: []exporter.GNIFileListExportDesc{
649		{Var: "skparagraph_public",
650			Rules: []string{
651				"//modules/skparagraph/include:hdrs",
652				"//modules/skparagraph/utils:utils_hdrs"}},
653		{Var: "skparagraph_sources",
654			Rules: []string{
655				"//modules/skparagraph/src:srcs",
656				"//modules/skparagraph/utils:utils_srcs"}},
657		{Var: "skparagraph_utils",
658			Rules: []string{
659				"//modules/skparagraph/utils:utils_hdrs",
660				"//modules/skparagraph/utils:utils_srcs",
661			}},
662		{Var: "skparagraph_tests",
663			Rules: []string{
664				"//modules/skparagraph/tests:tests_hdrs",
665				"//modules/skparagraph/tests:tests_srcs",
666			}},
667	}},
668	{GNI: "modules/skresources/skresources.gni", Vars: []exporter.GNIFileListExportDesc{
669		{Var: "skia_skresources_public",
670			Rules: []string{"//modules/skresources/include:hdrs"}},
671		{Var: "skia_skresources_sources",
672			Rules: []string{"//modules/skresources/src:srcs"}},
673	}},
674	{GNI: "modules/skshaper/skshaper.gni", Vars: []exporter.GNIFileListExportDesc{
675		{Var: "skia_shaper_public",
676			Rules: []string{"//modules/skshaper/include:hdrs",
677				"//modules/skshaper/utils:core_hdrs",
678			}},
679		{Var: "skia_shaper_primitive_sources",
680			Rules: []string{"//modules/skshaper/src:base_srcs"}},
681		{Var: "skia_shaper_harfbuzz_sources",
682			Rules: []string{"//modules/skshaper/src:harfbuzz_srcs"}},
683		{Var: "skia_shaper_skunicode_sources",
684			Rules: []string{"//modules/skshaper/src:skunicode_srcs"}},
685		{Var: "skia_shaper_coretext_sources",
686			Rules: []string{"//modules/skshaper/src:coretext_srcs"}},
687		{Var: "skia_shaper_tests",
688			Rules: []string{"//modules/skshaper/tests:tests_srcs"}},
689	}},
690	{GNI: "modules/skunicode/skunicode.gni", Vars: []exporter.GNIFileListExportDesc{
691		{Var: "skia_unicode_public",
692			Rules: []string{"//modules/skunicode/include:hdrs"}},
693		{Var: "skia_unicode_sources",
694			Rules: []string{"//modules/skunicode/src:srcs"}},
695		{Var: "skia_unicode_icu_sources",
696			Rules: []string{"//modules/skunicode/src:icu_srcs"}},
697		{Var: "skia_unicode_icu_bidi_sources",
698			Rules: []string{"//modules/skunicode/src:icu_bidi_srcs"}},
699		{Var: "skia_unicode_bidi_full_sources",
700			Rules: []string{"//modules/skunicode/src:bidi_full_srcs"}},
701		{Var: "skia_unicode_bidi_subset_sources",
702			Rules: []string{"//modules/skunicode/src:bidi_subset_srcs"}},
703		{Var: "skia_unicode_icu4x_sources",
704			Rules: []string{"//modules/skunicode/src:icu4x_srcs"}},
705		{Var: "skia_unicode_client_icu_sources",
706			Rules: []string{"//modules/skunicode/src:client_srcs"}},
707		{Var: "skia_unicode_builtin_icu_sources",
708			Rules: []string{"//modules/skunicode/src:builtin_srcs"}},
709		{Var: "skia_unicode_runtime_icu_sources",
710			Rules: []string{"//modules/skunicode/src:runtime_srcs"}},
711		{Var: "skia_unicode_libgrapheme_sources",
712			Rules: []string{"//modules/skunicode/src:libgrapheme_srcs"}},
713		{Var: "skia_unicode_tests",
714			Rules: []string{"//modules/skunicode/tests:tests"}},
715	}},
716	{GNI: "modules/sksg/sksg.gni", Vars: []exporter.GNIFileListExportDesc{
717		{Var: "skia_sksg_sources",
718			Rules: []string{"//modules/sksg/src:srcs"}},
719	}},
720	{GNI: "modules/skottie/skottie.gni", Vars: []exporter.GNIFileListExportDesc{
721		{Var: "skia_skottie_public",
722			Rules: []string{"//modules/skottie/include:hdrs"}},
723		{Var: "skia_skottie_sources",
724			Rules: []string{
725				"//modules/skottie/src:core_hdrs",
726				"//modules/skottie/src:core_srcs",
727				"//modules/skottie/src/animator:srcs",
728				"//modules/skottie/src/effects:srcs",
729				"//modules/skottie/src/layers:srcs",
730				"//modules/skottie/src/layers/shapelayer:srcs",
731				"//modules/skottie/src/text:text_hdrs",
732				"//modules/skottie/src/text:text_srcs",
733				"//modules/skottie/src/text:text_shaper_srcs",
734			}},
735	}},
736	{GNI: "modules/skcms/skcms.gni", Vars: []exporter.GNIFileListExportDesc{
737		{Var: "skcms_public_headers",
738			Rules: []string{"//modules/skcms:public_hdrs"}},
739		{Var: "skcms_public",
740			Rules: []string{
741				"//modules/skcms:skcms_public",
742			}},
743		{Var: "skcms_TransformBaseline",
744			Rules: []string{
745				"//modules/skcms:skcms_TransformBaseline",
746			}},
747		{Var: "skcms_TransformHsw",
748			Rules: []string{
749				"//modules/skcms:skcms_TransformHsw",
750			}},
751		{Var: "skcms_TransformSkx",
752			Rules: []string{
753				"//modules/skcms:skcms_TransformSkx",
754			}},
755	}},
756	{GNI: "modules/jsonreader/jsonreader.gni", Vars: []exporter.GNIFileListExportDesc{
757		{Var: "skia_jsonreader_sources",
758			Rules: []string{"//modules/jsonreader:jsonreader"}},
759	}},
760}
761
762const (
763	unknownErr    = 1
764	invalidArgErr = 2
765	exportErr     = 3
766	verifyErr     = 4
767	profilerErr   = 5
768)
769
770type fileSystem struct {
771	workspaceDir string
772	outFormat    string
773	openFiles    []*os.File
774}
775
776func (fs *fileSystem) OpenFile(path string) (interfaces.Writer, error) {
777	f, err := os.Create(path)
778	if err != nil {
779		return nil, skerr.Wrap(err)
780	}
781	fs.openFiles = append(fs.openFiles, f)
782	return f, nil
783}
784
785func (fs *fileSystem) ReadFile(filename string) ([]byte, error) {
786	return os.ReadFile(filename)
787}
788
789func (fs *fileSystem) Shutdown() {
790	for _, f := range fs.openFiles {
791		f.Close() // Ignore error.
792	}
793}
794
795// Make sure fileSystem fulfills the FileSystem interface.
796var _ interfaces.FileSystem = (*fileSystem)(nil)
797
798func createExporter(projName, cmakeFileName string, fs *fileSystem) interfaces.Exporter {
799	if fs.outFormat == "cmake" {
800		return exporter.NewCMakeExporter(projName, fs.workspaceDir, cmakeFileName, fs)
801	}
802	params := exporter.GNIExporterParams{
803		WorkspaceDir: fs.workspaceDir,
804		ExportDescs:  gniExportDescs,
805	}
806	return exporter.NewGNIExporter(params, fs)
807}
808
809func doExport(qr interfaces.QueryCommand, exp interfaces.Exporter, outFormat string) {
810	err := exp.Export(qr)
811	if err != nil {
812		fmt.Fprintf(os.Stderr, "Error exporting to %s: %v\n", outFormat, err)
813		os.Exit(exportErr)
814	}
815}
816
817func main() {
818	var (
819		queryRules    = common.NewMultiStringFlag("rule", nil, "Bazel rule (may be repeated).")
820		outFormat     = flag.String("output_format", "", "Desired output format. One of cmake or gni.")
821		cmakeFileName = flag.String("out", "CMakeLists.txt", "CMake output file")
822		projName      = flag.String("proj_name", "", "CMake project name")
823		cpuprofile    = flag.String("cpuprofile", "", "write cpu profile to file")
824	)
825	flag.Parse()
826	if *outFormat != "cmake" && *outFormat != "gni" {
827		if *outFormat == "" {
828			fmt.Fprintln(os.Stderr, "Output format required")
829		} else {
830			fmt.Fprintf(os.Stderr, "Incorrect output format: \"%s\"\n", *outFormat)
831		}
832		fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
833		flag.PrintDefaults()
834		os.Exit(invalidArgErr)
835	}
836	if *cmakeFileName == "" || *projName == "" {
837		fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
838		flag.PrintDefaults()
839		os.Exit(invalidArgErr)
840	}
841	workspaceDir, err := os.Getwd()
842	if err != nil {
843		fmt.Fprintf(os.Stderr, "Error getting pwd: %v", err)
844		os.Exit(unknownErr)
845	}
846	if *cpuprofile != "" {
847		f, err := os.Create(*cpuprofile)
848		if err != nil {
849			fmt.Fprintf(os.Stderr, "unable to create %q: %v\n", *cpuprofile, err)
850			os.Exit(profilerErr)
851		}
852		defer f.Close()
853		if err = pprof.StartCPUProfile(f); err != nil {
854			fmt.Fprintf(os.Stderr, "error starting CPU profile: %v\n", err)
855			os.Exit(profilerErr)
856		}
857		defer pprof.StopCPUProfile()
858	}
859	var qcmd *exporter.BazelQueryCommand
860	switch *outFormat {
861	case "gni":
862		qcmd = exporter.NewBazelGNIQueryCommand(*queryRules, workspaceDir)
863	case "cmake":
864		qcmd = exporter.NewBazelCMakeQueryCommand(*queryRules, workspaceDir)
865	}
866	fs := fileSystem{workspaceDir: workspaceDir, outFormat: *outFormat}
867	defer fs.Shutdown()
868	var exp interfaces.Exporter = createExporter(*projName, *cmakeFileName, &fs)
869	doExport(qcmd, exp, *outFormat)
870}
871