compile.sh 7.1 KB

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