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 7 set -ex 8 9 BASE_DIR=`cd $(dirname ${BASH_SOURCE[0]}) && pwd` 10 # This expects the environment variable EMSDK to be set 11 if [[ ! -d $EMSDK ]]; then 12 echo "Be sure to set the EMSDK environment variable." 13 exit 1 14 fi 15 16 # Navigate to SKIA_HOME from where this file is located. 17 pushd $BASE_DIR/../.. 18 19 source $EMSDK/emsdk_env.sh 20 EMCC=`which emcc` 21 EMCXX=`which em++` 22 23 RELEASE_CONF="-Oz --closure 1 --llvm-lto 3 -DSK_RELEASE --pre-js $BASE_DIR/release.js \ 24 -DGR_GL_CHECK_ALLOC_WITH_GET_ERROR=0" 25 EXTRA_CFLAGS="\"-DSK_RELEASE\", \"-DGR_GL_CHECK_ALLOC_WITH_GET_ERROR=0\"," 26 if [[ $@ == *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"} 32 elif [[ $@ == *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"} 37 else 38 BUILD_DIR=${BUILD_DIR:="out/canvaskit_wasm"} 39 fi 40 41 mkdir -p $BUILD_DIR 42 43 GN_GPU="skia_enable_gpu=true" 44 GN_GPU_FLAGS="\"-DIS_WEBGL=1\", \"-DSK_DISABLE_LEGACY_SHADERCONTEXT\"," 45 WASM_GPU="-lEGL -lGLESv2 -DSK_SUPPORT_GPU=1 \ 46 -DSK_DISABLE_LEGACY_SHADERCONTEXT --pre-js $BASE_DIR/cpu.js --pre-js $BASE_DIR/gpu.js" 47 if [[ $@ == *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" 52 fi 53 54 SKOTTIE_JS="--pre-js $BASE_DIR/skottie.js" 55 SKOTTIE_BINDINGS="$BASE_DIR/skottie_bindings.cpp" 56 57 SKOTTIE_LIB="$BUILD_DIR/libskottie.a \ 58 $BUILD_DIR/libsksg.a" 59 60 if [[ $@ == *no_skottie* ]]; then 61 echo "Omitting Skottie" 62 SKOTTIE_JS="" 63 SKOTTIE_LIB="" 64 SKOTTIE_BINDINGS="" 65 fi 66 67 MANAGED_SKOTTIE_BINDINGS="\ 68 -DSK_INCLUDE_MANAGED_SKOTTIE=1 \ 69 modules/skottie/utils/SkottieUtils.cpp" 70 if [[ $@ == *no_managed_skottie* ]]; then 71 echo "Omitting managed Skottie" 72 MANAGED_SKOTTIE_BINDINGS="-DSK_INCLUDE_MANAGED_SKOTTIE=0" 73 fi 74 75 PARTICLES_BINDINGS="$BASE_DIR/particles_bindings.cpp" 76 PARTICLES_LIB="$BUILD_DIR/libparticles.a" 77 78 if [[ $@ == *no_particles* ]]; then 79 echo "Omitting Particles" 80 PARTICLES_BINDINGS="" 81 PARTICLES_LIB="" 82 fi 83 84 HTML_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 " 96 if [[ $@ == *no_canvas* ]]; then 97 echo "Omitting bindings for HTML Canvas API" 98 HTML_CANVAS_API="" 99 fi 100 101 BUILTIN_FONT="$BASE_DIR/fonts/NotoMono-Regular.ttf.cpp" 102 if [[ $@ == *no_font* ]]; then 103 echo "Omitting the built-in font(s)" 104 BUILTIN_FONT="" 105 else 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 112 fi 113 114 GN_SHAPER="skia_use_icu=true skia_use_system_icu=false skia_use_system_harfbuzz=false" 115 SHAPER_LIB="$BUILD_DIR/libharfbuzz.a \ 116 $BUILD_DIR/libicu.a" 117 SHAPER_TARGETS="libharfbuzz.a libicu.a" 118 if [[ $@ == *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="" 123 fi 124 125 # Turn off exiting while we check for ninja (which may not be on PATH) 126 set +e 127 NINJA=`which ninja` 128 if [[ -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 131 fi 132 # Re-enable error checking 133 set -e 134 135 ./bin/fetch-gn 136 137 echo "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 187 export EMCC_CLOSURE_ARGS="--externs $BASE_DIR/externs.js " 188 189 echo "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