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