1fc0c1c0f8
This CL makes a copy of all the files in //modules/canvaskit/tests/ and puts them into //modules/canvaskit/tests/bazel. They are slightly modified to run in Bazel (renamed to be more clear what they are and using EverythingLoaded instead of CanvasKitLoaded). The original files will be deleted when we no longer test CanvasKit outside of Bazel. Suggested Review Order: - hello_world.js is now smoke_test.js. That test polls the gold_test_env server, but does not create an image. - test_reporter.js which is much simplified from the non-Bazel version (due to the removal of a bunch of PathKit stuff). These JS tests are not the C++ gms. This means that we need to capture the PNG ourselves, which we do using the <canvas> API toDataURL(). This is base64 encoded, which is conveniently the format accepted by the gold_test_env server. - karma.bazel.js and assets/BUILD.bazel which make all the test assets available under a shortened path /assets. - Feel free to skip over the remaining *_test.js, as they are basically the same as what is currently checked in, just with the modifications above. - Any remaining files. Change-Id: I45fc38da38faf11f21011e7381d390e6bb299df4 Bug: skia:12541 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/513916 Reviewed-by: Leandro Lovisolo <lovisolo@google.com> Reviewed-by: Ben Wagner <bungeman@google.com>
463 lines
13 KiB
Python
463 lines
13 KiB
Python
load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary")
|
|
load("//bazel/common_config_settings:defs.bzl", "bool_flag")
|
|
load("//bazel:cc_binary_with_flags.bzl", "cc_binary_with_flags")
|
|
load("//bazel:karma_test.bzl", "karma_test")
|
|
|
|
package(default_visibility = ["//:__subpackages__"])
|
|
|
|
BASE_LINKOPTS = [
|
|
#"-flto", # https://github.com/emscripten-core/emsdk/issues/807
|
|
"--bind", # Compiles the source code using the Embind bindings to connect C/C++ and JavaScript
|
|
"--no-entry",
|
|
"-sALLOW_MEMORY_GROWTH",
|
|
"-sUSE_PTHREADS=0", # Disable pthreads
|
|
"-sMODULARIZE",
|
|
"-sDISABLE_EXCEPTION_CATCHING", # Disable all exception catching
|
|
"-sNODEJS_CATCH_EXIT=0", # We don't have a 'main' so disable exit() catching
|
|
"-sWASM",
|
|
"-sMAX_WEBGL_VERSION=2",
|
|
"-sUSE_WEBGL2=1",
|
|
"-sFORCE_FILESYSTEM=0",
|
|
"-sDYNAMIC_EXECUTION=0",
|
|
"-sFILESYSTEM=0",
|
|
"-sEXPORTED_FUNCTIONS=['_malloc','_free']",
|
|
]
|
|
|
|
RELEASE_OPTS = [
|
|
"-sASSERTIONS=0", # Turn off assertions
|
|
"-Oz",
|
|
]
|
|
|
|
DEBUG_OPTS = [
|
|
"--closure 0", # Do not use closure
|
|
"-sASSERTIONS", # Turn on assertions
|
|
"-sGL_ASSERTIONS",
|
|
"-O0",
|
|
"-g3",
|
|
"--source-map-base=/build/",
|
|
]
|
|
|
|
GM_OPTS = [
|
|
"-sEXPORT_NAME=InitWasmGMTests",
|
|
"--pre-js",
|
|
"modules/canvaskit/gm.js",
|
|
"-sDEMANGLE_SUPPORT=1",
|
|
"--profiling-funcs",
|
|
"--profiling",
|
|
]
|
|
|
|
filegroup(
|
|
name = "hdrs",
|
|
srcs = [
|
|
"WasmCommon.h",
|
|
],
|
|
)
|
|
|
|
cc_binary_with_flags(
|
|
name = "wasm_gm_tests.with_flags",
|
|
testonly = True,
|
|
srcs = [
|
|
"gm_bindings.cpp",
|
|
":hdrs",
|
|
"//gm:gm_list",
|
|
"//tests:test_list",
|
|
],
|
|
additional_linker_inputs = ["gm.js"],
|
|
linkopts = select({
|
|
"//bazel/common_config_settings:debug_build": BASE_LINKOPTS + GM_OPTS + DEBUG_OPTS,
|
|
"//bazel/common_config_settings:release_build": BASE_LINKOPTS + GM_OPTS + RELEASE_OPTS,
|
|
"//conditions:default": BASE_LINKOPTS + GM_OPTS + RELEASE_OPTS,
|
|
}),
|
|
set_flags = {
|
|
"include_decoder": [
|
|
"jpeg_decode_codec",
|
|
"png_decode_codec",
|
|
"webp_decode_codec",
|
|
"gif_decode_codec",
|
|
],
|
|
"include_encoder": [
|
|
"jpeg_encode_codec",
|
|
"png_encode_codec",
|
|
"webp_encode_codec",
|
|
],
|
|
"gpu_backend": [
|
|
"gl_backend",
|
|
],
|
|
"with_gl_standard": [
|
|
"webgl_standard",
|
|
],
|
|
"is_skia_dev_build": [
|
|
"True",
|
|
],
|
|
},
|
|
# This target won't build successfully on its own because of missing emscripten
|
|
# headers etc. Therefore, we hide it from wildcards.
|
|
tags = ["manual"],
|
|
deps = [
|
|
"//:skia_core",
|
|
"//gm",
|
|
"//src/core:SkFontMgrPriv_hdr",
|
|
"//tests",
|
|
"//tools:hash_and_encode",
|
|
"//tools:resource_factory",
|
|
"//tools/fonts:test_font_manager",
|
|
],
|
|
)
|
|
|
|
wasm_cc_binary(
|
|
name = "wasm_gm_tests",
|
|
testonly = True,
|
|
cc_target = ":wasm_gm_tests.with_flags",
|
|
)
|
|
|
|
# See https://stackoverflow.com/a/57499321 for reference.
|
|
genrule(
|
|
name = "create_notomono_cpp",
|
|
srcs = ["fonts/NotoMono-Regular.ttf"],
|
|
outs = ["fonts/NotoMono-Regular.ttf.bazel.cpp"], # Distinct name from compile.sh's version
|
|
cmd = "$(location //tools:embed_resources) --name=SK_EMBEDDED_FONTS " +
|
|
"--input=modules/canvaskit/fonts/NotoMono-Regular.ttf " +
|
|
# The $@ means substitute in the one and only output location, which will be located
|
|
# in //bazel-out, not in the fonts subdirectory (although it will be available to clients
|
|
# in the fonts/ subdirectory as if it had been there all along.
|
|
"--output=$@ " +
|
|
"--align=4",
|
|
tools = ["//tools:embed_resources"],
|
|
)
|
|
|
|
# Note: These are defines that only impact the _bindings.cpp files in this folder.
|
|
# Any defines that need to effect the entire Skia build should go in //bazel/BUILD.bazel
|
|
CK_DEFINES = [
|
|
"CK_INCLUDE_PATHOPS",
|
|
] + select({
|
|
":enable_fonts_true": ["CK_INCLUDE_PARAGRAPH"],
|
|
":enable_fonts_false": ["CK_NO_FONTS"],
|
|
}) + select({
|
|
":enable_skp_serialization_true": ["CK_SERIALIZE_SKP=1"],
|
|
":enable_skp_serialization_false": [],
|
|
}) + select({
|
|
":enable_runtime_effect_true": ["CK_INCLUDE_RUNTIME_EFFECT=1"],
|
|
":enable_runtime_effect_false": [],
|
|
}) + select({
|
|
":enable_sksl_tracing_true": ["CK_INCLUDE_SKSL_TRACE=1"],
|
|
":enable_sksl_tracing_false": [],
|
|
})
|
|
|
|
CK_RELEASE_OPTS = [
|
|
"--closure 1", # Run the closure compiler
|
|
# pass the externs file in
|
|
"--closure-args=--externs=$(location externs.js)",
|
|
]
|
|
|
|
CK_OPTS = BASE_LINKOPTS + [
|
|
"-sEXPORT_NAME=CanvasKitInit",
|
|
"-sINITIAL_MEMORY=128MB",
|
|
# The order of these --pre-js flags matters! The preamble is a partially open scope and the
|
|
# postamble closes it. TODO(kjlubick) do we need to do it this way anymore?
|
|
"--pre-js",
|
|
"modules/canvaskit/preamble.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/color.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/memory.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/util.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/interface.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/pathops.js",
|
|
] + select({
|
|
"//bazel/common_config_settings:gl_backend": [
|
|
"--pre-js",
|
|
"modules/canvaskit/cpu.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/gpu.js",
|
|
],
|
|
"//conditions:default": [
|
|
"--pre-js",
|
|
"modules/canvaskit/cpu.js",
|
|
],
|
|
}) + select({
|
|
":enable_fonts_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/font.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/paragraph.js",
|
|
],
|
|
":enable_fonts_false": [],
|
|
}) + select({
|
|
":enable_canvas_polyfill_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/preamble.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/util.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/color.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/font.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/canvas2dcontext.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/htmlcanvas.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/htmlimage.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/imagedata.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/lineargradient.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/path2d.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/pattern.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/radialgradient.js",
|
|
"--pre-js",
|
|
"modules/canvaskit/htmlcanvas/postamble.js",
|
|
],
|
|
":enable_canvas_polyfill_false": [],
|
|
}) + select({
|
|
":enable_skottie_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/skottie.js",
|
|
],
|
|
":enable_skottie_false": [],
|
|
}) + select({
|
|
":enable_skp_serialization_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/skp.js",
|
|
],
|
|
":enable_skp_serialization_false": [],
|
|
}) + select({
|
|
":enable_particles_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/particles.js",
|
|
],
|
|
":enable_particles_false": [],
|
|
}) + select({
|
|
":enable_runtime_effect_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/rt_shader.js",
|
|
],
|
|
":enable_runtime_effect_false": [],
|
|
}) + select({
|
|
":include_matrix_js_true": [
|
|
"--pre-js",
|
|
"modules/canvaskit/matrix.js",
|
|
],
|
|
":include_matrix_js_false": [],
|
|
}) + [
|
|
# This must come last
|
|
"--pre-js",
|
|
"modules/canvaskit/postamble.js",
|
|
] + select({
|
|
"//bazel/common_config_settings:debug_build": DEBUG_OPTS + [
|
|
"--pre-js",
|
|
"modules/canvaskit/debug.js",
|
|
],
|
|
"//conditions:default": RELEASE_OPTS + CK_RELEASE_OPTS + [
|
|
"--pre-js",
|
|
"modules/canvaskit/release.js",
|
|
],
|
|
})
|
|
|
|
# All JS files that could possibly be included via --pre-js or --post-js.
|
|
# Whether they actually will be or not will be controlled above in the construction of CK_OPTS.
|
|
JS_INTERFACE_FILES = [
|
|
"color.js",
|
|
"cpu.js",
|
|
"debug.js",
|
|
"font.js",
|
|
"gpu.js",
|
|
"interface.js",
|
|
"matrix.js",
|
|
"memory.js",
|
|
"paragraph.js",
|
|
"particles.js",
|
|
"pathops.js",
|
|
"postamble.js",
|
|
"preamble.js",
|
|
"release.js",
|
|
"rt_shader.js",
|
|
"skottie.js",
|
|
"skp.js",
|
|
"util.js",
|
|
] + [
|
|
"htmlcanvas/canvas2dcontext.js",
|
|
"htmlcanvas/color.js",
|
|
"htmlcanvas/font.js",
|
|
"htmlcanvas/htmlcanvas.js",
|
|
"htmlcanvas/htmlimage.js",
|
|
"htmlcanvas/imagedata.js",
|
|
"htmlcanvas/lineargradient.js",
|
|
"htmlcanvas/path2d.js",
|
|
"htmlcanvas/pattern.js",
|
|
"htmlcanvas/postamble.js",
|
|
"htmlcanvas/preamble.js",
|
|
"htmlcanvas/radialgradient.js",
|
|
"htmlcanvas/util.js",
|
|
]
|
|
|
|
CK_SRCS = [
|
|
"canvaskit_bindings.cpp",
|
|
":hdrs",
|
|
] + select({
|
|
":include_embedded_font_true": ["fonts/NotoMono-Regular.ttf.bazel.cpp"],
|
|
":include_embedded_font_false": [],
|
|
}) + select({
|
|
":enable_fonts_true": [
|
|
"paragraph_bindings.cpp",
|
|
"paragraph_bindings_gen.cpp",
|
|
],
|
|
":enable_fonts_false": [],
|
|
}) + select({
|
|
":enable_skottie_true": ["skottie_bindings.cpp"],
|
|
":enable_skottie_false": [],
|
|
}) + select({
|
|
":enable_particles_true": ["particles_bindings.cpp"],
|
|
":enable_particles_false": [],
|
|
})
|
|
|
|
cc_binary_with_flags(
|
|
name = "canvaskit.with_flags",
|
|
srcs = CK_SRCS,
|
|
additional_linker_inputs = JS_INTERFACE_FILES + ["externs.js"],
|
|
# wasm_cc_binary makes the canvaskit.js/canvaskit.wasm based on the actual name
|
|
# of the executable.
|
|
linkopts = CK_OPTS,
|
|
local_defines = CK_DEFINES,
|
|
set_flags = {
|
|
"disable_tracing": ["True"],
|
|
"include_decoder": [
|
|
"jpeg_decode_codec",
|
|
"png_decode_codec",
|
|
"webp_decode_codec",
|
|
"gif_decode_codec",
|
|
],
|
|
"include_encoder": [
|
|
"jpeg_encode_codec",
|
|
"png_encode_codec",
|
|
"webp_encode_codec",
|
|
],
|
|
# TODO(kjlubick) make this optional, depending on enable_fonts
|
|
"fontmgr_factory": [
|
|
"custom_embedded_fontmgr_factory",
|
|
],
|
|
"gpu_backend": [
|
|
"gl_backend",
|
|
],
|
|
"with_gl_standard": [
|
|
"webgl_standard",
|
|
],
|
|
"use_icu": [
|
|
"True",
|
|
],
|
|
"shaper_backend": [
|
|
"harfbuzz_shaper",
|
|
],
|
|
},
|
|
# This target won't build successfully on its own because of missing emscripten
|
|
# headers etc. Therefore, we hide it from wildcards.
|
|
tags = ["manual"],
|
|
deps = [
|
|
"//:skia_core",
|
|
] + select({
|
|
":enable_fonts_true": [
|
|
"//modules/skparagraph",
|
|
],
|
|
":enable_fonts_false": [],
|
|
}) + select({
|
|
":enable_skottie_true": [
|
|
"//modules/skottie",
|
|
"//modules/skottie:utils",
|
|
],
|
|
":enable_skottie_false": [],
|
|
}) + select({
|
|
":enable_particles_true": [
|
|
"//modules/particles",
|
|
],
|
|
":enable_particles_false": [],
|
|
}),
|
|
)
|
|
|
|
wasm_cc_binary(
|
|
name = "canvaskit_wasm",
|
|
# Whatever is before the dot will be the name of the output js and wasm, aka "the stem".
|
|
# https://github.com/emscripten-core/emsdk/blob/82ad00499a42abde16b363239d2bc83bf5d863ab/bazel/emscripten_toolchain/wasm_cc_binary.bzl#L91
|
|
cc_target = ":canvaskit.with_flags",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_canvas_polyfill",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_fonts",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "include_embedded_font",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_skottie",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_skp_serialization",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_particles",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_runtime_effect",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "enable_sksl_tracing",
|
|
)
|
|
|
|
bool_flag(
|
|
default = True,
|
|
flag_name = "include_matrix_js",
|
|
)
|
|
|
|
karma_test(
|
|
name = "canvaskit_js_wasms",
|
|
srcs = [
|
|
":canvaskit_wasm/canvaskit.js",
|
|
# We want to make sure the CanvasKit JS is loaded before the loader script
|
|
"tests/bazel/canvaskitinit.js",
|
|
"tests/bazel/util.js",
|
|
"tests/bazel/test_reporter.js",
|
|
# which is loaded before the tests...
|
|
"tests/bazel/smoke_test.js",
|
|
"tests/bazel/canvas_test.js",
|
|
"tests/bazel/canvas2d_test.js",
|
|
"tests/bazel/core_test.js",
|
|
"tests/bazel/font_test.js",
|
|
"tests/bazel/matrix_test.js",
|
|
"tests/bazel/paragraph_test.js",
|
|
"tests/bazel/path_test.js",
|
|
"tests/bazel/rtshader_test.js",
|
|
"tests/bazel/skottie_test.js",
|
|
],
|
|
config_file = "karma.bazel.js",
|
|
# The tests need the Gold server to be up and running so they can make POST requests to
|
|
# exfiltrate the PNGs they create.
|
|
env = "//modules/canvaskit/go/gold_test_env:gold_test_env",
|
|
static_files = [
|
|
":canvaskit_wasm/canvaskit.wasm",
|
|
"//modules/canvaskit/tests/assets:test_assets",
|
|
],
|
|
)
|