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