Home | History | Annotate | Download | only in canvaskit
      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