1################################################################################
2# Skylark macros
3################################################################################
4
5is_bazel = not hasattr(native, "genmpm")
6
7def portable_select(select_dict, bazel_condition, default_condition):
8    """Replaces select() with a Bazel-friendly wrapper.
9
10    Args:
11      select_dict: Dictionary in the same format as select().
12    Returns:
13      If Blaze platform, returns select() using select_dict.
14      If Bazel platform, returns dependencies for condition
15          bazel_condition, or empty list if none specified.
16    """
17    if is_bazel:
18        return select_dict.get(bazel_condition, select_dict[default_condition])
19    else:
20        return select(select_dict)
21
22def skia_select(conditions, results):
23    """Replaces select() for conditions [UNIX, ANDROID, IOS]
24
25    Args:
26      conditions: [CONDITION_UNIX, CONDITION_ANDROID, CONDITION_IOS]
27      results: [RESULT_UNIX, RESULT_ANDROID, RESULT_IOS]
28    Returns:
29      The result matching the platform condition.
30    """
31    if len(conditions) != 3 or len(results) != 3:
32        fail("Must provide exactly 3 conditions and 3 results")
33
34    selector = {}
35    for i in range(3):
36        selector[conditions[i]] = results[i]
37    return portable_select(selector, conditions[2], conditions[0])
38
39def skia_glob(srcs):
40    """Replaces glob() with a version that accepts a struct.
41
42    Args:
43      srcs: struct(include=[], exclude=[])
44    Returns:
45      Equivalent of glob(srcs.include, exclude=srcs.exclude)
46    """
47    if hasattr(srcs, "include"):
48        if hasattr(srcs, "exclude"):
49            return native.glob(srcs.include, exclude = srcs.exclude)
50        else:
51            return native.glob(srcs.include)
52    return []
53
54################################################################################
55## skia_{all,public}_hdrs()
56################################################################################
57def skia_all_hdrs():
58    return native.glob([
59        "src/**/*.h",
60        "include/**/*.h",
61        "third_party/**/*.h",
62    ])
63
64def skia_public_hdrs():
65    return native.glob(
66        ["include/**/*.h"],
67        exclude = [
68            "include/private/**/*",
69        ],
70    )
71
72################################################################################
73## skia_opts_srcs()
74################################################################################
75# Intel
76SKIA_OPTS_SSE2 = "SSE2"
77
78SKIA_OPTS_SSSE3 = "SSSE3"
79
80SKIA_OPTS_SSE41 = "SSE41"
81
82SKIA_OPTS_SSE42 = "SSE42"
83
84SKIA_OPTS_AVX = "AVX"
85
86SKIA_OPTS_HSW = "HSW"
87
88# Arm
89SKIA_OPTS_NEON = "NEON"
90
91SKIA_OPTS_CRC32 = "CRC32"  # arm64
92
93def opts_srcs(opts):
94    if opts == SKIA_OPTS_SSE2:
95        return native.glob([
96            "src/opts/*_SSE2.cpp",
97            "src/opts/*_sse2.cpp",  # No matches currently.
98        ])
99    elif opts == SKIA_OPTS_SSSE3:
100        return native.glob([
101            "src/opts/*_SSSE3.cpp",
102            "src/opts/*_ssse3.cpp",
103        ])
104    elif opts == SKIA_OPTS_SSE41:
105        return native.glob([
106            "src/opts/*_sse41.cpp",
107        ])
108    elif opts == SKIA_OPTS_SSE42:
109        return native.glob([
110            "src/opts/*_sse42.cpp",
111        ])
112    elif opts == SKIA_OPTS_AVX:
113        return native.glob([
114            "src/opts/*_avx.cpp",
115        ])
116    elif opts == SKIA_OPTS_HSW:
117        return native.glob([
118            "src/opts/*_hsw.cpp",
119        ])
120    elif opts == SKIA_OPTS_NEON:
121        return native.glob([
122            "src/opts/*_neon.cpp",
123        ])
124    elif opts == SKIA_OPTS_CRC32:
125        return native.glob([
126            "src/opts/*_crc32.cpp",
127        ])
128    else:
129        fail("skia_opts_srcs parameter 'opts' must be one of SKIA_OPTS_*.")
130
131def opts_cflags(opts):
132    if opts == SKIA_OPTS_SSE2:
133        return ["-msse2"]
134    elif opts == SKIA_OPTS_SSSE3:
135        return ["-mssse3"]
136    elif opts == SKIA_OPTS_SSE41:
137        return ["-msse4.1"]
138    elif opts == SKIA_OPTS_SSE42:
139        return ["-msse4.2"]
140    elif opts == SKIA_OPTS_AVX:
141        return ["-mavx"]
142    elif opts == SKIA_OPTS_HSW:
143        return ["-mavx2", "-mf16c", "-mfma"]
144    elif opts == SKIA_OPTS_NEON:
145        return ["-mfpu=neon"]
146    elif opts == SKIA_OPTS_CRC32:
147        # NDK r11's Clang (3.8) doesn't pass along this -march setting correctly to an external
148        # assembler, so we do it manually with -Wa.  This is just a bug, fixed in later Clangs.
149        return ["-march=armv8-a+crc", "-Wa,-march=armv8-a+crc"]
150    else:
151        return []
152
153SKIA_CPU_ARM = "ARM"
154
155SKIA_CPU_ARM64 = "ARM64"
156
157SKIA_CPU_X86 = "X86"
158
159SKIA_CPU_OTHER = "OTHER"
160
161def opts_rest_srcs(cpu):
162    srcs = []
163    if cpu == SKIA_CPU_ARM or cpu == SKIA_CPU_ARM64:
164        srcs += native.glob([
165            "src/opts/*_arm.cpp",
166            "src/opts/SkBitmapProcState_opts_none.cpp",
167        ])
168        if cpu == SKIA_CPU_ARM64:
169            # NEON doesn't need special flags to compile on ARM64.
170            srcs += native.glob([
171                "src/opts/*_neon.cpp",
172            ])
173    elif cpu == SKIA_CPU_X86:
174        srcs += native.glob([
175            "src/opts/*_x86.cpp",
176        ])
177    elif cpu == SKIA_CPU_OTHER:
178        srcs += native.glob([
179            "src/opts/*_none.cpp",
180        ])
181    else:
182        fail("opts_rest_srcs parameter 'cpu' must be one of " +
183             "SKIA_CPU_{ARM,ARM64,X86,OTHER}.")
184    return srcs
185
186def skia_opts_deps(cpu):
187    res = [":opts_rest"]
188
189    if cpu == SKIA_CPU_ARM:
190        res += [":opts_neon"]
191
192    if cpu == SKIA_CPU_ARM64:
193        res += [":opts_crc32"]
194
195    if cpu == SKIA_CPU_X86:
196        res += [
197            ":opts_sse2",
198            ":opts_ssse3",
199            ":opts_sse41",
200            ":opts_sse42",
201            ":opts_avx",
202            ":opts_hsw",
203        ]
204
205    return res
206
207################################################################################
208## BASE_SRCS
209################################################################################
210
211# All platform-independent SRCS.
212BASE_SRCS_ALL = struct(
213    include = [
214        "include/private/**/*.h",
215        "src/**/*.h",
216        "src/**/*.cpp",
217        "src/**/*.inc",
218    ],
219    exclude = [
220        # Exclude platform-dependent files.
221        "src/codec/*",
222        "src/device/xps/*",  # Windows-only. Move to ports?
223        "src/doc/*_XPS.cpp",  # Windows-only. Move to ports?
224        "src/gpu/gl/android/*",
225        "src/gpu/gl/egl/*",
226        "src/gpu/gl/glfw/*",
227        "src/gpu/gl/glx/*",
228        "src/gpu/gl/iOS/*",
229        "src/gpu/gl/mac/*",
230        "src/gpu/gl/win/*",
231        "src/opts/**/*",
232        "src/ports/**/*",
233        "src/utils/android/**/*",
234        "src/utils/mac/**/*",
235        "src/utils/win/**/*",
236
237        # Exclude multiple definitions.
238        "src/core/SkPicture_none.cpp",
239        "src/gpu/GrPathRendering_none.cpp",
240        "src/gpu/ccpr/GrCoverageCountingPathRenderer_none.cpp",
241        "src/gpu/gl/GrGLMakeNativeInterface_none.cpp",
242        "src/pdf/SkDocument_PDF_None.cpp",  # We use src/pdf/SkPDFDocument.cpp.
243
244        # Exclude files that don't compile everywhere.
245        "src/svg/**/*",  # Depends on xml, SkJpegCodec, and SkPngCodec.
246        "src/xml/**/*",  # Avoid dragging in expat when not needed.
247
248        # Conflicting dependencies among Lua versions. See cl/107087297.
249        "src/utils/SkLua*",
250
251        # Currently exclude all vulkan specific files
252        "src/gpu/vk/*",
253
254        # Defines main.
255        "src/sksl/SkSLMain.cpp",
256
257        # Only used to regenerate the lexer
258        "src/sksl/lex/*",
259
260        # Atlas text
261        "src/atlastext/*",
262
263        # Compute backend not yet even hooked into Skia.
264        "src/compute/**/*",
265    ],
266)
267
268def codec_srcs(limited):
269    """Sources for the codecs. Excludes Raw, and Ico, Webp, and Png if limited."""
270
271    # TODO: Enable wuffs in Google3
272    exclude = ["src/codec/SkWuffsCodec.cpp", "src/codec/*Raw*.cpp"]
273    if limited:
274        exclude += [
275            "src/codec/*Ico*.cpp",
276            "src/codec/*Webp*.cpp",
277            "src/codec/*Png*",
278        ]
279    return native.glob(["src/codec/*.cpp", "third_party/etc1/*.cpp", "third_party/gif/*.cpp"], exclude = exclude)
280
281# Platform-dependent SRCS for google3-default platform.
282BASE_SRCS_UNIX = struct(
283    include = [
284        "src/gpu/gl/GrGLMakeNativeInterface_none.cpp",
285        "src/ports/**/*.cpp",
286        "src/ports/**/*.h",
287    ],
288    exclude = [
289        "src/ports/*CG*",
290        "src/ports/*WIC*",
291        "src/ports/*android*",
292        "src/ports/*chromium*",
293        "src/ports/*mac*",
294        "src/ports/*mozalloc*",
295        "src/ports/*nacl*",
296        "src/ports/*win*",
297        "src/ports/SkFontMgr_custom_directory_factory.cpp",
298        "src/ports/SkFontMgr_custom_embedded_factory.cpp",
299        "src/ports/SkFontMgr_custom_empty_factory.cpp",
300        "src/ports/SkFontMgr_empty_factory.cpp",
301        "src/ports/SkFontMgr_fontconfig.cpp",
302        "src/ports/SkFontMgr_fontconfig_factory.cpp",
303        "src/ports/SkFontMgr_fuchsia.cpp",
304        "src/ports/SkImageGenerator_none.cpp",
305        "src/ports/SkTLS_none.cpp",
306    ],
307)
308
309# Platform-dependent SRCS for google3-default Android.
310BASE_SRCS_ANDROID = struct(
311    include = [
312        "src/gpu/gl/android/*.cpp",
313        "src/ports/**/*.cpp",
314        "src/ports/**/*.h",
315    ],
316    exclude = [
317        "src/ports/*CG*",
318        "src/ports/*FontConfig*",
319        "src/ports/*WIC*",
320        "src/ports/*chromium*",
321        "src/ports/*fontconfig*",
322        "src/ports/*mac*",
323        "src/ports/*mozalloc*",
324        "src/ports/*nacl*",
325        "src/ports/*win*",
326        "src/ports/SkDebug_stdio.cpp",
327        "src/ports/SkFontMgr_custom_directory_factory.cpp",
328        "src/ports/SkFontMgr_custom_embedded_factory.cpp",
329        "src/ports/SkFontMgr_custom_empty_factory.cpp",
330        "src/ports/SkFontMgr_empty_factory.cpp",
331        "src/ports/SkFontMgr_fuchsia.cpp",
332        "src/ports/SkImageGenerator_none.cpp",
333        "src/ports/SkTLS_none.cpp",
334    ],
335)
336
337# Platform-dependent SRCS for google3-default iOS.
338BASE_SRCS_IOS = struct(
339    include = [
340        "src/gpu/gl/iOS/GrGLMakeNativeInterface_iOS.cpp",
341        "src/ports/**/*.cpp",
342        "src/ports/**/*.h",
343        "src/utils/mac/*.cpp",
344    ],
345    exclude = [
346        "src/ports/*FontConfig*",
347        "src/ports/*FreeType*",
348        "src/ports/*WIC*",
349        "src/ports/*android*",
350        "src/ports/*chromium*",
351        "src/ports/*fontconfig*",
352        "src/ports/*mozalloc*",
353        "src/ports/*nacl*",
354        "src/ports/*win*",
355        "src/ports/SkFontMgr_custom.cpp",
356        "src/ports/SkFontMgr_custom_directory.cpp",
357        "src/ports/SkFontMgr_custom_embedded.cpp",
358        "src/ports/SkFontMgr_custom_empty.cpp",
359        "src/ports/SkFontMgr_custom_directory_factory.cpp",
360        "src/ports/SkFontMgr_custom_embedded_factory.cpp",
361        "src/ports/SkFontMgr_custom_empty_factory.cpp",
362        "src/ports/SkFontMgr_empty_factory.cpp",
363        "src/ports/SkFontMgr_fuchsia.cpp",
364        "src/ports/SkImageGenerator_none.cpp",
365        "src/ports/SkTLS_none.cpp",
366    ],
367)
368
369################################################################################
370## skia_srcs()
371################################################################################
372def skia_srcs(os_conditions):
373    """Sources to be compiled into the skia library."""
374    return skia_glob(BASE_SRCS_ALL) + skia_select(
375        os_conditions,
376        [
377            skia_glob(BASE_SRCS_UNIX),
378            skia_glob(BASE_SRCS_ANDROID),
379            skia_glob(BASE_SRCS_IOS),
380        ],
381    )
382
383################################################################################
384## INCLUDES
385################################################################################
386
387# Includes needed by Skia implementation.  Not public includes.
388INCLUDES = [
389    "include/android",
390    "include/c",
391    "include/codec",
392    "include/config",
393    "include/core",
394    "include/docs",
395    "include/effects",
396    "include/encode",
397    "include/gpu",
398    "include/pathops",
399    "include/ports",
400    "include/private",
401    "include/utils",
402    "include/utils/mac",
403    "src/codec",
404    "src/core",
405    "src/gpu",
406    "src/image",
407    "src/images",
408    "src/lazy",
409    "src/opts",
410    "src/pdf",
411    "src/ports",
412    "src/sfnt",
413    "src/shaders",
414    "src/shaders/gradients",
415    "src/sksl",
416    "src/utils",
417    "third_party/etc1",
418    "third_party/gif",
419]
420
421################################################################################
422## DM_SRCS
423################################################################################
424
425DM_SRCS_ALL = struct(
426    include = [
427        "dm/*.cpp",
428        "dm/*.h",
429        "experimental/pipe/*.cpp",
430        "experimental/pipe/*.h",
431        "experimental/svg/model/*.cpp",
432        "experimental/svg/model/*.h",
433        "gm/*.cpp",
434        "gm/*.h",
435        "src/xml/*.cpp",
436        "tests/*.cpp",
437        "tests/*.h",
438        "tools/ios_utils.h",
439        "tools/BinaryAsset.h",
440        "tools/BigPathBench.inc",
441        "tools/CrashHandler.cpp",
442        "tools/CrashHandler.h",
443        "tools/DDLPromiseImageHelper.cpp",
444        "tools/DDLPromiseImageHelper.h",
445        "tools/DDLTileHelper.cpp",
446        "tools/DDLTileHelper.h",
447        "tools/ProcStats.cpp",
448        "tools/ProcStats.h",
449        "tools/Registry.h",
450        "tools/ResourceFactory.h",
451        "tools/Resources.cpp",
452        "tools/Resources.h",
453        "tools/SkJSONCPP.h",
454        "tools/UrlDataManager.cpp",
455        "tools/UrlDataManager.h",
456        "tools/debugger/*.cpp",
457        "tools/debugger/*.h",
458        "tools/flags/*.cpp",
459        "tools/flags/*.h",
460        "tools/fonts/SkRandomScalerContext.cpp",
461        "tools/fonts/SkRandomScalerContext.h",
462        "tools/fonts/SkTestFontMgr.cpp",
463        "tools/fonts/SkTestFontMgr.h",
464        "tools/fonts/SkTestSVGTypeface.cpp",
465        "tools/fonts/SkTestSVGTypeface.h",
466        "tools/fonts/SkTestTypeface.cpp",
467        "tools/fonts/SkTestTypeface.h",
468        "tools/fonts/sk_tool_utils_font.cpp",
469        "tools/fonts/test_font_monospace.inc",
470        "tools/fonts/test_font_sans_serif.inc",
471        "tools/fonts/test_font_serif.inc",
472        "tools/fonts/test_font_index.inc",
473        "tools/gpu/**/*.cpp",
474        "tools/gpu/**/*.h",
475        "tools/random_parse_path.cpp",
476        "tools/random_parse_path.h",
477        "tools/sk_pixel_iter.h",
478        "tools/sk_tool_utils.cpp",
479        "tools/sk_tool_utils.h",
480        "tools/timer/*.cpp",
481        "tools/timer/*.h",
482        "tools/trace/*.cpp",
483        "tools/trace/*.h",
484    ],
485    exclude = [
486        "gm/cgms.cpp",
487        "tests/FontMgrAndroidParserTest.cpp",  # Android-only.
488        "tests/FontMgrFontConfigTest.cpp",  # FontConfig-only.
489        "tests/skia_test.cpp",  # Old main.
490        "tools/gpu/atlastext/*",
491        "tools/gpu/gl/angle/*",
492        "tools/gpu/gl/egl/*",
493        "tools/gpu/gl/glx/*",
494        "tools/gpu/gl/iOS/*",
495        "tools/gpu/gl/mac/*",
496        "tools/gpu/gl/win/*",
497        "tools/timer/SysTimer_mach.cpp",
498        "tools/timer/SysTimer_windows.cpp",
499    ],
500)
501
502################################################################################
503## dm_srcs()
504################################################################################
505
506def dm_srcs(os_conditions):
507    """Sources for the dm binary for the specified os."""
508    return skia_glob(DM_SRCS_ALL) + skia_select(
509        os_conditions,
510        [
511            [],
512            ["tests/FontMgrAndroidParserTest.cpp"],
513            [],
514        ],
515    )
516
517################################################################################
518## DM_INCLUDES
519################################################################################
520
521DM_INCLUDES = [
522    "dm",
523    "gm",
524    "experimental/pipe",
525    "experimental/svg/model",
526    "src/codec",
527    "src/core",
528    "src/effects",
529    "src/fonts",
530    "src/images",
531    "src/pathops",
532    "src/pipe/utils",
533    "src/ports",
534    "src/shaders",
535    "src/shaders/gradients",
536    "src/xml",
537    "tests",
538    "tools",
539    "tools/debugger",
540    "tools/flags",
541    "tools/fonts",
542    "tools/gpu",
543    "tools/timer",
544    "tools/trace",
545]
546
547################################################################################
548## DM_ARGS
549################################################################################
550
551def DM_ARGS(asan):
552    source = ["gm", "image", "lottie"]
553
554    # TODO(benjaminwagner): f16, pic-8888, serialize-8888, and tiles_rt-8888 fail.
555    config = ["565", "8888", "pdf"]
556    match = ["~Codec_78329453"]
557    return (["--src"] + source + ["--config"] + config + ["--nonativeFonts"] +
558            ["--match"] + match)
559
560################################################################################
561## COPTS
562################################################################################
563
564def base_copts(os_conditions):
565    return skia_select(
566        os_conditions,
567        [
568            # UNIX
569            [
570                "-Wno-implicit-fallthrough",  # Some intentional fallthrough.
571                # Internal use of deprecated methods. :(
572                "-Wno-deprecated-declarations",
573                # TODO(kjlubick)
574                "-Wno-self-assign",  # Spurious warning in tests/PathOpsDVectorTest.cpp?
575            ],
576            # ANDROID
577            [
578                "-Wno-implicit-fallthrough",  # Some intentional fallthrough.
579                # 'GrResourceCache' declared with greater visibility than the
580                # type of its field 'GrResourceCache::fPurgeableQueue'... bogus.
581                "-Wno-error=attributes",
582            ],
583            # IOS
584            [
585                "-Wno-implicit-fallthrough",  # Some intentional fallthrough.
586            ],
587        ],
588    )
589
590################################################################################
591## DEFINES
592################################################################################
593
594def base_defines(os_conditions):
595    return [
596        # Chrome DEFINES.
597        "SK_USE_FREETYPE_EMBOLDEN",
598        # Turn on a few Google3-specific build fixes.
599        "SK_BUILD_FOR_GOOGLE3",
600        # Required for building dm.
601        "GR_TEST_UTILS",
602        # Staging flags for API changes
603        # Should remove after we update golden images
604        "SK_WEBP_ENCODER_USE_DEFAULT_METHOD",
605        # Experiment to diagnose image diffs in Google3
606        "SK_DISABLE_LOWP_RASTER_PIPELINE",
607        # JPEG is in codec_limited
608        "SK_HAS_JPEG_LIBRARY",
609    ] + skia_select(
610        os_conditions,
611        [
612            # UNIX
613            [
614                "PNG_SKIP_SETJMP_CHECK",
615                "SK_BUILD_FOR_UNIX",
616                "SK_SAMPLES_FOR_X",
617                "SK_PDF_USE_SFNTLY",
618                "SK_HAS_PNG_LIBRARY",
619                "SK_HAS_WEBP_LIBRARY",
620            ],
621            # ANDROID
622            [
623                "SK_BUILD_FOR_ANDROID",
624                "SK_HAS_PNG_LIBRARY",
625                "SK_HAS_WEBP_LIBRARY",
626            ],
627            # IOS
628            [
629                "SK_BUILD_FOR_IOS",
630                "SK_BUILD_NO_OPTS",
631                "SKNX_NO_SIMD",
632            ],
633        ],
634    )
635
636################################################################################
637## LINKOPTS
638################################################################################
639
640def base_linkopts(os_conditions):
641    return [
642        "-ldl",
643    ] + skia_select(
644        os_conditions,
645        [
646            # UNIX
647            [],
648            # ANDROID
649            [
650                "-lEGL",
651                "-lGLESv2",
652            ],
653            # IOS
654            [
655                "-framework CoreFoundation",
656                "-framework CoreGraphics",
657                "-framework CoreText",
658                "-framework ImageIO",
659                "-framework MobileCoreServices",
660            ],
661        ],
662    )
663
664################################################################################
665## skottie_tool
666################################################################################
667
668SKOTTIE_TOOL_INCLUDES = [
669    "modules/skottie/utils",
670    "tools/flags",
671]
672
673SKOTTIE_TOOL_SRCS = [
674    "modules/skottie/src/SkottieTool.cpp",
675    "modules/skottie/utils/SkottieUtils.cpp",
676    "modules/skottie/utils/SkottieUtils.h",
677    # TODO(benjaminwagner): Add "flags" target.
678    "tools/flags/SkCommandLineFlags.cpp",
679    "tools/flags/SkCommandLineFlags.h",
680]
681
682################################################################################
683## SkShaper
684################################################################################
685
686SKSHAPER_INCLUDES = [
687    "modules/skshaper/include",
688]
689
690SKSHAPER_HARFBUZZ_SRCS = [
691    "modules/skshaper/include/SkShaper.h",
692    "modules/skshaper/src/SkShaper.cpp",
693    "modules/skshaper/src/SkShaper_harfbuzz.cpp",
694]
695
696SKSHAPER_PRIMITIVE_SRCS = [
697    "modules/skshaper/include/SkShaper.h",
698    "modules/skshaper/src/SkShaper.cpp",
699    "modules/skshaper/src/SkShaper_primitive.cpp",
700]
701