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") 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", )