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(["include/**/*.h"],
66                     exclude=[
67                         "include/private/**/*",
68                         "include/views/**/*",  # Not used.
69                     ])
70
71################################################################################
72## skia_opts_srcs()
73################################################################################
74# Intel
75SKIA_OPTS_SSE2 = "SSE2"
76
77SKIA_OPTS_SSSE3 = "SSSE3"
78
79SKIA_OPTS_SSE41 = "SSE41"
80
81SKIA_OPTS_SSE42 = "SSE42"
82
83SKIA_OPTS_AVX = "AVX"
84
85# Arm
86SKIA_OPTS_NEON = "NEON"
87
88SKIA_OPTS_CRC32 = "CRC32"  # arm64
89
90def opts_srcs(opts):
91  if opts == SKIA_OPTS_SSE2:
92    return native.glob([
93        "src/opts/*_SSE2.cpp",
94        "src/opts/*_sse2.cpp",  # No matches currently.
95    ])
96  elif opts == SKIA_OPTS_SSSE3:
97    return native.glob([
98        "src/opts/*_SSSE3.cpp",
99        "src/opts/*_ssse3.cpp",
100    ])
101  elif opts == SKIA_OPTS_SSE41:
102    return native.glob([
103        "src/opts/*_sse41.cpp",
104    ])
105  elif opts == SKIA_OPTS_SSE42:
106    return native.glob([
107        "src/opts/*_sse42.cpp",
108    ])
109  elif opts == SKIA_OPTS_AVX:
110    return native.glob([
111        "src/opts/*_avx.cpp",
112    ])
113  elif opts == SKIA_OPTS_NEON:
114    return native.glob([
115        "src/opts/*_neon.cpp",
116    ])
117  elif opts == SKIA_OPTS_CRC32:
118    return native.glob([
119        "src/opts/*_crc32.cpp",
120    ])
121  else:
122    fail("skia_opts_srcs parameter 'opts' must be one of SKIA_OPTS_*.")
123
124def opts_cflags(opts):
125  if opts == SKIA_OPTS_SSE2:
126    return ["-msse2"]
127  elif opts == SKIA_OPTS_SSSE3:
128    return ["-mssse3"]
129  elif opts == SKIA_OPTS_SSE41:
130    return ["-msse4.1"]
131  elif opts == SKIA_OPTS_SSE42:
132    return ["-msse4.2"]
133  elif opts == SKIA_OPTS_AVX:
134    return ["-mavx"]
135  elif opts == SKIA_OPTS_NEON:
136    return ["-mfpu=neon"]
137  elif opts == SKIA_OPTS_CRC32:
138    # NDK r11's Clang (3.8) doesn't pass along this -march setting correctly to an external
139    # assembler, so we do it manually with -Wa.  This is just a bug, fixed in later Clangs.
140    return ["-march=armv8-a+crc", "-Wa,-march=armv8-a+crc"]
141  else:
142    return []
143
144SKIA_CPU_ARM = "ARM"
145
146SKIA_CPU_ARM64 = "ARM64"
147
148SKIA_CPU_X86 = "X86"
149
150SKIA_CPU_OTHER = "OTHER"
151
152def opts_rest_srcs(cpu):
153  srcs = []
154  if cpu == SKIA_CPU_ARM or cpu == SKIA_CPU_ARM64:
155    srcs += native.glob([
156        "src/opts/*_arm.cpp",
157        "src/opts/SkBitmapProcState_opts_none.cpp",
158    ])
159    if cpu == SKIA_CPU_ARM64:
160      # NEON doesn't need special flags to compile on ARM64.
161      srcs += native.glob([
162          "src/opts/*_neon.cpp",
163      ])
164  elif cpu == SKIA_CPU_X86:
165    srcs += native.glob([
166        "src/opts/*_x86.cpp",
167    ])
168  elif cpu == SKIA_CPU_OTHER:
169    srcs += native.glob([
170        "src/opts/*_none.cpp",
171    ])
172  else:
173    fail("opts_rest_srcs parameter 'cpu' must be one of " +
174         "SKIA_CPU_{ARM,ARM64,X86,OTHER}.")
175  return srcs
176
177def skia_opts_deps(cpu):
178  res = [":opts_rest"]
179
180  if cpu == SKIA_CPU_ARM:
181    res += [":opts_neon"]
182
183  if cpu == SKIA_CPU_ARM64:
184    res += [":opts_crc32"]
185
186  if cpu == SKIA_CPU_X86:
187    res += [
188        ":opts_sse2",
189        ":opts_ssse3",
190        ":opts_sse41",
191        ":opts_sse42",
192        ":opts_avx",
193    ]
194
195  return res
196
197################################################################################
198## BASE_SRCS
199################################################################################
200
201# All platform-independent SRCS.
202BASE_SRCS_ALL = struct(
203    include = [
204        "include/private/**/*.h",
205        "src/**/*.h",
206        "src/**/*.cpp",
207        "src/**/*.inc",
208        "src/jumper/SkJumper_generated.S",
209
210        # Third Party
211        "third_party/etc1/*.cpp",
212        "third_party/etc1/*.h",
213        "third_party/gif/*.cpp",
214        "third_party/gif/*.h",
215    ],
216    exclude = [
217        # Exclude platform-dependent files.
218        "src/codec/*",
219        "src/device/xps/*",  # Windows-only. Move to ports?
220        "src/doc/*_XPS.cpp",  # Windows-only. Move to ports?
221        "src/gpu/gl/android/*",
222        "src/gpu/gl/egl/*",
223        "src/gpu/gl/glfw/*",
224        "src/gpu/gl/glx/*",
225        "src/gpu/gl/iOS/*",
226        "src/gpu/gl/mac/*",
227        "src/gpu/gl/win/*",
228        "src/opts/**/*",
229        "src/ports/**/*",
230        "src/utils/android/**/*",
231        "src/utils/mac/**/*",
232        "src/utils/win/**/*",
233        "src/views/sdl/*",
234        "src/views/win/*",
235        "src/views/unix/*",
236
237        # Exclude multiple definitions.
238        # TODO(mtklein): Move to opts?
239        "src/pdf/SkDocument_PDF_None.cpp",  # We use src/pdf/SkPDFDocument.cpp.
240        "src/gpu/gl/GrGLMakeNativeInterface_none.cpp",
241
242        # Exclude files that don't compile with the current DEFINES.
243        "src/svg/**/*",  # Depends on XML.
244        "src/xml/**/*",
245
246        # Conflicting dependencies among Lua versions. See cl/107087297.
247        "src/utils/SkLua*",
248
249        # Not used.
250        "src/views/**/*",
251
252        # Currently exclude all vulkan specific files
253        "src/gpu/vk/*",
254
255        # Defines main.
256        "src/sksl/SkSLMain.cpp",
257
258        # Only used to regenerate the lexer
259        "src/sksl/lex/*",
260
261        # Atlas text
262        "src/atlastext/*",
263    ],
264)
265
266def codec_srcs(limited):
267  """Sources for the codecs. Excludes Ico, Webp, Png, and Raw if limited."""
268  exclude = []
269  if limited:
270    exclude += [
271        "src/codec/*Ico*.cpp",
272        "src/codec/*Webp*.cpp",
273        "src/codec/*Png*",
274        "src/codec/*Raw*.cpp",
275    ]
276  return native.glob(["src/codec/*.cpp"], exclude = exclude)
277
278# Platform-dependent SRCS for google3-default platform.
279BASE_SRCS_UNIX = struct(
280    include = [
281        "src/gpu/gl/GrGLMakeNativeInterface_none.cpp",
282        "src/ports/**/*.cpp",
283        "src/ports/**/*.h",
284    ],
285    exclude = [
286        "src/ports/*CG*",
287        "src/ports/*WIC*",
288        "src/ports/*android*",
289        "src/ports/*chromium*",
290        "src/ports/*mac*",
291        "src/ports/*mozalloc*",
292        "src/ports/*nacl*",
293        "src/ports/*win*",
294        "src/ports/SkFontMgr_custom_directory_factory.cpp",
295        "src/ports/SkFontMgr_custom_embedded_factory.cpp",
296        "src/ports/SkFontMgr_custom_empty_factory.cpp",
297        "src/ports/SkFontMgr_empty_factory.cpp",
298        "src/ports/SkFontMgr_fontconfig.cpp",
299        "src/ports/SkFontMgr_fontconfig_factory.cpp",
300        "src/ports/SkGlobalInitialization_none.cpp",
301        "src/ports/SkImageGenerator_none.cpp",
302        "src/ports/SkTLS_none.cpp",
303    ],
304)
305
306# Platform-dependent SRCS for google3-default Android.
307BASE_SRCS_ANDROID = struct(
308    include = [
309        "src/gpu/gl/GrGLMakeNativeInterface_none.cpp",
310        # TODO(benjaminwagner): Figure out how to compile with EGL.
311        "src/ports/**/*.cpp",
312        "src/ports/**/*.h",
313    ],
314    exclude = [
315        "src/ports/*CG*",
316        "src/ports/*FontConfig*",
317        "src/ports/*WIC*",
318        "src/ports/*chromium*",
319        "src/ports/*fontconfig*",
320        "src/ports/*mac*",
321        "src/ports/*mozalloc*",
322        "src/ports/*nacl*",
323        "src/ports/*win*",
324        "src/ports/SkDebug_stdio.cpp",
325        "src/ports/SkFontMgr_custom_directory_factory.cpp",
326        "src/ports/SkFontMgr_custom_embedded_factory.cpp",
327        "src/ports/SkFontMgr_custom_empty_factory.cpp",
328        "src/ports/SkFontMgr_empty_factory.cpp",
329        "src/ports/SkGlobalInitialization_none.cpp",
330        "src/ports/SkImageGenerator_none.cpp",
331        "src/ports/SkTLS_none.cpp",
332    ],
333)
334
335# Platform-dependent SRCS for google3-default iOS.
336BASE_SRCS_IOS = struct(
337    include = [
338        "src/gpu/gl/iOS/GrGLMakeNativeInterface_iOS.cpp",
339        "src/ports/**/*.cpp",
340        "src/ports/**/*.h",
341        "src/utils/mac/*.cpp",
342    ],
343    exclude = [
344        "src/ports/*FontConfig*",
345        "src/ports/*FreeType*",
346        "src/ports/*WIC*",
347        "src/ports/*android*",
348        "src/ports/*chromium*",
349        "src/ports/*fontconfig*",
350        "src/ports/*mozalloc*",
351        "src/ports/*nacl*",
352        "src/ports/*win*",
353        "src/ports/SkFontMgr_custom.cpp",
354        "src/ports/SkFontMgr_custom_directory.cpp",
355        "src/ports/SkFontMgr_custom_embedded.cpp",
356        "src/ports/SkFontMgr_custom_empty.cpp",
357        "src/ports/SkFontMgr_custom_directory_factory.cpp",
358        "src/ports/SkFontMgr_custom_embedded_factory.cpp",
359        "src/ports/SkFontMgr_custom_empty_factory.cpp",
360        "src/ports/SkFontMgr_empty_factory.cpp",
361        "src/ports/SkGlobalInitialization_none.cpp",
362        "src/ports/SkImageGenerator_none.cpp",
363        "src/ports/SkTLS_none.cpp",
364    ],
365)
366
367################################################################################
368## skia_srcs()
369################################################################################
370def skia_srcs(os_conditions):
371  """Sources to be compiled into the skia library."""
372  return skia_glob(BASE_SRCS_ALL) + skia_select(
373      os_conditions,
374      [
375          skia_glob(BASE_SRCS_UNIX),
376          skia_glob(BASE_SRCS_ANDROID),
377          skia_glob(BASE_SRCS_IOS),
378      ],
379  )
380
381################################################################################
382## INCLUDES
383################################################################################
384
385# Includes needed by Skia implementation.  Not public includes.
386INCLUDES = [
387    "include/android",
388    "include/c",
389    "include/client/android",
390    "include/codec",
391    "include/config",
392    "include/core",
393    "include/effects",
394    "include/encode",
395    "include/gpu",
396    "include/images",
397    "include/pathops",
398    "include/pipe",
399    "include/ports",
400    "include/private",
401    "include/utils",
402    "include/utils/mac",
403    "include/utils/win",
404    "include/svg",
405    "include/xml",
406    "src/codec",
407    "src/core",
408    "src/gpu",
409    "src/image",
410    "src/images",
411    "src/lazy",
412    "src/opts",
413    "src/ports",
414    "src/pdf",
415    "src/sfnt",
416    "src/shaders",
417    "src/sksl",
418    "src/utils",
419    "third_party/etc1",
420    "third_party/gif",
421]
422
423################################################################################
424## DM_SRCS
425################################################################################
426
427DM_SRCS_ALL = struct(
428    include = [
429        "dm/*.cpp",
430        "dm/*.h",
431        "gm/*.c",
432        "gm/*.cpp",
433        "gm/*.h",
434        "tests/*.cpp",
435        "tests/*.h",
436        "tools/BigPathBench.inc",
437        "tools/CrashHandler.cpp",
438        "tools/CrashHandler.h",
439        "tools/ProcStats.cpp",
440        "tools/ProcStats.h",
441        "tools/Resources.cpp",
442        "tools/Resources.h",
443        "tools/SkJSONCPP.h",
444        "tools/SkRandomScalerContext.cpp",
445        "tools/SkRandomScalerContext.h",
446        "tools/SkTestScalerContext.cpp",
447        "tools/SkTestScalerContext.h",
448        "tools/UrlDataManager.cpp",
449        "tools/UrlDataManager.h",
450        "tools/debugger/*.cpp",
451        "tools/debugger/*.h",
452        "tools/flags/*.cpp",
453        "tools/flags/*.h",
454        "tools/gpu/**/*.cpp",
455        "tools/gpu/**/*.h",
456        "tools/picture_utils.cpp",
457        "tools/picture_utils.h",
458        "tools/random_parse_path.cpp",
459        "tools/random_parse_path.h",
460        "tools/sk_tool_utils.cpp",
461        "tools/sk_tool_utils.h",
462        "tools/sk_tool_utils_font.cpp",
463        "tools/test_font_monospace.inc",
464        "tools/test_font_sans_serif.inc",
465        "tools/test_font_serif.inc",
466        "tools/test_font_index.inc",
467        "tools/timer/*.cpp",
468        "tools/timer/*.h",
469        "tools/trace/*.cpp",
470        "tools/trace/*.h",
471    ],
472    exclude = [
473        "tests/FontMgrAndroidParserTest.cpp",  # Android-only.
474        "tests/skia_test.cpp",  # Old main.
475        "tests/SkpSkGrTest.cpp",  # Alternate main.
476        "tests/SVGDeviceTest.cpp",
477        "tools/gpu/atlastext/*",
478        "tools/gpu/gl/angle/*",
479        "tools/gpu/gl/egl/*",
480        "tools/gpu/gl/glx/*",
481        "tools/gpu/gl/iOS/*",
482        "tools/gpu/gl/mac/*",
483        "tools/gpu/gl/win/*",
484        "tools/timer/SysTimer_mach.cpp",
485        "tools/timer/SysTimer_windows.cpp",
486    ],
487)
488
489################################################################################
490## dm_srcs()
491################################################################################
492
493def dm_srcs(os_conditions):
494  """Sources for the dm binary for the specified os."""
495  return skia_glob(DM_SRCS_ALL) + skia_select(
496      os_conditions,
497      [
498          [],
499          ["tests/FontMgrAndroidParserTest.cpp"],
500          [],
501      ],
502  )
503
504################################################################################
505## DM_INCLUDES
506################################################################################
507
508DM_INCLUDES = [
509    "dm",
510    "gm",
511    "experimental/svg/model",
512    "src/codec",
513    "src/core",
514    "src/effects",
515    "src/fonts",
516    "src/images",
517    "src/pathops",
518    "src/pipe/utils",
519    "src/ports",
520    "src/shaders",
521    "src/shaders/gradients",
522    "src/xml",
523    "tests",
524    "tools",
525    "tools/debugger",
526    "tools/flags",
527    "tools/gpu",
528    "tools/timer",
529    "tools/trace",
530]
531
532################################################################################
533## DM_ARGS
534################################################################################
535
536def DM_ARGS(asan):
537  source = ["tests", "gm", "image"]
538  # TODO(benjaminwagner): f16, pic-8888, serialize-8888, and tiles_rt-8888 fail.
539  config = ["565", "8888", "pdf", "srgb"]
540  # TODO(mtklein): maybe investigate why these fail?
541  match = [
542      "~^FontHostStream$$",
543      "~^FontMgr$$",
544      "~^PaintBreakText$$",
545      "~^RecordDraw_TextBounds$$",
546  ]
547  return ["--src"] + source + ["--config"] + config + ["--match"] + match
548
549################################################################################
550## COPTS
551################################################################################
552
553def base_copts(os_conditions):
554  return skia_select(
555      os_conditions,
556      [
557          # UNIX
558          [
559              "-Wno-implicit-fallthrough",  # Some intentional fallthrough.
560              # Internal use of deprecated methods. :(
561              "-Wno-deprecated-declarations",
562          ],
563          # ANDROID
564          [
565              # 'GrResourceCache' declared with greater visibility than the
566              # type of its field 'GrResourceCache::fPurgeableQueue'... bogus.
567              "-Wno-error=attributes",
568          ],
569          # IOS
570          [],
571      ],
572  )
573
574################################################################################
575## DEFINES
576################################################################################
577
578def base_defines(os_conditions):
579  return [
580      # Chrome DEFINES.
581      "SK_USE_FREETYPE_EMBOLDEN",
582      # Turn on a few Google3-specific build fixes.
583      "SK_BUILD_FOR_GOOGLE3",
584      # Required for building dm.
585      "GR_TEST_UTILS",
586      # Staging flags for API changes
587      # Should remove after we update golden images
588      "SK_WEBP_ENCODER_USE_DEFAULT_METHOD",
589      # Experiment to diagnose image diffs in Google3
590      "SK_JUMPER_DISABLE_8BIT",
591      # JPEG is in codec_limited
592      "SK_HAS_JPEG_LIBRARY",
593  ] + skia_select(
594      os_conditions,
595      [
596          # UNIX
597          [
598              "PNG_SKIP_SETJMP_CHECK",
599              "SK_BUILD_FOR_UNIX",
600              "SK_SAMPLES_FOR_X",
601              "SK_PDF_USE_SFNTLY",
602              "SK_CODEC_DECODES_RAW",
603              "SK_HAS_PNG_LIBRARY",
604              "SK_HAS_WEBP_LIBRARY",
605          ],
606          # ANDROID
607          [
608              "SK_BUILD_FOR_ANDROID",
609              "SK_CODEC_DECODES_RAW",
610              "SK_HAS_PNG_LIBRARY",
611              "SK_HAS_WEBP_LIBRARY",
612          ],
613          # IOS
614          [
615              "SK_BUILD_FOR_IOS",
616              "SK_BUILD_NO_OPTS",
617              "SKNX_NO_SIMD",
618          ],
619      ],
620  )
621
622################################################################################
623## LINKOPTS
624################################################################################
625
626def base_linkopts(os_conditions):
627  return [
628      "-ldl",
629  ] + skia_select(
630      os_conditions,
631      [
632          # UNIX
633          [],
634          # ANDROID
635          [
636              "-lEGL",
637          ],
638          # IOS
639          [
640              "-framework CoreFoundation",
641              "-framework CoreGraphics",
642              "-framework CoreText",
643              "-framework ImageIO",
644              "-framework MobileCoreServices",
645          ],
646      ]
647  )
648