1#!/bin/bash 2# Copyright 2018 Google LLC 3# 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7set -ex 8 9BASE_DIR=`cd $(dirname ${BASH_SOURCE[0]}) && pwd` 10# This expects the environment variable EMSDK to be set 11if [[ ! -d $EMSDK ]]; then 12 echo "Be sure to set the EMSDK environment variable." 13 exit 1 14fi 15 16# Navigate to SKIA_HOME from where this file is located. 17pushd $BASE_DIR/../.. 18 19source $EMSDK/emsdk_env.sh 20EMCC=`which emcc` 21EMCXX=`which em++` 22 23RELEASE_CONF="-Oz --closure 1 --llvm-lto 3 -DSK_RELEASE --pre-js $BASE_DIR/release.js \ 24 -DGR_GL_CHECK_ALLOC_WITH_GET_ERROR=0" 25EXTRA_CFLAGS="\"-DSK_RELEASE\", \"-DGR_GL_CHECK_ALLOC_WITH_GET_ERROR=0\"," 26if [[ $@ == *debug* ]]; then 27 echo "Building a Debug build" 28 EXTRA_CFLAGS="\"-DSK_DEBUG\"" 29 RELEASE_CONF="-O0 --js-opts 0 -s DEMANGLE_SUPPORT=1 -s ASSERTIONS=1 -s GL_ASSERTIONS=1 -g4 \ 30 --source-map-base /node_modules/canvaskit/bin/ -DSK_DEBUG --pre-js $BASE_DIR/debug.js" 31 BUILD_DIR=${BUILD_DIR:="out/canvaskit_wasm_debug"} 32elif [[ $@ == *profiling* ]]; then 33 echo "Building a build for profiling" 34 RELEASE_CONF="-O3 --source-map-base /node_modules/canvaskit/bin/ --profiling -g4 -DSK_RELEASE \ 35 --pre-js $BASE_DIR/release.js -DGR_GL_CHECK_ALLOC_WITH_GET_ERROR=0" 36 BUILD_DIR=${BUILD_DIR:="out/canvaskit_wasm_profile"} 37else 38 BUILD_DIR=${BUILD_DIR:="out/canvaskit_wasm"} 39fi 40 41mkdir -p $BUILD_DIR 42 43GN_GPU="skia_enable_gpu=true" 44GN_GPU_FLAGS="\"-DIS_WEBGL=1\", \"-DSK_DISABLE_LEGACY_SHADERCONTEXT\"," 45WASM_GPU="-lEGL -lGLESv2 -DSK_SUPPORT_GPU=1 \ 46 -DSK_DISABLE_LEGACY_SHADERCONTEXT --pre-js $BASE_DIR/cpu.js --pre-js $BASE_DIR/gpu.js" 47if [[ $@ == *cpu* ]]; then 48 echo "Using the CPU backend instead of the GPU backend" 49 GN_GPU="skia_enable_gpu=false" 50 GN_GPU_FLAGS="" 51 WASM_GPU="-DSK_SUPPORT_GPU=0 --pre-js $BASE_DIR/cpu.js" 52fi 53 54SKOTTIE_JS="--pre-js $BASE_DIR/skottie.js" 55SKOTTIE_BINDINGS="$BASE_DIR/skottie_bindings.cpp" 56 57SKOTTIE_LIB="$BUILD_DIR/libskottie.a \ 58 $BUILD_DIR/libsksg.a" 59 60if [[ $@ == *no_skottie* ]]; then 61 echo "Omitting Skottie" 62 SKOTTIE_JS="" 63 SKOTTIE_LIB="" 64 SKOTTIE_BINDINGS="" 65fi 66 67MANAGED_SKOTTIE_BINDINGS="\ 68 -DSK_INCLUDE_MANAGED_SKOTTIE=1 \ 69 modules/skottie/utils/SkottieUtils.cpp" 70if [[ $@ == *no_managed_skottie* ]]; then 71 echo "Omitting managed Skottie" 72 MANAGED_SKOTTIE_BINDINGS="-DSK_INCLUDE_MANAGED_SKOTTIE=0" 73fi 74 75PARTICLES_BINDINGS="$BASE_DIR/particles_bindings.cpp" 76PARTICLES_LIB="$BUILD_DIR/libparticles.a" 77 78if [[ $@ == *no_particles* ]]; then 79 echo "Omitting Particles" 80 PARTICLES_BINDINGS="" 81 PARTICLES_LIB="" 82fi 83 84HTML_CANVAS_API="--pre-js $BASE_DIR/htmlcanvas/preamble.js \ 85--pre-js $BASE_DIR/htmlcanvas/util.js \ 86--pre-js $BASE_DIR/htmlcanvas/color.js \ 87--pre-js $BASE_DIR/htmlcanvas/font.js \ 88--pre-js $BASE_DIR/htmlcanvas/canvas2dcontext.js \ 89--pre-js $BASE_DIR/htmlcanvas/htmlcanvas.js \ 90--pre-js $BASE_DIR/htmlcanvas/imagedata.js \ 91--pre-js $BASE_DIR/htmlcanvas/lineargradient.js \ 92--pre-js $BASE_DIR/htmlcanvas/path2d.js \ 93--pre-js $BASE_DIR/htmlcanvas/pattern.js \ 94--pre-js $BASE_DIR/htmlcanvas/radialgradient.js \ 95--pre-js $BASE_DIR/htmlcanvas/postamble.js " 96if [[ $@ == *no_canvas* ]]; then 97 echo "Omitting bindings for HTML Canvas API" 98 HTML_CANVAS_API="" 99fi 100 101BUILTIN_FONT="$BASE_DIR/fonts/NotoMono-Regular.ttf.cpp" 102if [[ $@ == *no_font* ]]; then 103 echo "Omitting the built-in font(s)" 104 BUILTIN_FONT="" 105else 106 # Generate the font's binary file (which is covered by .gitignore) 107 python tools/embed_resources.py \ 108 --name SK_EMBEDDED_FONTS \ 109 --input $BASE_DIR/fonts/NotoMono-Regular.ttf \ 110 --output $BASE_DIR/fonts/NotoMono-Regular.ttf.cpp \ 111 --align 4 112fi 113 114GN_SHAPER="skia_use_icu=true skia_use_system_icu=false skia_use_system_harfbuzz=false" 115SHAPER_LIB="$BUILD_DIR/libharfbuzz.a \ 116 $BUILD_DIR/libicu.a" 117SHAPER_TARGETS="libharfbuzz.a libicu.a" 118if [[ $@ == *primitive_shaper* ]]; then 119 echo "Using the primitive shaper instead of the harfbuzz/icu one" 120 GN_SHAPER="skia_use_icu=false skia_use_harfbuzz=false" 121 SHAPER_LIB="" 122 SHAPER_TARGETS="" 123fi 124 125# Turn off exiting while we check for ninja (which may not be on PATH) 126set +e 127NINJA=`which ninja` 128if [[ -z $NINJA ]]; then 129 git clone "https://chromium.googlesource.com/chromium/tools/depot_tools.git" --depth 1 $BUILD_DIR/depot_tools 130 NINJA=$BUILD_DIR/depot_tools/ninja 131fi 132# Re-enable error checking 133set -e 134 135./bin/fetch-gn 136 137echo "Compiling bitcode" 138 139# Inspired by https://github.com/Zubnix/skia-wasm-port/blob/master/build_bindings.sh 140./bin/gn gen ${BUILD_DIR} \ 141 --args="cc=\"${EMCC}\" \ 142 cxx=\"${EMCXX}\" \ 143 extra_cflags_cc=[\"-frtti\"] \ 144 extra_cflags=[\"-s\",\"USE_FREETYPE=1\",\"-s\",\"USE_LIBPNG=1\", \"-s\", \"WARN_UNALIGNED=1\", 145 \"-DSKNX_NO_SIMD\", \"-DSK_DISABLE_AAA\", \"-DSK_DISABLE_DAA\", \"-DSK_DISABLE_READBUFFER\", 146 \"-DSK_DISABLE_EFFECT_DESERIALIZATION\", 147 ${GN_GPU_FLAGS} 148 ${EXTRA_CFLAGS} 149 ] \ 150 is_debug=false \ 151 is_official_build=true \ 152 is_component_build=false \ 153 target_cpu=\"wasm\" \ 154 \ 155 skia_use_angle = false \ 156 skia_use_dng_sdk=false \ 157 skia_use_egl=true \ 158 skia_use_expat=false \ 159 skia_use_fontconfig=false \ 160 skia_use_freetype=true \ 161 skia_use_libheif=false \ 162 skia_use_libjpeg_turbo=true \ 163 skia_use_libpng=true \ 164 skia_use_libwebp=false \ 165 skia_use_lua=false \ 166 skia_use_piex=false \ 167 skia_use_system_libpng=true \ 168 skia_use_system_freetype2=true \ 169 skia_use_system_libjpeg_turbo = false \ 170 skia_use_vulkan=false \ 171 skia_use_wuffs = true \ 172 skia_use_zlib=true \ 173 \ 174 ${GN_SHAPER} \ 175 ${GN_GPU} \ 176 \ 177 skia_enable_skshaper=true \ 178 skia_enable_ccpr=false \ 179 skia_enable_nvpr=false \ 180 skia_enable_skpicture=false \ 181 skia_enable_fontmgr_empty=false \ 182 skia_enable_pdf=false" 183 184# Build all the libs, we'll link the appropriate ones down below 185${NINJA} -C ${BUILD_DIR} libskia.a libskottie.a libsksg.a libskshaper.a libparticles.a $SHAPER_TARGETS 186 187export EMCC_CLOSURE_ARGS="--externs $BASE_DIR/externs.js " 188 189echo "Generating final wasm" 190 191# Emscripten prefers that the .a files go last in order, otherwise, it 192# may drop symbols that it incorrectly thinks aren't used. One day, 193# Emscripten will use LLD, which may relax this requirement. 194${EMCXX} \ 195 $RELEASE_CONF \ 196 -Iexperimental \ 197 -Iinclude/c \ 198 -Iinclude/codec \ 199 -Iinclude/config \ 200 -Iinclude/core \ 201 -Iinclude/effects \ 202 -Iinclude/gpu \ 203 -Iinclude/gpu/gl \ 204 -Iinclude/pathops \ 205 -Iinclude/private \ 206 -Iinclude/utils/ \ 207 -Imodules/skottie/include \ 208 -Imodules/skottie/utils \ 209 -Imodules/sksg/include \ 210 -Imodules/skshaper/include \ 211 -Imodules/particles/include \ 212 -Isrc/core/ \ 213 -Isrc/gpu/ \ 214 -Isrc/sfnt/ \ 215 -Isrc/shaders/ \ 216 -Isrc/utils/ \ 217 -Ithird_party/icu \ 218 -Itools \ 219 -DSK_DISABLE_READBUFFER \ 220 -DSK_DISABLE_AAA \ 221 -DSK_DISABLE_DAA \ 222 $WASM_GPU \ 223 -std=c++14 \ 224 --bind \ 225 --pre-js $BASE_DIR/preamble.js \ 226 --pre-js $BASE_DIR/helper.js \ 227 --pre-js $BASE_DIR/interface.js \ 228 $SKOTTIE_JS \ 229 $HTML_CANVAS_API \ 230 --pre-js $BASE_DIR/postamble.js \ 231 --post-js $BASE_DIR/ready.js \ 232 $BUILTIN_FONT \ 233 $BASE_DIR/canvaskit_bindings.cpp \ 234 $PARTICLES_BINDINGS \ 235 $SKOTTIE_BINDINGS \ 236 $MANAGED_SKOTTIE_BINDINGS \ 237 $SKOTTIE_LIB \ 238 $PARTICLES_LIB \ 239 $BUILD_DIR/libskshaper.a \ 240 $SHAPER_LIB \ 241 $BUILD_DIR/libskia.a \ 242 -s ALLOW_MEMORY_GROWTH=1 \ 243 -s EXPORT_NAME="CanvasKitInit" \ 244 -s FORCE_FILESYSTEM=0 \ 245 -s MODULARIZE=1 \ 246 -s NO_EXIT_RUNTIME=1 \ 247 -s STRICT=1 \ 248 -s TOTAL_MEMORY=128MB \ 249 -s USE_FREETYPE=1 \ 250 -s USE_LIBPNG=1 \ 251 -s WARN_UNALIGNED=1 \ 252 -s WASM=1 \ 253 -o $BUILD_DIR/canvaskit.js 254