• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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