blob: fb3e10a3c6565b6b60a0c9bae7424005ed07c8a9 [file] [log] [blame]
load("@skia_user_config//:copts.bzl", "DEFAULT_COPTS")
load("//bazel:macros.bzl", "exports_files_legacy", "wasm_cc_binary")
package(
default_applicable_licenses = ["//:license"],
)
licenses(["notice"])
exports_files_legacy()
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
"-fno-rtti",
"--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",
"-sERROR_ON_UNDEFINED_SYMBOLS=0",
"-sFILESYSTEM=0",
"-sEXPORTED_FUNCTIONS=['_malloc','_free']",
]
BASE_OPTS = [
"-DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0",
"-DSK_TRIVIAL_ABI=[[clang::trivial_abi]]",
]
RELEASE_OPTS = BASE_OPTS + [
"-Oz",
"--closure 1",
"-DSK_RELEASE",
]
DEBUG_OPTS = BASE_OPTS + [
"-O0",
"--js-opts",
"0",
"-sSAFE_HEAP=1",
"-sASSERTIONS=1",
"-g3",
"-DPATHKIT_TESTING",
"-DSK_DEBUG",
]
# 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",
"EMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0", # Allows us to compile with -fno-rtti
]
CK_RELEASE_OPTS = [
# Run the closure compiler
"--closure 1",
# pass the externs file in
"--closure-args=--externs=$(location externs.js)",
]
CK_LINKOPTS = BASE_LINKOPTS + [
"-sEXPORT_NAME=PathKitInit",
"-sINITIAL_MEMORY=32MB",
"--pre-js",
"modules/pathkit/chaining.js",
"--pre-js",
"modules/pathkit/helper.js",
] + select({
"//bazel/common_config_settings:debug_build": DEBUG_OPTS,
"//conditions:default": RELEASE_OPTS + CK_RELEASE_OPTS,
})
# 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_LINKOPTS.
JS_INTERFACE_FILES = [
"chaining.js",
"helper.js",
]
CK_SRCS = [
"pathkit_wasm_bindings.cpp",
]
CK_COPTS = [
"-Wno-header-hygiene",
]
cc_binary(
name = "pathkit.build",
srcs = CK_SRCS,
additional_linker_inputs = JS_INTERFACE_FILES + ["externs.js"],
copts = DEFAULT_COPTS + CK_COPTS,
linkopts = CK_LINKOPTS,
local_defines = CK_DEFINES,
# 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_public",
],
)
wasm_cc_binary(
name = "pathkit",
# 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/4a48a752e6a8bef6f222622f2b4926d5eb3bdeb3/bazel/emscripten_toolchain/wasm_cc_binary.bzl#L179
cc_target = ":pathkit.build",
visibility = [
"//infra/jsfiddle:__pkg__",
],
)