fix compile errors
[platform/upstream/libSkiaSharp.git] / BUILD.gn
1 # Copyright 2016 Google Inc.
2 #
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 import("gn/android_framework_defines.gni")
7 import("gn/shared_sources.gni")
8
9 if (!defined(is_skia_standalone)) {
10   is_skia_standalone = false
11 }
12
13 declare_args() {
14   skia_use_angle = false
15   skia_use_expat = true
16   skia_use_fontconfig = is_linux
17   skia_use_freetype = is_android || is_fuchsia || is_linux
18   skia_use_gdi = false
19   skia_use_icu = !is_fuchsia && !is_ios && !is_win  # TODO: Windows
20   skia_use_libjpeg_turbo = true
21   skia_use_libpng = true
22   skia_use_libwebp = !is_fuchsia
23   skia_use_lua = false
24   skia_use_mesa = false
25   skia_use_piex = !is_win
26   skia_use_zlib = true
27
28   skia_enable_android_framework_defines = false
29   skia_enable_gpu = true
30   skia_enable_tools = is_skia_standalone
31   skia_enable_vulkan_debug_layers = is_skia_standalone && is_debug
32   skia_vulkan_sdk = getenv("VULKAN_SDK")
33 }
34 declare_args() {
35   skia_use_dng_sdk =
36       !is_fuchsia && !is_win && skia_use_libjpeg_turbo && skia_use_zlib
37   skia_use_sfntly = skia_use_icu
38
39   if (is_android) {
40     skia_use_vulkan = defined(ndk_api) && ndk_api >= 24
41   } else {
42     skia_use_vulkan = skia_vulkan_sdk != ""
43   }
44 }
45
46 # Our tools require static linking (they use non-exported symbols).
47 skia_enable_tools = skia_enable_tools && !is_component_build
48
49 fontmgr_android_enabled = skia_use_expat && skia_use_freetype
50
51 skia_public_includes = [
52   "include/android",
53   "include/c",
54   "include/codec",
55   "include/config",
56   "include/core",
57   "include/effects",
58   "include/gpu",
59   "include/gpu/gl",
60   "include/images",
61   "include/pathops",
62   "include/ports",
63   "include/svg",
64   "include/utils",
65   "include/utils/mac",
66   "include/xml",
67 ]
68
69 # Skia public API, generally provided by :skia.
70 config("skia_public") {
71   include_dirs = skia_public_includes
72   defines = []
73   if (is_component_build) {
74     defines += [ "SKIA_DLL" ]
75   }
76   if (is_fuchsia || is_linux) {
77     defines += [ "SK_SAMPLES_FOR_X" ]
78   }
79   if (skia_enable_android_framework_defines) {
80     defines += android_framework_defines
81   }
82   if (!skia_enable_gpu) {
83     defines += [ "SK_SUPPORT_GPU=0" ]
84   }
85 }
86
87 # Skia internal APIs, used by Skia itself and a few test tools.
88 config("skia_private") {
89   visibility = [ ":*" ]
90
91   include_dirs = [
92     "include/private",
93     "src/c",
94     "src/codec",
95     "src/config",
96     "src/core",
97     "src/effects",
98     "src/effects/gradients",
99     "src/fonts",
100     "src/gpu",
101     "src/image",
102     "src/images",
103     "src/lazy",
104     "src/opts",
105     "src/pathops",
106     "src/pdf",
107     "src/ports",
108     "src/sfnt",
109     "src/sksl",
110     "src/utils",
111     "src/utils/win",
112     "third_party/etc1",
113     "third_party/gif",
114     "third_party/ktx",
115   ]
116
117   defines = [
118     "SK_GAMMA_APPLY_TO_A8",
119     "SK_INTERNAL",
120   ]
121   if (is_android) {
122     defines += [
123       "SK_GAMMA_EXPONENT=1.4",
124       "SK_GAMMA_CONTRAST=0.0",
125     ]
126   }
127   if (is_official_build || is_android) {
128     # TODO(bsalomon): it'd be nice to make Android normal.
129     defines += [ "SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=0" ]
130   }
131   libs = []
132   lib_dirs = []
133   if (skia_use_vulkan) {
134     if (skia_vulkan_sdk != "" && !is_android) {
135       if (is_win) {
136         include_dirs += [ "$skia_vulkan_sdk/Include/" ]
137         lib_dirs += [ "$skia_vulkan_sdk/Bin" ]
138       } else {
139         include_dirs += [ "$skia_vulkan_sdk/include/" ]
140         lib_dirs += [ "$skia_vulkan_sdk/lib/" ]
141       }
142     }
143     if (is_win) {
144       libs += [ "vulkan-1.lib" ]
145     } else {
146       libs += [ "vulkan" ]
147     }
148   }
149 }
150
151 # Any code that's linked into Skia-the-library should use this config via += skia_library_configs.
152 config("skia_library") {
153   visibility = [ ":*" ]
154   defines = [ "SKIA_IMPLEMENTATION=1" ]
155 }
156
157 skia_library_configs = [
158   ":skia_public",
159   ":skia_private",
160   ":skia_library",
161 ]
162
163 # Use for CPU-specific Skia code that needs particular compiler flags.
164 template("opts") {
165   if (invoker.enabled) {
166     source_set(target_name) {
167       forward_variables_from(invoker, "*")
168       configs += skia_library_configs
169     }
170   } else {
171     # If not enabled, a phony empty target that swallows all otherwise unused variables.
172     source_set(target_name) {
173       forward_variables_from(invoker,
174                              "*",
175                              [
176                                "sources",
177                                "cflags",
178                              ])
179     }
180   }
181 }
182
183 is_x86 = current_cpu == "x64" || current_cpu == "x86"
184
185 opts("none") {
186   enabled = !is_x86 && current_cpu != "arm" && current_cpu != "arm64"
187   sources = skia_opts.none_sources
188   cflags = []
189 }
190
191 opts("armv7") {
192   enabled = current_cpu == "arm"
193   sources = skia_opts.armv7_sources + skia_opts.neon_sources
194   cflags = []
195 }
196
197 opts("arm64") {
198   enabled = current_cpu == "arm64"
199   sources = skia_opts.arm64_sources
200   cflags = []
201 }
202
203 opts("crc32") {
204   enabled = current_cpu == "arm64"
205   sources = skia_opts.crc32_sources
206   cflags = [ "-march=armv8-a+crc" ]
207 }
208
209 opts("sse2") {
210   enabled = is_x86
211   sources = skia_opts.sse2_sources
212   if (is_win) {
213     defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSE2" ]
214   } else {
215     cflags = [ "-msse2" ]
216   }
217 }
218
219 opts("ssse3") {
220   enabled = is_x86
221   sources = skia_opts.ssse3_sources
222   if (is_win) {
223     defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSSE3" ]
224   } else {
225     cflags = [ "-mssse3" ]
226   }
227 }
228
229 opts("sse41") {
230   enabled = is_x86
231   sources = skia_opts.sse41_sources
232   if (is_win) {
233     defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSE41" ]
234   } else {
235     cflags = [ "-msse4.1" ]
236   }
237 }
238
239 opts("sse42") {
240   enabled = is_x86
241   sources = skia_opts.sse42_sources
242   if (is_win) {
243     defines = [ "SK_CPU_SSE_LEVEL=SK_CPU_SSE_LEVEL_SSE42" ]
244   } else {
245     cflags = [ "-msse4.2" ]
246   }
247 }
248
249 opts("avx") {
250   enabled = is_x86
251   sources = skia_opts.avx_sources
252   if (is_win) {
253     cflags = [ "/arch:AVX" ]
254   } else {
255     cflags = [ "-mavx" ]
256   }
257 }
258
259 opts("hsw") {
260   enabled = is_x86
261   sources = skia_opts.hsw_sources
262   if (is_win) {
263     cflags = [ "/arch:AVX2" ]
264   } else {
265     cflags = [
266       "-mavx2",
267       "-mbmi",
268       "-mbmi2",
269       "-mf16c",
270       "-mfma",
271     ]
272   }
273 }
274
275 opts("dsp") {
276   enabled = current_cpu == "mipsel"
277   sources = skia_opts.mips_dsp_sources
278   cflags = []
279 }
280
281 # Any feature of Skia that requires third-party code should be optional and use this template.
282 template("optional") {
283   if (invoker.enabled) {
284     config(target_name + "_public") {
285       if (defined(invoker.public_defines)) {
286         defines = invoker.public_defines
287       }
288     }
289     source_set(target_name) {
290       forward_variables_from(invoker,
291                              "*",
292                              [
293                                "public_defines",
294                                "sources_when_disabled",
295                                "configs_to_remove",
296                              ])
297       all_dependent_configs = [ ":" + target_name + "_public" ]
298       configs += skia_library_configs
299       if (defined(invoker.configs_to_remove)) {
300         configs -= invoker.configs_to_remove
301       }
302     }
303   } else {
304     source_set(target_name) {
305       forward_variables_from(invoker,
306                              "*",
307                              [
308                                "public_defines",
309                                "deps",
310                                "libs",
311                                "sources",
312                                "sources_when_disabled",
313                                "configs_to_remove",
314                              ])
315       if (defined(invoker.sources_when_disabled)) {
316         sources = invoker.sources_when_disabled
317       }
318       configs += skia_library_configs
319     }
320   }
321 }
322
323 optional("fontmgr_android") {
324   enabled = fontmgr_android_enabled
325
326   deps = [
327     "//third_party/expat",
328     "//third_party/freetype2",
329   ]
330   sources = [
331     "src/ports/SkFontMgr_android.cpp",
332     "src/ports/SkFontMgr_android_factory.cpp",
333     "src/ports/SkFontMgr_android_parser.cpp",
334   ]
335 }
336
337 optional("fontmgr_custom") {
338   enabled = is_linux && skia_use_freetype && !skia_use_fontconfig
339
340   deps = [
341     "//third_party/freetype2",
342   ]
343   sources = [
344     "src/ports/SkFontMgr_custom.cpp",
345     "src/ports/SkFontMgr_custom_directory_factory.cpp",
346   ]
347 }
348
349 optional("fontmgr_fontconfig") {
350   enabled = skia_use_freetype && skia_use_fontconfig
351
352   deps = [
353     "//third_party:fontconfig",
354     "//third_party/freetype2",
355   ]
356   sources = [
357     "src/ports/SkFontConfigInterface.cpp",
358     "src/ports/SkFontConfigInterface_direct.cpp",
359     "src/ports/SkFontConfigInterface_direct_factory.cpp",
360     "src/ports/SkFontMgr_FontConfigInterface.cpp",
361     "src/ports/SkFontMgr_fontconfig.cpp",
362     "src/ports/SkFontMgr_fontconfig_factory.cpp",
363   ]
364 }
365
366 optional("fontmgr_fuchsia") {
367   enabled = is_fuchsia && skia_use_freetype
368
369   deps = [
370     "//third_party/freetype2",
371   ]
372   sources = [
373     "src/ports/SkFontMgr_custom.cpp",
374     "src/ports/SkFontMgr_custom_empty_factory.cpp",
375   ]
376 }
377
378 optional("gpu") {
379   enabled = skia_enable_gpu
380   public_defines = []
381
382   sources = skia_gpu_sources + [ "src/gpu/gl/GrGLDefaultInterface_native.cpp" ]
383
384   # These paths need to be absolute to match the ones produced by shared_sources.gni.
385   sources -= get_path_info([
386                              "src/gpu/gl/GrGLCreateNativeInterface_none.cpp",
387                              "src/gpu/gl/GrGLDefaultInterface_none.cpp",
388                            ],
389                            "abspath")
390   libs = []
391   if (is_android) {
392     sources += [ "src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp" ]
393   } else if (is_linux) {
394     sources += [ "src/gpu/gl/glx/GrGLCreateNativeInterface_glx.cpp" ]
395   } else if (is_mac) {
396     sources += [ "src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp" ]
397   } else if (is_win) {
398     sources += [ "src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp" ]
399     libs += [ "OpenGL32.lib" ]
400   } else {
401     sources += [ "src/gpu/gl/GrGLCreateNativeInterface_none.cpp" ]
402   }
403
404   if (skia_use_vulkan) {
405     public_defines += [ "SK_VULKAN" ]
406     sources += skia_vk_sources
407     if (skia_enable_vulkan_debug_layers) {
408       public_defines += [ "SK_ENABLE_VK_LAYERS" ]
409     }
410   }
411 }
412
413 optional("jpeg") {
414   enabled = skia_use_libjpeg_turbo
415   public_defines = [ "SK_HAS_JPEG_LIBRARY" ]
416
417   deps = [
418     "//third_party/libjpeg-turbo:libjpeg",
419   ]
420   sources = [
421     "src/codec/SkJpegCodec.cpp",
422     "src/codec/SkJpegDecoderMgr.cpp",
423     "src/codec/SkJpegUtility.cpp",
424     "src/images/SkJPEGImageEncoder.cpp",
425     "src/images/SkJPEGWriteUtility.cpp",
426   ]
427 }
428
429 optional("pdf") {
430   enabled = skia_use_zlib
431
432   deps = [
433     "//third_party/zlib",
434   ]
435   sources = skia_pdf_sources
436   sources_when_disabled = [ "src/pdf/SkDocument_PDF_None.cpp" ]
437
438   if (skia_use_sfntly) {
439     deps += [ "//third_party/sfntly" ]
440     public_defines = [ "SK_PDF_USE_SFNTLY" ]
441   }
442 }
443
444 optional("png") {
445   enabled = skia_use_libpng
446   public_defines = [ "SK_HAS_PNG_LIBRARY" ]
447
448   deps = [
449     "//third_party/libpng",
450   ]
451   sources = [
452     "src/codec/SkIcoCodec.cpp",
453     "src/codec/SkPngCodec.cpp",
454     "src/images/SkPNGImageEncoder.cpp",
455   ]
456 }
457
458 optional("raw") {
459   enabled = skia_use_dng_sdk && skia_use_libjpeg_turbo && skia_use_piex
460   public_defines = [ "SK_CODEC_DECODES_RAW" ]
461
462   deps = [
463     "//third_party/dng_sdk",
464     "//third_party/libjpeg-turbo:libjpeg",
465     "//third_party/piex",
466   ]
467
468   # SkRawCodec catches any exceptions thrown by dng_sdk, insulating the rest of
469   # Skia.
470   configs_to_remove = [ "//gn:no_exceptions" ]
471
472   sources = [
473     "src/codec/SkRawAdapterCodec.cpp",
474     "src/codec/SkRawCodec.cpp",
475   ]
476 }
477
478 optional("typeface_freetype") {
479   enabled = skia_use_freetype
480
481   deps = [
482     "//third_party/freetype2",
483   ]
484   sources = [
485     "src/ports/SkFontHost_FreeType.cpp",
486     "src/ports/SkFontHost_FreeType_common.cpp",
487   ]
488 }
489
490 optional("webp") {
491   enabled = skia_use_libwebp
492   public_defines = [ "SK_HAS_WEBP_LIBRARY" ]
493
494   deps = [
495     "//third_party/libwebp",
496   ]
497   sources = [
498     "src/codec/SkWebpAdapterCodec.cpp",
499     "src/codec/SkWebpCodec.cpp",
500     "src/images/SkWEBPImageEncoder.cpp",
501   ]
502 }
503
504 optional("xml") {
505   enabled = skia_use_expat
506   public_defines = [ "SK_XML" ]
507
508   deps = [
509     "//third_party/expat",
510   ]
511   sources = [
512     "src/xml/SkDOM.cpp",
513     "src/xml/SkXMLParser.cpp",
514     "src/xml/SkXMLWriter.cpp",
515   ]
516 }
517
518 component("skia") {
519   public_configs = [ ":skia_public" ]
520   configs += skia_library_configs
521
522   deps = [
523     ":arm64",
524     ":armv7",
525     ":avx",
526     ":crc32",
527     ":dsp",
528     ":fontmgr_android",
529     ":fontmgr_custom",
530     ":fontmgr_fontconfig",
531     ":fontmgr_fuchsia",
532     ":gpu",
533     ":hsw",
534     ":jpeg",
535     ":none",
536     ":pdf",
537     ":png",
538     ":raw",
539     ":sse2",
540     ":sse41",
541     ":sse42",
542     ":ssse3",
543     ":typeface_freetype",
544     ":webp",
545     ":xml",
546   ]
547
548   sources = []
549   sources += skia_core_sources
550   sources += skia_effects_sources
551   sources += skia_sksl_sources
552   sources += skia_utils_sources
553   sources += [
554     "src/android/SkBitmapRegionCodec.cpp",
555     "src/android/SkBitmapRegionDecoder.cpp",
556     "src/codec/SkAndroidCodec.cpp",
557     "src/codec/SkBmpCodec.cpp",
558     "src/codec/SkBmpMaskCodec.cpp",
559     "src/codec/SkBmpRLECodec.cpp",
560     "src/codec/SkBmpStandardCodec.cpp",
561     "src/codec/SkCodec.cpp",
562     "src/codec/SkCodecImageGenerator.cpp",
563     "src/codec/SkGifCodec.cpp",
564     "src/codec/SkMaskSwizzler.cpp",
565     "src/codec/SkMasks.cpp",
566     "src/codec/SkSampledCodec.cpp",
567     "src/codec/SkSampler.cpp",
568     "src/codec/SkStreamBuffer.cpp",
569     "src/codec/SkSwizzler.cpp",
570     "src/codec/SkWbmpCodec.cpp",
571     "src/images/SkImageEncoder.cpp",
572     "src/images/SkImageEncoder_Factory.cpp",
573     "src/images/SkKTXImageEncoder.cpp",
574     "src/ports/SkDiscardableMemory_none.cpp",
575     "src/ports/SkGlobalInitialization_default.cpp",
576     "src/ports/SkImageGenerator_skia.cpp",
577     "src/ports/SkMemory_malloc.cpp",
578     "src/ports/SkOSFile_stdio.cpp",
579     "src/sfnt/SkOTTable_name.cpp",
580     "src/sfnt/SkOTUtils.cpp",
581     "src/svg/SkSVGCanvas.cpp",
582     "src/svg/SkSVGDevice.cpp",
583     "src/utils/mac/SkStream_mac.cpp",
584     "third_party/etc1/etc1.cpp",
585     "third_party/gif/SkGifImageReader.cpp",
586     "third_party/ktx/ktx.cpp",
587   ]
588
589   libs = []
590
591   if (is_win) {
592     sources += [
593       "src/fonts/SkFontMgr_indirect.cpp",
594       "src/ports/SkDebug_win.cpp",
595       "src/ports/SkFontHost_win.cpp",
596       "src/ports/SkFontMgr_win_dw.cpp",
597       "src/ports/SkImageEncoder_WIC.cpp",
598       "src/ports/SkImageGeneratorWIC.cpp",
599       "src/ports/SkOSFile_win.cpp",
600       "src/ports/SkOSLibrary_win.cpp",
601       "src/ports/SkScalerContext_win_dw.cpp",
602       "src/ports/SkTLS_win.cpp",
603       "src/ports/SkTypeface_win_dw.cpp",
604       "src/xps/SkDocument_XPS.cpp",
605       "src/xps/SkXPSDevice.cpp",
606     ]
607     if (skia_use_gdi) {
608       sources += [ "src/ports/SkFontMgr_win_gdi_factory.cpp" ]
609       libs += [
610         "Gdi32.lib",
611         "Usp10.lib",
612       ]
613     } else {
614       sources += [ "src/ports/SkFontMgr_win_dw_factory.cpp" ]
615     }
616     sources -=
617         [ get_path_info("src/utils/SkThreadUtils_pthread.cpp", "abspath") ]
618     libs += [
619       "FontSub.lib",
620       "Ole32.lib",
621       "OleAut32.lib",
622       "User32.lib",
623     ]
624   } else {
625     sources += [
626       "src/ports/SkOSFile_posix.cpp",
627       "src/ports/SkOSLibrary_posix.cpp",
628       "src/ports/SkTLS_pthread.cpp",
629       "src/xps/SkDocument_XPS_None.cpp",
630     ]
631   }
632
633   if (is_android) {
634     deps += [
635       "//third_party/cpu-features",
636       "//third_party/expat",
637     ]
638     sources += [ "src/ports/SkDebug_android.cpp" ]
639     libs += [
640       "EGL",
641       "GLESv2",
642       "log",
643     ]
644   }
645
646   if (is_linux) {
647     libs += [
648       "GL",
649       "GLU",
650       "X11",
651     ]
652     sources += [ "src/ports/SkDebug_stdio.cpp" ]
653   }
654
655   if (is_mac) {
656     sources += [
657       "src/ports/SkDebug_stdio.cpp",
658       "src/ports/SkFontHost_mac.cpp",
659       "src/ports/SkImageEncoder_CG.cpp",
660       "src/ports/SkImageGeneratorCG.cpp",
661     ]
662     libs += [
663       "ApplicationServices.framework",
664       "OpenGL.framework",
665     ]
666   }
667
668   if (is_ios) {
669     sources += [
670       "src/ports/SkDebug_stdio.cpp",
671       "src/ports/SkFontHost_mac.cpp",
672       "src/ports/SkImageEncoder_CG.cpp",
673       "src/ports/SkImageGeneratorCG.cpp",
674     ]
675     libs += [
676       "CoreFoundation.framework",
677       "CoreGraphics.framework",
678       "CoreText.framework",
679       "ImageIO.framework",
680       "MobileCoreServices.framework",
681     ]
682   }
683
684   if (is_fuchsia) {
685     sources += [ "src/ports/SkDebug_stdio.cpp" ]
686   }
687 }
688
689 config("skia.h_config") {
690   include_dirs = [ "$target_gen_dir" ]
691 }
692 action("skia.h") {
693   public_configs = [ ":skia.h_config" ]
694   skia_h = "$target_gen_dir/skia.h"
695   script = "gn/find_headers.py"
696   args = [ rebase_path(skia_h, root_build_dir) ] +
697          rebase_path(skia_public_includes)
698   depfile = "$skia_h.deps"
699   outputs = [
700     skia_h,
701   ]
702 }
703
704 if (skia_enable_gpu && target_cpu == "x64") {
705   # Our bots only have 64-bit libOSMesa installed.
706   # TODO: worth fixing?
707   executable("fiddle") {
708     libs = []
709     if (is_linux) {
710       libs += [ "OSMesa" ]
711     }
712
713     sources = [
714       "src/images/SkForceLinking.cpp",
715       "tools/fiddle/draw.cpp",
716       "tools/fiddle/fiddle_main.cpp",
717     ]
718     deps = [
719       ":skia",
720       ":skia.h",
721     ]
722   }
723 }
724
725 if (is_skia_standalone && skia_enable_gpu) {
726   source_set("public_headers_warnings_check") {
727     sources = [
728       "tools/public_headers_warnings_check.cpp",
729     ]
730     configs -= [ "//gn:warnings_except_public_headers" ]
731     deps = [
732       ":skia",
733       ":skia.h",
734     ]
735   }
736 }
737
738 # Targets guarded by skia_enable_tools may use //third_party freely.
739 if (skia_enable_tools) {
740   template("test_lib") {
741     config(target_name + "_config") {
742       include_dirs = invoker.public_include_dirs
743       if (defined(invoker.public_defines)) {
744         defines = invoker.public_defines
745       }
746     }
747     source_set(target_name) {
748       forward_variables_from(invoker, "*", [ "public_include_dirs" ])
749       public_configs = [
750         ":" + target_name + "_config",
751         ":skia_private",
752       ]
753
754       if (!defined(deps)) {
755         deps = []
756       }
757       deps += [ ":skia" ]
758       testonly = true
759     }
760   }
761
762   test_lib("gpu_tool_utils") {
763     public_include_dirs = []
764     if (skia_enable_gpu) {
765       public_defines = []
766       public_include_dirs += [ "tools/gpu" ]
767
768       deps = []
769       sources = [
770         "tools/gpu/GrContextFactory.cpp",
771         "tools/gpu/GrTest.cpp",
772         "tools/gpu/TestContext.cpp",
773         "tools/gpu/gl/GLTestContext.cpp",
774         "tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp",
775         "tools/gpu/gl/debug/DebugGLTestContext.cpp",
776         "tools/gpu/gl/debug/GrBufferObj.cpp",
777         "tools/gpu/gl/debug/GrFrameBufferObj.cpp",
778         "tools/gpu/gl/debug/GrProgramObj.cpp",
779         "tools/gpu/gl/debug/GrShaderObj.cpp",
780         "tools/gpu/gl/debug/GrTextureObj.cpp",
781         "tools/gpu/gl/debug/GrTextureUnitObj.cpp",
782         "tools/gpu/gl/null/NullGLTestContext.cpp",
783       ]
784       libs = []
785
786       if (is_android) {
787         sources += [ "tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp" ]
788       } else if (is_ios) {
789         sources += [ "tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm" ]
790         libs += [ "OpenGLES.framework" ]
791       } else if (is_linux) {
792         sources += [ "tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp" ]
793       } else if (is_mac) {
794         sources += [ "tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp" ]
795       } else if (is_win) {
796         sources += [ "tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp" ]
797         libs += [
798           "Gdi32.lib",
799           "OpenGL32.lib",
800         ]
801       }
802
803       if (skia_use_angle) {
804         public_defines += [ "SK_ANGLE" ]
805         deps += [ "//third_party/angle2" ]
806         sources += [ "tools/gpu/gl/angle/GLTestContext_angle.cpp" ]
807       }
808       if (skia_use_mesa) {
809         public_defines += [ "SK_MESA" ]
810         sources += [ "tools/gpu/gl/mesa/GLTestContext_mesa.cpp" ]
811         libs += [ "OSMesa" ]
812       }
813       if (skia_use_vulkan) {
814         sources += [ "tools/gpu/vk/VkTestContext.cpp" ]
815       }
816     }
817   }
818
819   test_lib("flags") {
820     public_include_dirs = [ "tools/flags" ]
821     sources = [
822       "tools/flags/SkCommandLineFlags.cpp",
823     ]
824   }
825   test_lib("common_flags") {
826     public_include_dirs = [ "tools/flags" ]
827     sources = [
828       "tools/flags/SkCommonFlags.cpp",
829       "tools/flags/SkCommonFlagsConfig.cpp",
830     ]
831     deps = [
832       ":flags",
833       ":gpu_tool_utils",
834     ]
835   }
836
837   test_lib("tool_utils") {
838     public_include_dirs = [
839       "tools",
840       "tools/debugger",
841       "tools/timer",
842     ]
843     sources = [
844       "src/images/SkForceLinking.cpp",
845       "src/utils/SkMultiPictureDocumentReader.cpp",  # TODO(halcanary): move to tools?
846       "tools/AndroidSkDebugToStdOut.cpp",
847       "tools/CrashHandler.cpp",
848       "tools/LsanSuppressions.cpp",
849       "tools/ProcStats.cpp",
850       "tools/Resources.cpp",
851       "tools/ThermalManager.cpp",
852       "tools/UrlDataManager.cpp",
853       "tools/debugger/SkDebugCanvas.cpp",
854       "tools/debugger/SkDrawCommand.cpp",
855       "tools/debugger/SkJsonWriteBuffer.cpp",
856       "tools/debugger/SkObjectParser.cpp",
857       "tools/picture_utils.cpp",
858       "tools/random_parse_path.cpp",
859       "tools/sk_tool_utils.cpp",
860       "tools/sk_tool_utils_font.cpp",
861       "tools/timer/Timer.cpp",
862     ]
863     deps = [
864       ":common_flags",
865       ":flags",
866       "//third_party/libpng",
867     ]
868     public_deps = [
869       "//third_party/jsoncpp",
870     ]
871   }
872
873   import("gn/gm.gni")
874   test_lib("gm") {
875     public_include_dirs = [ "gm" ]
876     sources = gm_sources
877     deps = [
878       ":flags",
879       ":gpu_tool_utils",
880       ":skia",
881       ":tool_utils",
882     ]
883   }
884
885   import("gn/tests.gni")
886   test_lib("tests") {
887     public_include_dirs = [ "tests" ]
888     sources = tests_sources + pathops_tests_sources
889     if (!fontmgr_android_enabled) {
890       sources -= [ "//tests/FontMgrAndroidParserTest.cpp" ]
891     }
892     deps = [
893       ":experimental_svg_model",
894       ":flags",
895       ":gpu_tool_utils",
896       ":skia",
897       ":tool_utils",
898       "//third_party/libpng",
899       "//third_party/zlib",
900     ]
901   }
902
903   import("gn/bench.gni")
904   test_lib("bench") {
905     public_include_dirs = [ "bench" ]
906     sources = bench_sources
907     deps = [
908       ":flags",
909       ":gm",
910       ":gpu_tool_utils",
911       ":skia",
912       ":tool_utils",
913     ]
914   }
915
916   test_lib("experimental_svg_model") {
917     public_include_dirs = [ "experimental/svg/model" ]
918     sources = [
919       "experimental/svg/model/SkSVGAttribute.cpp",
920       "experimental/svg/model/SkSVGAttributeParser.cpp",
921       "experimental/svg/model/SkSVGCircle.cpp",
922       "experimental/svg/model/SkSVGContainer.cpp",
923       "experimental/svg/model/SkSVGDOM.cpp",
924       "experimental/svg/model/SkSVGEllipse.cpp",
925       "experimental/svg/model/SkSVGLine.cpp",
926       "experimental/svg/model/SkSVGLinearGradient.cpp",
927       "experimental/svg/model/SkSVGNode.cpp",
928       "experimental/svg/model/SkSVGPath.cpp",
929       "experimental/svg/model/SkSVGPoly.cpp",
930       "experimental/svg/model/SkSVGRect.cpp",
931       "experimental/svg/model/SkSVGRenderContext.cpp",
932       "experimental/svg/model/SkSVGSVG.cpp",
933       "experimental/svg/model/SkSVGShape.cpp",
934       "experimental/svg/model/SkSVGStop.cpp",
935       "experimental/svg/model/SkSVGTransformableNode.cpp",
936       "experimental/svg/model/SkSVGValue.cpp",
937     ]
938     deps = [
939       ":skia",
940     ]
941   }
942
943   test_lib("views") {
944     public_include_dirs = [ "include/views" ]
945     sources = [
946       "src/views/SkEvent.cpp",
947       "src/views/SkEventSink.cpp",
948       "src/views/SkOSMenu.cpp",
949       "src/views/SkTagList.cpp",
950       "src/views/SkTouchGesture.cpp",
951       "src/views/SkView.cpp",
952       "src/views/SkViewPriv.cpp",
953     ]
954     libs = []
955     if (!is_android) {
956       sources += [ "src/views/SkWindow.cpp" ]
957     }
958     if (is_linux) {
959       public_include_dirs += [ "src/views/unix" ]
960       sources += [
961         "src/views/unix/SkOSWindow_Unix.cpp",
962         "src/views/unix/keysym2ucs.c",
963       ]
964     } else if (is_mac) {
965       sources += [
966         "src/views/mac/SkEventNotifier.mm",
967         "src/views/mac/SkNSView.mm",
968         "src/views/mac/SkOSWindow_Mac.mm",
969         "src/views/mac/SkTextFieldCell.m",
970       ]
971       libs += [
972         "QuartzCore.framework",
973         "Cocoa.framework",
974         "Foundation.framework",
975       ]
976     } else if (is_win) {
977       sources += [ "src/views/win/SkOSWindow_win.cpp" ]
978     }
979   }
980
981   if (skia_use_lua) {
982     test_lib("lua") {
983       public_include_dirs = []
984       sources = [
985         "src/utils/SkLua.cpp",
986         "src/utils/SkLuaCanvas.cpp",
987       ]
988       deps = [
989         "//third_party/lua",
990       ]
991     }
992
993     executable("lua_app") {
994       sources = [
995         "tools/lua/lua_app.cpp",
996       ]
997       deps = [
998         ":lua",
999         ":skia",
1000         "//third_party/lua",
1001       ]
1002       testonly = true
1003     }
1004
1005     executable("lua_pictures") {
1006       sources = [
1007         "tools/lua/lua_pictures.cpp",
1008       ]
1009       deps = [
1010         ":flags",
1011         ":lua",
1012         ":skia",
1013         ":tool_utils",
1014         "//third_party/lua",
1015       ]
1016       testonly = true
1017     }
1018   }
1019
1020   import("gn/samples.gni")
1021   test_lib("samples") {
1022     public_include_dirs = [ "samplecode" ]
1023     include_dirs = [ "experimental" ]
1024     sources = samples_sources + [
1025                 "experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp",
1026                 "experimental/SkSetPoly3To3.cpp",
1027                 "experimental/SkSetPoly3To3_A.cpp",
1028                 "experimental/SkSetPoly3To3_D.cpp",
1029               ]
1030     deps = [
1031       ":experimental_svg_model",
1032       ":gm",
1033       ":tool_utils",
1034       ":views",
1035       ":xml",
1036     ]
1037
1038     if (skia_use_lua) {
1039       sources += [ "samplecode/SampleLua.cpp" ]
1040       deps += [
1041         ":lua",
1042         "//third_party/lua",
1043       ]
1044     }
1045   }
1046
1047   executable("dm") {
1048     sources = [
1049       "dm/DM.cpp",
1050       "dm/DMJsonWriter.cpp",
1051       "dm/DMSrcSink.cpp",
1052     ]
1053     include_dirs = [ "tests" ]
1054     deps = [
1055       ":common_flags",
1056       ":experimental_svg_model",
1057       ":flags",
1058       ":gm",
1059       ":gpu_tool_utils",
1060       ":skia",
1061       ":tests",
1062       ":tool_utils",
1063       "//third_party/jsoncpp",
1064       "//third_party/libpng",
1065     ]
1066     testonly = true
1067   }
1068
1069   if (!is_debug) {  # I've benchmarked debug code once too many times...
1070     executable("monobench") {
1071       sources = [
1072         "tools/monobench.cpp",
1073       ]
1074       deps = [
1075         ":bench",
1076         ":skia",
1077       ]
1078       testonly = true
1079     }
1080   }
1081
1082   executable("nanobench") {
1083     sources = [
1084       "bench/nanobench.cpp",
1085     ]
1086     deps = [
1087       ":bench",
1088       ":common_flags",
1089       ":experimental_svg_model",
1090       ":flags",
1091       ":gm",
1092       ":gpu_tool_utils",
1093       ":skia",
1094       ":tool_utils",
1095       "//third_party/jsoncpp",
1096     ]
1097     testonly = true
1098   }
1099
1100   if (is_linux || is_win || is_mac) {
1101     executable("SampleApp") {
1102       sources = [
1103         "samplecode/SampleApp.cpp",
1104         "samplecode/SamplePictFile.cpp",
1105       ]
1106       if (is_mac) {
1107         sources += [ "src/views/mac/skia_mac.mm" ]
1108       } else if (is_win) {
1109         sources += [ "src/views/win/skia_win.cpp" ]
1110       } else if (is_linux) {
1111         sources += [ "src/views/unix/skia_unix.cpp" ]
1112       }
1113       deps = [
1114         ":flags",
1115         ":gm",
1116         ":gpu_tool_utils",
1117         ":samples",
1118         ":skia",
1119         ":tool_utils",
1120         ":views",
1121       ]
1122       if (skia_use_angle) {
1123         deps += [ "//third_party/angle2" ]
1124       }
1125       testonly = true
1126     }
1127   }
1128
1129   if (skia_enable_gpu) {
1130     executable("skpbench") {
1131       sources = [
1132         "tools/skpbench/skpbench.cpp",
1133       ]
1134       deps = [
1135         ":flags",
1136         ":gpu_tool_utils",
1137         ":skia",
1138         ":tool_utils",
1139       ]
1140       testonly = true
1141     }
1142   }
1143
1144   # We can't yet build ICU on iOS or Windows.
1145   if (!is_ios && !is_win) {
1146     executable("sktexttopdf-hb") {
1147       sources = [
1148         "tools/SkShaper_harfbuzz.cpp",
1149         "tools/using_skia_and_harfbuzz.cpp",
1150       ]
1151       deps = [
1152         ":skia",
1153         "//third_party/harfbuzz",
1154       ]
1155       testonly = true
1156     }
1157   }
1158   executable("sktexttopdf") {
1159     sources = [
1160       "tools/SkShaper_primitive.cpp",
1161       "tools/using_skia_and_harfbuzz.cpp",
1162     ]
1163     deps = [
1164       ":skia",
1165     ]
1166     testonly = true
1167   }
1168
1169   executable("get_images_from_skps") {
1170     sources = [
1171       "tools/get_images_from_skps.cpp",
1172     ]
1173     deps = [
1174       ":flags",
1175       ":skia",
1176       "//third_party/jsoncpp",
1177     ]
1178     testonly = true
1179   }
1180
1181   executable("colorspaceinfo") {
1182     sources = [
1183       "tools/colorspaceinfo.cpp",
1184     ]
1185     deps = [
1186       ":flags",
1187       ":skia",
1188       ":tool_utils",
1189     ]
1190     testonly = true
1191   }
1192
1193   if (!is_ios) {
1194     executable("skiaserve") {
1195       sources = [
1196         "tools/skiaserve/Request.cpp",
1197         "tools/skiaserve/Response.cpp",
1198         "tools/skiaserve/skiaserve.cpp",
1199         "tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp",
1200         "tools/skiaserve/urlhandlers/BatchesHandler.cpp",
1201         "tools/skiaserve/urlhandlers/BreakHandler.cpp",
1202         "tools/skiaserve/urlhandlers/ClipAlphaHandler.cpp",
1203         "tools/skiaserve/urlhandlers/CmdHandler.cpp",
1204         "tools/skiaserve/urlhandlers/ColorModeHandler.cpp",
1205         "tools/skiaserve/urlhandlers/DataHandler.cpp",
1206         "tools/skiaserve/urlhandlers/DownloadHandler.cpp",
1207         "tools/skiaserve/urlhandlers/EnableGPUHandler.cpp",
1208         "tools/skiaserve/urlhandlers/ImgHandler.cpp",
1209         "tools/skiaserve/urlhandlers/InfoHandler.cpp",
1210         "tools/skiaserve/urlhandlers/OverdrawHandler.cpp",
1211         "tools/skiaserve/urlhandlers/PostHandler.cpp",
1212         "tools/skiaserve/urlhandlers/QuitHandler.cpp",
1213         "tools/skiaserve/urlhandlers/RootHandler.cpp",
1214       ]
1215       deps = [
1216         ":flags",
1217         ":gpu_tool_utils",
1218         ":skia",
1219         ":tool_utils",
1220         "//third_party/jsoncpp",
1221         "//third_party/libmicrohttpd",
1222         "//third_party/libpng",
1223       ]
1224       testonly = true
1225     }
1226   }
1227
1228   executable("fuzz") {
1229     sources = [
1230       "fuzz/FilterFuzz.cpp",
1231       "fuzz/FuzzGradients.cpp",
1232       "fuzz/FuzzParsePath.cpp",
1233       "fuzz/FuzzPathop.cpp",
1234       "fuzz/FuzzScaleToSides.cpp",
1235       "fuzz/fuzz.cpp",
1236     ]
1237     deps = [
1238       ":flags",
1239       ":skia",
1240     ]
1241     testonly = true
1242   }
1243
1244   executable("pathops_unittest") {
1245     sources = pathops_tests_sources + [
1246                 rebase_path("tests/skia_test.cpp"),
1247                 rebase_path("tests/Test.cpp"),
1248               ]
1249     deps = [
1250       ":flags",
1251       ":gpu_tool_utils",
1252       ":skia",
1253       ":tool_utils",
1254     ]
1255     testonly = true
1256   }
1257
1258   executable("dump_record") {
1259     sources = [
1260       "tools/DumpRecord.cpp",
1261       "tools/dump_record.cpp",
1262     ]
1263     deps = [
1264       ":flags",
1265       ":skia",
1266     ]
1267     testonly = true
1268   }
1269
1270   executable("skdiff") {
1271     sources = [
1272       "tools/skdiff/skdiff.cpp",
1273       "tools/skdiff/skdiff_html.cpp",
1274       "tools/skdiff/skdiff_main.cpp",
1275       "tools/skdiff/skdiff_utils.cpp",
1276     ]
1277     deps = [
1278       ":skia",
1279       ":tool_utils",
1280     ]
1281     testonly = true
1282   }
1283
1284   executable("skp_parser") {
1285     sources = [
1286       "tools/skp_parser.cpp",
1287     ]
1288     deps = [
1289       ":skia",
1290       ":tool_utils",
1291       "//third_party/jsoncpp",
1292     ]
1293     testonly = true
1294   }
1295
1296   if (skia_enable_gpu && (is_linux || is_win || is_mac)) {
1297     executable("viewer") {
1298       sources = [
1299         "tools/viewer/GMSlide.cpp",
1300         "tools/viewer/ImageSlide.cpp",
1301         "tools/viewer/SKPSlide.cpp",
1302         "tools/viewer/SampleSlide.cpp",
1303         "tools/viewer/Viewer.cpp",
1304         "tools/viewer/sk_app/CommandSet.cpp",
1305         "tools/viewer/sk_app/GLWindowContext.cpp",
1306         "tools/viewer/sk_app/Window.cpp",
1307         "tools/viewer/sk_app/WindowContext.cpp",
1308       ]
1309       libs = []
1310
1311       if (is_android) {
1312         sources += [
1313           "tools/viewer/sk_app/android/GLWindowContext_android.cpp",
1314           "tools/viewer/sk_app/android/RasterWindowContext_android.cpp",
1315           "tools/viewer/sk_app/android/Window_android.cpp",
1316           "tools/viewer/sk_app/android/main_android.cpp",
1317           "tools/viewer/sk_app/android/surface_glue_android.cpp",
1318         ]
1319       } else if (is_linux) {
1320         sources += [
1321           "tools/viewer/sk_app/unix/GLWindowContext_unix.cpp",
1322           "tools/viewer/sk_app/unix/RasterWindowContext_unix.cpp",
1323           "tools/viewer/sk_app/unix/Window_unix.cpp",
1324           "tools/viewer/sk_app/unix/main_unix.cpp",
1325         ]
1326       } else if (is_win) {
1327         sources += [
1328           "tools/viewer/sk_app/win/GLWindowContext_win.cpp",
1329           "tools/viewer/sk_app/win/RasterWindowContext_win.cpp",
1330           "tools/viewer/sk_app/win/Window_win.cpp",
1331           "tools/viewer/sk_app/win/main_win.cpp",
1332         ]
1333       } else if (is_mac) {
1334         sources += [
1335           "tools/viewer/sk_app/mac/GLWindowContext_mac.cpp",
1336           "tools/viewer/sk_app/mac/RasterWindowContext_mac.cpp",
1337           "tools/viewer/sk_app/mac/Window_mac.cpp",
1338           "tools/viewer/sk_app/mac/main_mac.cpp",
1339         ]
1340       }
1341
1342       if (skia_use_vulkan) {
1343         sources += [ "tools/viewer/sk_app/VulkanWindowContext.cpp" ]
1344         if (is_android) {
1345           sources +=
1346               [ "tools/viewer/sk_app/android/VulkanWindowContext_android.cpp" ]
1347           libs += [ "android" ]
1348         } else if (is_linux) {
1349           sources += [ "tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp" ]
1350           libs += [ "X11-xcb" ]
1351         } else if (is_win) {
1352           sources += [ "tools/viewer/sk_app/win/VulkanWindowContext_win.cpp" ]
1353         }
1354       }
1355
1356       include_dirs = []
1357       deps = [
1358         ":flags",
1359         ":gm",
1360         ":gpu_tool_utils",
1361         ":samples",
1362         ":skia",
1363         ":tool_utils",
1364         ":views",
1365         "//third_party/jsoncpp",
1366       ]
1367       if (is_android) {
1368         deps += [ "//third_party/native_app_glue" ]
1369       } else if (is_mac) {
1370         deps += [ "//third_party/libsdl" ]
1371       }
1372       testonly = true
1373     }
1374   }
1375
1376   if (skia_enable_gpu) {
1377     executable("skslc") {
1378       sources = [
1379         "src/sksl/SkSLMain.cpp",
1380       ]
1381       deps = [
1382         ":flags",
1383         ":skia",
1384       ]
1385       testonly = true
1386     }
1387   }
1388 }