Revert "Turn off /arch:AVX[2] on Windows builds."
[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   # This file (and all GN files in Skia) are designed to work with an
549   # empty sources assignment filter; we handle all that explicitly.
550   # We clear the filter here for clients who may have set up a global filter.
551   set_sources_assignment_filter([])
552
553   sources = []
554   sources += skia_core_sources
555   sources += skia_effects_sources
556   sources += skia_sksl_sources
557   sources += skia_utils_sources
558   sources += [
559     "src/android/SkBitmapRegionCodec.cpp",
560     "src/android/SkBitmapRegionDecoder.cpp",
561     "src/codec/SkAndroidCodec.cpp",
562     "src/codec/SkBmpCodec.cpp",
563     "src/codec/SkBmpMaskCodec.cpp",
564     "src/codec/SkBmpRLECodec.cpp",
565     "src/codec/SkBmpStandardCodec.cpp",
566     "src/codec/SkCodec.cpp",
567     "src/codec/SkCodecImageGenerator.cpp",
568     "src/codec/SkGifCodec.cpp",
569     "src/codec/SkMaskSwizzler.cpp",
570     "src/codec/SkMasks.cpp",
571     "src/codec/SkSampledCodec.cpp",
572     "src/codec/SkSampler.cpp",
573     "src/codec/SkStreamBuffer.cpp",
574     "src/codec/SkSwizzler.cpp",
575     "src/codec/SkWbmpCodec.cpp",
576     "src/images/SkImageEncoder.cpp",
577     "src/images/SkImageEncoder_Factory.cpp",
578     "src/images/SkKTXImageEncoder.cpp",
579     "src/ports/SkDiscardableMemory_none.cpp",
580     "src/ports/SkGlobalInitialization_default.cpp",
581     "src/ports/SkImageGenerator_skia.cpp",
582     "src/ports/SkMemory_malloc.cpp",
583     "src/ports/SkOSFile_stdio.cpp",
584     "src/sfnt/SkOTTable_name.cpp",
585     "src/sfnt/SkOTUtils.cpp",
586     "src/svg/SkSVGCanvas.cpp",
587     "src/svg/SkSVGDevice.cpp",
588     "src/utils/mac/SkStream_mac.cpp",
589     "third_party/etc1/etc1.cpp",
590     "third_party/gif/SkGifImageReader.cpp",
591     "third_party/ktx/ktx.cpp",
592   ]
593
594   libs = []
595
596   if (is_win) {
597     sources += [
598       "src/fonts/SkFontMgr_indirect.cpp",
599       "src/ports/SkDebug_win.cpp",
600       "src/ports/SkFontHost_win.cpp",
601       "src/ports/SkFontMgr_win_dw.cpp",
602       "src/ports/SkImageEncoder_WIC.cpp",
603       "src/ports/SkImageGeneratorWIC.cpp",
604       "src/ports/SkOSFile_win.cpp",
605       "src/ports/SkOSLibrary_win.cpp",
606       "src/ports/SkScalerContext_win_dw.cpp",
607       "src/ports/SkTLS_win.cpp",
608       "src/ports/SkTypeface_win_dw.cpp",
609       "src/xps/SkDocument_XPS.cpp",
610       "src/xps/SkXPSDevice.cpp",
611     ]
612     if (skia_use_gdi) {
613       sources += [ "src/ports/SkFontMgr_win_gdi_factory.cpp" ]
614       libs += [
615         "Gdi32.lib",
616         "Usp10.lib",
617       ]
618     } else {
619       sources += [ "src/ports/SkFontMgr_win_dw_factory.cpp" ]
620     }
621     sources -=
622         [ get_path_info("src/utils/SkThreadUtils_pthread.cpp", "abspath") ]
623     libs += [
624       "FontSub.lib",
625       "Ole32.lib",
626       "OleAut32.lib",
627       "User32.lib",
628     ]
629   } else {
630     sources += [
631       "src/ports/SkOSFile_posix.cpp",
632       "src/ports/SkOSLibrary_posix.cpp",
633       "src/ports/SkTLS_pthread.cpp",
634       "src/xps/SkDocument_XPS_None.cpp",
635     ]
636   }
637
638   if (is_android) {
639     deps += [
640       "//third_party/cpu-features",
641       "//third_party/expat",
642     ]
643     sources += [ "src/ports/SkDebug_android.cpp" ]
644     libs += [
645       "EGL",
646       "GLESv2",
647       "log",
648     ]
649   }
650
651   if (is_linux) {
652     libs += [
653       "GL",
654       "GLU",
655       "X11",
656     ]
657     sources += [ "src/ports/SkDebug_stdio.cpp" ]
658   }
659
660   if (is_mac) {
661     sources += [
662       "src/ports/SkDebug_stdio.cpp",
663       "src/ports/SkFontHost_mac.cpp",
664       "src/ports/SkImageEncoder_CG.cpp",
665       "src/ports/SkImageGeneratorCG.cpp",
666     ]
667     libs += [
668       "ApplicationServices.framework",
669       "OpenGL.framework",
670     ]
671   }
672
673   if (is_ios) {
674     sources += [
675       "src/ports/SkDebug_stdio.cpp",
676       "src/ports/SkFontHost_mac.cpp",
677       "src/ports/SkImageEncoder_CG.cpp",
678       "src/ports/SkImageGeneratorCG.cpp",
679     ]
680     libs += [
681       "CoreFoundation.framework",
682       "CoreGraphics.framework",
683       "CoreText.framework",
684       "ImageIO.framework",
685       "MobileCoreServices.framework",
686     ]
687   }
688
689   if (is_fuchsia) {
690     sources += [ "src/ports/SkDebug_stdio.cpp" ]
691   }
692 }
693
694 # Targets guarded by skia_enable_tools may use //third_party freely.
695 if (skia_enable_tools) {
696   config("skia.h_config") {
697     include_dirs = [ "$target_gen_dir" ]
698   }
699   action("skia.h") {
700     public_configs = [ ":skia.h_config" ]
701     skia_h = "$target_gen_dir/skia.h"
702     script = "gn/find_headers.py"
703     args = [ rebase_path(skia_h, root_build_dir) ] +
704            rebase_path(skia_public_includes)
705     depfile = "$skia_h.deps"
706     outputs = [
707       skia_h,
708     ]
709   }
710
711   if (skia_enable_gpu && target_cpu == "x64") {
712     # Our bots only have 64-bit libOSMesa installed.
713     # TODO: worth fixing?
714     executable("fiddle") {
715       libs = []
716       if (is_linux) {
717         libs += [ "OSMesa" ]
718       }
719
720       sources = [
721         "src/images/SkForceLinking.cpp",
722         "tools/fiddle/draw.cpp",
723         "tools/fiddle/fiddle_main.cpp",
724       ]
725       deps = [
726         ":skia",
727         ":skia.h",
728       ]
729     }
730   }
731
732   if (skia_enable_gpu) {
733     source_set("public_headers_warnings_check") {
734       sources = [
735         "tools/public_headers_warnings_check.cpp",
736       ]
737       configs -= [ "//gn:warnings_except_public_headers" ]
738       deps = [
739         ":skia",
740         ":skia.h",
741       ]
742     }
743   }
744
745   template("test_lib") {
746     config(target_name + "_config") {
747       include_dirs = invoker.public_include_dirs
748       if (defined(invoker.public_defines)) {
749         defines = invoker.public_defines
750       }
751     }
752     source_set(target_name) {
753       forward_variables_from(invoker, "*", [ "public_include_dirs" ])
754       public_configs = [
755         ":" + target_name + "_config",
756         ":skia_private",
757       ]
758
759       if (!defined(deps)) {
760         deps = []
761       }
762       deps += [ ":skia" ]
763       testonly = true
764     }
765   }
766
767   test_lib("gpu_tool_utils") {
768     public_include_dirs = []
769     if (skia_enable_gpu) {
770       public_defines = []
771       public_include_dirs += [ "tools/gpu" ]
772
773       deps = []
774       sources = [
775         "tools/gpu/GrContextFactory.cpp",
776         "tools/gpu/GrTest.cpp",
777         "tools/gpu/TestContext.cpp",
778         "tools/gpu/gl/GLTestContext.cpp",
779         "tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp",
780         "tools/gpu/gl/debug/DebugGLTestContext.cpp",
781         "tools/gpu/gl/debug/GrBufferObj.cpp",
782         "tools/gpu/gl/debug/GrFrameBufferObj.cpp",
783         "tools/gpu/gl/debug/GrProgramObj.cpp",
784         "tools/gpu/gl/debug/GrShaderObj.cpp",
785         "tools/gpu/gl/debug/GrTextureObj.cpp",
786         "tools/gpu/gl/debug/GrTextureUnitObj.cpp",
787         "tools/gpu/gl/null/NullGLTestContext.cpp",
788       ]
789       libs = []
790
791       if (is_android) {
792         sources += [ "tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp" ]
793       } else if (is_ios) {
794         sources += [ "tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm" ]
795         libs += [ "OpenGLES.framework" ]
796       } else if (is_linux) {
797         sources += [ "tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp" ]
798       } else if (is_mac) {
799         sources += [ "tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp" ]
800       } else if (is_win) {
801         sources += [ "tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp" ]
802         libs += [
803           "Gdi32.lib",
804           "OpenGL32.lib",
805         ]
806       }
807
808       if (skia_use_angle) {
809         public_defines += [ "SK_ANGLE" ]
810         deps += [ "//third_party/angle2" ]
811         sources += [ "tools/gpu/gl/angle/GLTestContext_angle.cpp" ]
812       }
813       if (skia_use_mesa) {
814         public_defines += [ "SK_MESA" ]
815         sources += [ "tools/gpu/gl/mesa/GLTestContext_mesa.cpp" ]
816         libs += [ "OSMesa" ]
817       }
818       if (skia_use_vulkan) {
819         sources += [ "tools/gpu/vk/VkTestContext.cpp" ]
820       }
821     }
822   }
823
824   test_lib("flags") {
825     public_include_dirs = [ "tools/flags" ]
826     sources = [
827       "tools/flags/SkCommandLineFlags.cpp",
828     ]
829   }
830   test_lib("common_flags") {
831     public_include_dirs = [ "tools/flags" ]
832     sources = [
833       "tools/flags/SkCommonFlags.cpp",
834       "tools/flags/SkCommonFlagsConfig.cpp",
835     ]
836     deps = [
837       ":flags",
838       ":gpu_tool_utils",
839     ]
840   }
841
842   test_lib("tool_utils") {
843     public_include_dirs = [
844       "tools",
845       "tools/debugger",
846       "tools/timer",
847     ]
848     sources = [
849       "src/images/SkForceLinking.cpp",
850       "src/utils/SkMultiPictureDocumentReader.cpp",  # TODO(halcanary): move to tools?
851       "tools/AndroidSkDebugToStdOut.cpp",
852       "tools/CrashHandler.cpp",
853       "tools/LsanSuppressions.cpp",
854       "tools/ProcStats.cpp",
855       "tools/Resources.cpp",
856       "tools/ThermalManager.cpp",
857       "tools/UrlDataManager.cpp",
858       "tools/debugger/SkDebugCanvas.cpp",
859       "tools/debugger/SkDrawCommand.cpp",
860       "tools/debugger/SkJsonWriteBuffer.cpp",
861       "tools/debugger/SkObjectParser.cpp",
862       "tools/picture_utils.cpp",
863       "tools/random_parse_path.cpp",
864       "tools/sk_tool_utils.cpp",
865       "tools/sk_tool_utils_font.cpp",
866       "tools/timer/Timer.cpp",
867     ]
868     deps = [
869       ":common_flags",
870       ":flags",
871       "//third_party/libpng",
872     ]
873     public_deps = [
874       "//third_party/jsoncpp",
875     ]
876   }
877
878   import("gn/gm.gni")
879   test_lib("gm") {
880     public_include_dirs = [ "gm" ]
881     sources = gm_sources
882     deps = [
883       ":flags",
884       ":gpu_tool_utils",
885       ":skia",
886       ":tool_utils",
887     ]
888   }
889
890   import("gn/tests.gni")
891   test_lib("tests") {
892     public_include_dirs = [ "tests" ]
893     sources = tests_sources + pathops_tests_sources
894     if (!fontmgr_android_enabled) {
895       sources -= [ "//tests/FontMgrAndroidParserTest.cpp" ]
896     }
897     deps = [
898       ":experimental_svg_model",
899       ":flags",
900       ":gpu_tool_utils",
901       ":skia",
902       ":tool_utils",
903       "//third_party/libpng",
904       "//third_party/zlib",
905     ]
906   }
907
908   import("gn/bench.gni")
909   test_lib("bench") {
910     public_include_dirs = [ "bench" ]
911     sources = bench_sources
912     deps = [
913       ":flags",
914       ":gm",
915       ":gpu_tool_utils",
916       ":skia",
917       ":tool_utils",
918     ]
919   }
920
921   test_lib("experimental_svg_model") {
922     public_include_dirs = [ "experimental/svg/model" ]
923     sources = [
924       "experimental/svg/model/SkSVGAttribute.cpp",
925       "experimental/svg/model/SkSVGAttributeParser.cpp",
926       "experimental/svg/model/SkSVGCircle.cpp",
927       "experimental/svg/model/SkSVGContainer.cpp",
928       "experimental/svg/model/SkSVGDOM.cpp",
929       "experimental/svg/model/SkSVGEllipse.cpp",
930       "experimental/svg/model/SkSVGLine.cpp",
931       "experimental/svg/model/SkSVGLinearGradient.cpp",
932       "experimental/svg/model/SkSVGNode.cpp",
933       "experimental/svg/model/SkSVGPath.cpp",
934       "experimental/svg/model/SkSVGPoly.cpp",
935       "experimental/svg/model/SkSVGRect.cpp",
936       "experimental/svg/model/SkSVGRenderContext.cpp",
937       "experimental/svg/model/SkSVGSVG.cpp",
938       "experimental/svg/model/SkSVGShape.cpp",
939       "experimental/svg/model/SkSVGStop.cpp",
940       "experimental/svg/model/SkSVGTransformableNode.cpp",
941       "experimental/svg/model/SkSVGValue.cpp",
942     ]
943     deps = [
944       ":skia",
945     ]
946   }
947
948   test_lib("views") {
949     public_include_dirs = [ "include/views" ]
950     sources = [
951       "src/views/SkEvent.cpp",
952       "src/views/SkEventSink.cpp",
953       "src/views/SkOSMenu.cpp",
954       "src/views/SkTagList.cpp",
955       "src/views/SkTouchGesture.cpp",
956       "src/views/SkView.cpp",
957       "src/views/SkViewPriv.cpp",
958     ]
959     libs = []
960     if (!is_android) {
961       sources += [ "src/views/SkWindow.cpp" ]
962     }
963     if (is_linux) {
964       public_include_dirs += [ "src/views/unix" ]
965       sources += [
966         "src/views/unix/SkOSWindow_Unix.cpp",
967         "src/views/unix/keysym2ucs.c",
968       ]
969     } else if (is_mac) {
970       sources += [
971         "src/views/mac/SkEventNotifier.mm",
972         "src/views/mac/SkNSView.mm",
973         "src/views/mac/SkOSWindow_Mac.mm",
974         "src/views/mac/SkTextFieldCell.m",
975       ]
976       libs += [
977         "QuartzCore.framework",
978         "Cocoa.framework",
979         "Foundation.framework",
980       ]
981     } else if (is_win) {
982       sources += [ "src/views/win/SkOSWindow_win.cpp" ]
983     }
984   }
985
986   if (skia_use_lua) {
987     test_lib("lua") {
988       public_include_dirs = []
989       sources = [
990         "src/utils/SkLua.cpp",
991         "src/utils/SkLuaCanvas.cpp",
992       ]
993       deps = [
994         "//third_party/lua",
995       ]
996     }
997
998     executable("lua_app") {
999       sources = [
1000         "tools/lua/lua_app.cpp",
1001       ]
1002       deps = [
1003         ":lua",
1004         ":skia",
1005         "//third_party/lua",
1006       ]
1007       testonly = true
1008     }
1009
1010     executable("lua_pictures") {
1011       sources = [
1012         "tools/lua/lua_pictures.cpp",
1013       ]
1014       deps = [
1015         ":flags",
1016         ":lua",
1017         ":skia",
1018         ":tool_utils",
1019         "//third_party/lua",
1020       ]
1021       testonly = true
1022     }
1023   }
1024
1025   import("gn/samples.gni")
1026   test_lib("samples") {
1027     public_include_dirs = [ "samplecode" ]
1028     include_dirs = [ "experimental" ]
1029     sources = samples_sources + [
1030                 "experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp",
1031                 "experimental/SkSetPoly3To3.cpp",
1032                 "experimental/SkSetPoly3To3_A.cpp",
1033                 "experimental/SkSetPoly3To3_D.cpp",
1034               ]
1035     deps = [
1036       ":experimental_svg_model",
1037       ":gm",
1038       ":tool_utils",
1039       ":views",
1040       ":xml",
1041     ]
1042
1043     if (skia_use_lua) {
1044       sources += [ "samplecode/SampleLua.cpp" ]
1045       deps += [
1046         ":lua",
1047         "//third_party/lua",
1048       ]
1049     }
1050   }
1051
1052   executable("dm") {
1053     sources = [
1054       "dm/DM.cpp",
1055       "dm/DMJsonWriter.cpp",
1056       "dm/DMSrcSink.cpp",
1057     ]
1058     include_dirs = [ "tests" ]
1059     deps = [
1060       ":common_flags",
1061       ":experimental_svg_model",
1062       ":flags",
1063       ":gm",
1064       ":gpu_tool_utils",
1065       ":skia",
1066       ":tests",
1067       ":tool_utils",
1068       "//third_party/jsoncpp",
1069       "//third_party/libpng",
1070     ]
1071     testonly = true
1072   }
1073
1074   if (!is_debug) {  # I've benchmarked debug code once too many times...
1075     executable("monobench") {
1076       sources = [
1077         "tools/monobench.cpp",
1078       ]
1079       deps = [
1080         ":bench",
1081         ":skia",
1082       ]
1083       testonly = true
1084     }
1085   }
1086
1087   executable("nanobench") {
1088     sources = [
1089       "bench/nanobench.cpp",
1090     ]
1091     deps = [
1092       ":bench",
1093       ":common_flags",
1094       ":experimental_svg_model",
1095       ":flags",
1096       ":gm",
1097       ":gpu_tool_utils",
1098       ":skia",
1099       ":tool_utils",
1100       "//third_party/jsoncpp",
1101     ]
1102     testonly = true
1103   }
1104
1105   if (is_linux || is_win || is_mac) {
1106     executable("SampleApp") {
1107       sources = [
1108         "samplecode/SampleApp.cpp",
1109         "samplecode/SamplePictFile.cpp",
1110       ]
1111       if (is_mac) {
1112         sources += [ "src/views/mac/skia_mac.mm" ]
1113       } else if (is_win) {
1114         sources += [ "src/views/win/skia_win.cpp" ]
1115       } else if (is_linux) {
1116         sources += [ "src/views/unix/skia_unix.cpp" ]
1117       }
1118       deps = [
1119         ":flags",
1120         ":gm",
1121         ":gpu_tool_utils",
1122         ":samples",
1123         ":skia",
1124         ":tool_utils",
1125         ":views",
1126       ]
1127       if (skia_use_angle) {
1128         deps += [ "//third_party/angle2" ]
1129       }
1130       testonly = true
1131     }
1132   }
1133
1134   if (skia_enable_gpu) {
1135     executable("skpbench") {
1136       sources = [
1137         "tools/skpbench/skpbench.cpp",
1138       ]
1139       deps = [
1140         ":flags",
1141         ":gpu_tool_utils",
1142         ":skia",
1143         ":tool_utils",
1144       ]
1145       testonly = true
1146     }
1147   }
1148
1149   # We can't yet build ICU on iOS or Windows.
1150   if (!is_ios && !is_win) {
1151     executable("sktexttopdf-hb") {
1152       sources = [
1153         "tools/SkShaper_harfbuzz.cpp",
1154         "tools/using_skia_and_harfbuzz.cpp",
1155       ]
1156       deps = [
1157         ":skia",
1158         "//third_party/harfbuzz",
1159       ]
1160       testonly = true
1161     }
1162   }
1163   executable("sktexttopdf") {
1164     sources = [
1165       "tools/SkShaper_primitive.cpp",
1166       "tools/using_skia_and_harfbuzz.cpp",
1167     ]
1168     deps = [
1169       ":skia",
1170     ]
1171     testonly = true
1172   }
1173
1174   executable("get_images_from_skps") {
1175     sources = [
1176       "tools/get_images_from_skps.cpp",
1177     ]
1178     deps = [
1179       ":flags",
1180       ":skia",
1181       "//third_party/jsoncpp",
1182     ]
1183     testonly = true
1184   }
1185
1186   executable("colorspaceinfo") {
1187     sources = [
1188       "tools/colorspaceinfo.cpp",
1189     ]
1190     deps = [
1191       ":flags",
1192       ":skia",
1193       ":tool_utils",
1194     ]
1195     testonly = true
1196   }
1197
1198   if (!is_ios) {
1199     executable("skiaserve") {
1200       sources = [
1201         "tools/skiaserve/Request.cpp",
1202         "tools/skiaserve/Response.cpp",
1203         "tools/skiaserve/skiaserve.cpp",
1204         "tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp",
1205         "tools/skiaserve/urlhandlers/BatchesHandler.cpp",
1206         "tools/skiaserve/urlhandlers/BreakHandler.cpp",
1207         "tools/skiaserve/urlhandlers/ClipAlphaHandler.cpp",
1208         "tools/skiaserve/urlhandlers/CmdHandler.cpp",
1209         "tools/skiaserve/urlhandlers/ColorModeHandler.cpp",
1210         "tools/skiaserve/urlhandlers/DataHandler.cpp",
1211         "tools/skiaserve/urlhandlers/DownloadHandler.cpp",
1212         "tools/skiaserve/urlhandlers/EnableGPUHandler.cpp",
1213         "tools/skiaserve/urlhandlers/ImgHandler.cpp",
1214         "tools/skiaserve/urlhandlers/InfoHandler.cpp",
1215         "tools/skiaserve/urlhandlers/OverdrawHandler.cpp",
1216         "tools/skiaserve/urlhandlers/PostHandler.cpp",
1217         "tools/skiaserve/urlhandlers/QuitHandler.cpp",
1218         "tools/skiaserve/urlhandlers/RootHandler.cpp",
1219       ]
1220       deps = [
1221         ":flags",
1222         ":gpu_tool_utils",
1223         ":skia",
1224         ":tool_utils",
1225         "//third_party/jsoncpp",
1226         "//third_party/libmicrohttpd",
1227         "//third_party/libpng",
1228       ]
1229       testonly = true
1230     }
1231   }
1232
1233   executable("fuzz") {
1234     sources = [
1235       "fuzz/FilterFuzz.cpp",
1236       "fuzz/FuzzGradients.cpp",
1237       "fuzz/FuzzParsePath.cpp",
1238       "fuzz/FuzzPathop.cpp",
1239       "fuzz/FuzzScaleToSides.cpp",
1240       "fuzz/fuzz.cpp",
1241     ]
1242     deps = [
1243       ":flags",
1244       ":skia",
1245     ]
1246     testonly = true
1247   }
1248
1249   executable("pathops_unittest") {
1250     sources = pathops_tests_sources + [
1251                 rebase_path("tests/skia_test.cpp"),
1252                 rebase_path("tests/Test.cpp"),
1253               ]
1254     deps = [
1255       ":flags",
1256       ":gpu_tool_utils",
1257       ":skia",
1258       ":tool_utils",
1259     ]
1260     testonly = true
1261   }
1262
1263   executable("dump_record") {
1264     sources = [
1265       "tools/DumpRecord.cpp",
1266       "tools/dump_record.cpp",
1267     ]
1268     deps = [
1269       ":flags",
1270       ":skia",
1271     ]
1272     testonly = true
1273   }
1274
1275   executable("skdiff") {
1276     sources = [
1277       "tools/skdiff/skdiff.cpp",
1278       "tools/skdiff/skdiff_html.cpp",
1279       "tools/skdiff/skdiff_main.cpp",
1280       "tools/skdiff/skdiff_utils.cpp",
1281     ]
1282     deps = [
1283       ":skia",
1284       ":tool_utils",
1285     ]
1286     testonly = true
1287   }
1288
1289   executable("skp_parser") {
1290     sources = [
1291       "tools/skp_parser.cpp",
1292     ]
1293     deps = [
1294       ":skia",
1295       ":tool_utils",
1296       "//third_party/jsoncpp",
1297     ]
1298     testonly = true
1299   }
1300
1301   if (skia_enable_gpu && (is_linux || is_win || is_mac)) {
1302     executable("viewer") {
1303       sources = [
1304         "tools/viewer/GMSlide.cpp",
1305         "tools/viewer/ImageSlide.cpp",
1306         "tools/viewer/SKPSlide.cpp",
1307         "tools/viewer/SampleSlide.cpp",
1308         "tools/viewer/Viewer.cpp",
1309         "tools/viewer/sk_app/CommandSet.cpp",
1310         "tools/viewer/sk_app/GLWindowContext.cpp",
1311         "tools/viewer/sk_app/Window.cpp",
1312         "tools/viewer/sk_app/WindowContext.cpp",
1313       ]
1314       libs = []
1315
1316       if (is_android) {
1317         sources += [
1318           "tools/viewer/sk_app/android/GLWindowContext_android.cpp",
1319           "tools/viewer/sk_app/android/RasterWindowContext_android.cpp",
1320           "tools/viewer/sk_app/android/Window_android.cpp",
1321           "tools/viewer/sk_app/android/main_android.cpp",
1322           "tools/viewer/sk_app/android/surface_glue_android.cpp",
1323         ]
1324       } else if (is_linux) {
1325         sources += [
1326           "tools/viewer/sk_app/unix/GLWindowContext_unix.cpp",
1327           "tools/viewer/sk_app/unix/RasterWindowContext_unix.cpp",
1328           "tools/viewer/sk_app/unix/Window_unix.cpp",
1329           "tools/viewer/sk_app/unix/main_unix.cpp",
1330         ]
1331       } else if (is_win) {
1332         sources += [
1333           "tools/viewer/sk_app/win/GLWindowContext_win.cpp",
1334           "tools/viewer/sk_app/win/RasterWindowContext_win.cpp",
1335           "tools/viewer/sk_app/win/Window_win.cpp",
1336           "tools/viewer/sk_app/win/main_win.cpp",
1337         ]
1338       } else if (is_mac) {
1339         sources += [
1340           "tools/viewer/sk_app/mac/GLWindowContext_mac.cpp",
1341           "tools/viewer/sk_app/mac/RasterWindowContext_mac.cpp",
1342           "tools/viewer/sk_app/mac/Window_mac.cpp",
1343           "tools/viewer/sk_app/mac/main_mac.cpp",
1344         ]
1345       }
1346
1347       if (skia_use_vulkan) {
1348         sources += [ "tools/viewer/sk_app/VulkanWindowContext.cpp" ]
1349         if (is_android) {
1350           sources +=
1351               [ "tools/viewer/sk_app/android/VulkanWindowContext_android.cpp" ]
1352           libs += [ "android" ]
1353         } else if (is_linux) {
1354           sources += [ "tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp" ]
1355           libs += [ "X11-xcb" ]
1356         } else if (is_win) {
1357           sources += [ "tools/viewer/sk_app/win/VulkanWindowContext_win.cpp" ]
1358         }
1359       }
1360
1361       include_dirs = []
1362       deps = [
1363         ":flags",
1364         ":gm",
1365         ":gpu_tool_utils",
1366         ":samples",
1367         ":skia",
1368         ":tool_utils",
1369         ":views",
1370         "//third_party/jsoncpp",
1371       ]
1372       if (is_android) {
1373         deps += [ "//third_party/native_app_glue" ]
1374       } else if (is_mac) {
1375         deps += [ "//third_party/libsdl" ]
1376       }
1377       testonly = true
1378     }
1379   }
1380
1381   if (skia_enable_gpu) {
1382     executable("skslc") {
1383       sources = [
1384         "src/sksl/SkSLMain.cpp",
1385       ]
1386       deps = [
1387         ":flags",
1388         ":skia",
1389       ]
1390       testonly = true
1391     }
1392   }
1393 }