1*c8dee2aaSAndroid Build Coastguard Worker#!/bin/bash 2*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2020 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker# 4*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Workerset -ex 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard WorkerBASE_DIR=`cd $(dirname ${BASH_SOURCE[0]}) && pwd` 10*c8dee2aaSAndroid Build Coastguard Worker# This expects the environment variable EMSDK to be set 11*c8dee2aaSAndroid Build Coastguard Workerif [[ ! -d $EMSDK ]]; then 12*c8dee2aaSAndroid Build Coastguard Worker cat >&2 << "EOF" 13*c8dee2aaSAndroid Build Coastguard WorkerBe sure to set the EMSDK environment variable to the location of Emscripten SDK: 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker https://emscripten.org/docs/getting_started/downloads.html 16*c8dee2aaSAndroid Build Coastguard WorkerEOF 17*c8dee2aaSAndroid Build Coastguard Worker exit 1 18*c8dee2aaSAndroid Build Coastguard Workerfi 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker# Navigate to SKIA_HOME from where this file is located. 21*c8dee2aaSAndroid Build Coastguard Workerpushd $BASE_DIR/../.. 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Workersource $EMSDK/emsdk_env.sh 24*c8dee2aaSAndroid Build Coastguard WorkerEMCXX=`which em++` 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Workerif [[ $@ == *debug* ]]; then 27*c8dee2aaSAndroid Build Coastguard Worker echo "Building a Debug build" 28*c8dee2aaSAndroid Build Coastguard Worker DEBUG=true 29*c8dee2aaSAndroid Build Coastguard Worker EXTRA_CFLAGS="\"-DSK_DEBUG\", \"-DGPU_TEST_UTILS\", " 30*c8dee2aaSAndroid Build Coastguard Worker RELEASE_CONF="-O1 --js-opts 0 -sDEMANGLE_SUPPORT=1 -frtti -sASSERTIONS=1 -sGL_ASSERTIONS=1 -g \ 31*c8dee2aaSAndroid Build Coastguard Worker -DSK_DEBUG --pre-js $BASE_DIR/debug.js" 32*c8dee2aaSAndroid Build Coastguard Worker BUILD_DIR=${BUILD_DIR:="out/wasm_gm_tests_debug"} 33*c8dee2aaSAndroid Build Coastguard Workerelse 34*c8dee2aaSAndroid Build Coastguard Worker echo "Building a release build" 35*c8dee2aaSAndroid Build Coastguard Worker DEBUG=false 36*c8dee2aaSAndroid Build Coastguard Worker BUILD_DIR=${BUILD_DIR:="out/wasm_gm_tests"} 37*c8dee2aaSAndroid Build Coastguard Worker RELEASE_CONF="-O3 -DSK_RELEASE --pre-js $BASE_DIR/release.js \ 38*c8dee2aaSAndroid Build Coastguard Worker -DGPU_TEST_UTILS" 39*c8dee2aaSAndroid Build Coastguard Worker EXTRA_CFLAGS="\"-DSK_RELEASE\", \"-DGPU_TEST_UTILS\", " 40*c8dee2aaSAndroid Build Coastguard Workerfi 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard WorkerIS_OFFICIAL_BUILD="false" 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Workermkdir -p $BUILD_DIR 45*c8dee2aaSAndroid Build Coastguard Worker# sometimes the .a files keep old symbols around - cleaning them out makes sure 46*c8dee2aaSAndroid Build Coastguard Worker# we get a fresh build. 47*c8dee2aaSAndroid Build Coastguard Workerrm -f $BUILD_DIR/*.a 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard WorkerGN_GPU="skia_enable_ganesh=true skia_gl_standard = \"webgl\"" 50*c8dee2aaSAndroid Build Coastguard WorkerGN_GPU_FLAGS="\"-DSK_DISABLE_LEGACY_SHADERCONTEXT\"," 51*c8dee2aaSAndroid Build Coastguard WorkerWASM_GPU="-lGL -DSK_GANESH -DSK_GL -DCK_ENABLE_WEBGL \ 52*c8dee2aaSAndroid Build Coastguard Worker -DSK_DISABLE_LEGACY_SHADERCONTEXT --pre-js $BASE_DIR/cpu.js --pre-js $BASE_DIR/webgl.js\ 53*c8dee2aaSAndroid Build Coastguard Worker -sUSE_WEBGL2=1" 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard WorkerGM_LIB="$BUILD_DIR/libgm_wasm.a" 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard WorkerGN_FONT="skia_enable_fontmgr_custom_directory=false " 58*c8dee2aaSAndroid Build Coastguard WorkerBUILTIN_FONT="$BASE_DIR/fonts/NotoMono-Regular.ttf.cpp" 59*c8dee2aaSAndroid Build Coastguard Worker# Generate the font's binary file (which is covered by .gitignore) 60*c8dee2aaSAndroid Build Coastguard Workerpython3 tools/embed_resources.py \ 61*c8dee2aaSAndroid Build Coastguard Worker --name SK_EMBEDDED_FONTS \ 62*c8dee2aaSAndroid Build Coastguard Worker --input $BASE_DIR/fonts/NotoMono-Regular.ttf \ 63*c8dee2aaSAndroid Build Coastguard Worker --output $BASE_DIR/fonts/NotoMono-Regular.ttf.cpp \ 64*c8dee2aaSAndroid Build Coastguard Worker --align 4 65*c8dee2aaSAndroid Build Coastguard WorkerGN_FONT+="skia_enable_fontmgr_custom_embedded=true skia_enable_fontmgr_custom_empty=false" 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard WorkerGN_SHAPER="skia_use_icu=true skia_use_system_icu=false skia_use_harfbuzz=true skia_use_system_harfbuzz=false" 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker./bin/fetch-ninja 71*c8dee2aaSAndroid Build Coastguard WorkerNINJA=third_party/ninja/ninja 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker./bin/fetch-gn 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Workerecho "Compiling bitcode" 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker# Inspired by https://github.com/Zubnix/skia-wasm-port/blob/master/build_bindings.sh 78*c8dee2aaSAndroid Build Coastguard Worker./bin/gn gen ${BUILD_DIR} \ 79*c8dee2aaSAndroid Build Coastguard Worker --args="skia_emsdk_dir=\"${EMSDK}\" \ 80*c8dee2aaSAndroid Build Coastguard Worker extra_cflags_cc=[\"-frtti\"] \ 81*c8dee2aaSAndroid Build Coastguard Worker extra_cflags=[\"-sMAIN_MODULE=1\", 82*c8dee2aaSAndroid Build Coastguard Worker \"-DSKNX_NO_SIMD\", \"-DSK_FORCE_AAA\", 83*c8dee2aaSAndroid Build Coastguard Worker \"-DSK_FORCE_8_BYTE_ALIGNMENT\", 84*c8dee2aaSAndroid Build Coastguard Worker ${GN_GPU_FLAGS} 85*c8dee2aaSAndroid Build Coastguard Worker ${EXTRA_CFLAGS} 86*c8dee2aaSAndroid Build Coastguard Worker ] \ 87*c8dee2aaSAndroid Build Coastguard Worker is_debug=${DEBUG} \ 88*c8dee2aaSAndroid Build Coastguard Worker is_official_build=${IS_OFFICIAL_BUILD} \ 89*c8dee2aaSAndroid Build Coastguard Worker is_trivial_abi=true \ 90*c8dee2aaSAndroid Build Coastguard Worker is_component_build=false \ 91*c8dee2aaSAndroid Build Coastguard Worker werror=true \ 92*c8dee2aaSAndroid Build Coastguard Worker target_cpu=\"wasm\" \ 93*c8dee2aaSAndroid Build Coastguard Worker \ 94*c8dee2aaSAndroid Build Coastguard Worker skia_use_angle=false \ 95*c8dee2aaSAndroid Build Coastguard Worker skia_use_dng_sdk=false \ 96*c8dee2aaSAndroid Build Coastguard Worker skia_use_webgl=true \ 97*c8dee2aaSAndroid Build Coastguard Worker skia_use_fontconfig=false \ 98*c8dee2aaSAndroid Build Coastguard Worker skia_use_freetype=true \ 99*c8dee2aaSAndroid Build Coastguard Worker skia_use_libheif=true \ 100*c8dee2aaSAndroid Build Coastguard Worker skia_use_libjpeg_turbo_decode=true \ 101*c8dee2aaSAndroid Build Coastguard Worker skia_use_libjpeg_turbo_encode=true \ 102*c8dee2aaSAndroid Build Coastguard Worker skia_use_libpng_decode=true \ 103*c8dee2aaSAndroid Build Coastguard Worker skia_use_libpng_encode=true \ 104*c8dee2aaSAndroid Build Coastguard Worker skia_use_libwebp_decode=true \ 105*c8dee2aaSAndroid Build Coastguard Worker skia_use_libwebp_encode=true \ 106*c8dee2aaSAndroid Build Coastguard Worker skia_use_lua=false \ 107*c8dee2aaSAndroid Build Coastguard Worker skia_use_piex=true \ 108*c8dee2aaSAndroid Build Coastguard Worker skia_use_system_freetype2=false \ 109*c8dee2aaSAndroid Build Coastguard Worker skia_use_system_libjpeg_turbo=false \ 110*c8dee2aaSAndroid Build Coastguard Worker skia_use_system_libpng=false \ 111*c8dee2aaSAndroid Build Coastguard Worker skia_use_system_libwebp=false \ 112*c8dee2aaSAndroid Build Coastguard Worker skia_use_system_zlib=false\ 113*c8dee2aaSAndroid Build Coastguard Worker skia_use_vulkan=false \ 114*c8dee2aaSAndroid Build Coastguard Worker skia_use_wuffs=true \ 115*c8dee2aaSAndroid Build Coastguard Worker skia_use_zlib=true \ 116*c8dee2aaSAndroid Build Coastguard Worker \ 117*c8dee2aaSAndroid Build Coastguard Worker ${GN_SHAPER} \ 118*c8dee2aaSAndroid Build Coastguard Worker ${GN_GPU} \ 119*c8dee2aaSAndroid Build Coastguard Worker ${GN_FONT} \ 120*c8dee2aaSAndroid Build Coastguard Worker skia_use_expat=true \ 121*c8dee2aaSAndroid Build Coastguard Worker skia_enable_svg=true \ 122*c8dee2aaSAndroid Build Coastguard Worker skia_enable_skshaper=true \ 123*c8dee2aaSAndroid Build Coastguard Worker skia_enable_skparagraph=true \ 124*c8dee2aaSAndroid Build Coastguard Worker skia_enable_pdf=false" 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker# Build all the libs we will need below 127*c8dee2aaSAndroid Build Coastguard Workerparse_targets() { 128*c8dee2aaSAndroid Build Coastguard Worker for LIBPATH in $@; do 129*c8dee2aaSAndroid Build Coastguard Worker basename $LIBPATH 130*c8dee2aaSAndroid Build Coastguard Worker done 131*c8dee2aaSAndroid Build Coastguard Worker} 132*c8dee2aaSAndroid Build Coastguard Worker${NINJA} -C ${BUILD_DIR} libskia.a libskshaper.a libskunicode_core.a libskunicode_icu.a \ 133*c8dee2aaSAndroid Build Coastguard Worker $(parse_targets $GM_LIB) 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Workerecho "Generating final wasm" 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker# Defines for the emscripten compilation step, which builds the tests 138*c8dee2aaSAndroid Build Coastguard Worker# Aim to match the defines that would be set by gn for the skia compilation step. 139*c8dee2aaSAndroid Build Coastguard WorkerSKIA_DEFINES=" 140*c8dee2aaSAndroid Build Coastguard Worker-DSK_FORCE_AAA \ 141*c8dee2aaSAndroid Build Coastguard Worker-DSK_FORCE_8_BYTE_ALIGNMENT \ 142*c8dee2aaSAndroid Build Coastguard Worker-DSK_HAS_WUFFS_LIBRARY \ 143*c8dee2aaSAndroid Build Coastguard Worker-DSK_HAS_HEIF_LIBRARY \ 144*c8dee2aaSAndroid Build Coastguard Worker-DSK_CODEC_DECODES_WEBP \ 145*c8dee2aaSAndroid Build Coastguard Worker-DSK_CODEC_DECODES_PNG \ 146*c8dee2aaSAndroid Build Coastguard Worker-DSK_CODEC_DECODES_JPEG \ 147*c8dee2aaSAndroid Build Coastguard Worker-DSK_SHAPER_HARFBUZZ_AVAILABLE \ 148*c8dee2aaSAndroid Build Coastguard Worker-DSK_UNICODE_AVAILABLE \ 149*c8dee2aaSAndroid Build Coastguard Worker-DSK_UNICODE_ICU_IMPLEMENTATION \ 150*c8dee2aaSAndroid Build Coastguard Worker-DSK_ENABLE_SVG \ 151*c8dee2aaSAndroid Build Coastguard Worker-DSK_TRIVIAL_ABI=[[clang::trivial_abi]]" 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard WorkerGMS_TO_BUILD="gm/*.cpp" 154*c8dee2aaSAndroid Build Coastguard WorkerTESTS_TO_BUILD="tests/*.cpp" 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker# When developing locally, it can be faster to focus only on the gms or tests you care about 157*c8dee2aaSAndroid Build Coastguard Worker# (since they all have to be recompiled/relinked) every time. To do so, mark the following as true 158*c8dee2aaSAndroid Build Coastguard Workerif false; then 159*c8dee2aaSAndroid Build Coastguard Worker GMS_TO_BUILD="gm/gm.cpp" 160*c8dee2aaSAndroid Build Coastguard Worker TESTS_TO_BUILD="tests/BulkRectTest.cpp tests/Test.cpp" 161*c8dee2aaSAndroid Build Coastguard Workerfi 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker# These gms do not compile or link with the WASM code. Thus, we omit them. 164*c8dee2aaSAndroid Build Coastguard WorkerGLOBIGNORE="gm/compressed_textures.cpp:"\ 165*c8dee2aaSAndroid Build Coastguard Worker"gm/animated_gif.cpp:"\ 166*c8dee2aaSAndroid Build Coastguard Worker"gm/fiddle.cpp:"\ 167*c8dee2aaSAndroid Build Coastguard Worker"gm/fontations.cpp:"\ 168*c8dee2aaSAndroid Build Coastguard Worker"gm/fontations_ft_compare.cpp:"\ 169*c8dee2aaSAndroid Build Coastguard Worker"gm/video_decoder.cpp:" 170*c8dee2aaSAndroid Build Coastguard Worker 171*c8dee2aaSAndroid Build Coastguard Worker# These tests do not compile with the WASM code (require other deps). 172*c8dee2aaSAndroid Build Coastguard WorkerGLOBIGNORE+="tests/CodecTest.cpp:"\ 173*c8dee2aaSAndroid Build Coastguard Worker"tests/CodecAnimTest.cpp:"\ 174*c8dee2aaSAndroid Build Coastguard Worker"tests/ColorSpaceTest.cpp:"\ 175*c8dee2aaSAndroid Build Coastguard Worker"tests/DrawOpAtlasTest.cpp:"\ 176*c8dee2aaSAndroid Build Coastguard Worker"tests/EncodeTest.cpp:"\ 177*c8dee2aaSAndroid Build Coastguard Worker"tests/FontMgrAndroidTest.cpp:"\ 178*c8dee2aaSAndroid Build Coastguard Worker"tests/FontMgrAndroidParserTest.cpp:"\ 179*c8dee2aaSAndroid Build Coastguard Worker"tests/FontMgrFontConfigTest.cpp:"\ 180*c8dee2aaSAndroid Build Coastguard Worker"tests/FontationsTest.cpp:"\ 181*c8dee2aaSAndroid Build Coastguard Worker"tests/FontationsFtCompTest.cpp:"\ 182*c8dee2aaSAndroid Build Coastguard Worker"tests/FontScanner_FontationsTest.cpp:"\ 183*c8dee2aaSAndroid Build Coastguard Worker"tests/FontScanner_FreeTypeTest.cpp:"\ 184*c8dee2aaSAndroid Build Coastguard Worker"tests/FCITest.cpp:"\ 185*c8dee2aaSAndroid Build Coastguard Worker"tests/JpegGainmapTest.cpp:"\ 186*c8dee2aaSAndroid Build Coastguard Worker"tests/SkPngRustDecoderTest.cpp:"\ 187*c8dee2aaSAndroid Build Coastguard Worker"tests/SkPngRustEncoderTest.cpp:"\ 188*c8dee2aaSAndroid Build Coastguard Worker"tests/TypefaceMacTest.cpp:" 189*c8dee2aaSAndroid Build Coastguard Worker 190*c8dee2aaSAndroid Build Coastguard Worker# These tests do complex things with TestContexts, which is not easily supported for the WASM 191*c8dee2aaSAndroid Build Coastguard Worker# test harness. Thus we omit them. 192*c8dee2aaSAndroid Build Coastguard WorkerGLOBIGNORE+="tests/BackendAllocationTest.cpp:"\ 193*c8dee2aaSAndroid Build Coastguard Worker"tests/EGLImageTest.cpp:"\ 194*c8dee2aaSAndroid Build Coastguard Worker"tests/ImageTest.cpp:"\ 195*c8dee2aaSAndroid Build Coastguard Worker"tests/SurfaceSemaphoreTest.cpp:"\ 196*c8dee2aaSAndroid Build Coastguard Worker"tests/TextureBindingsResetTest.cpp:"\ 197*c8dee2aaSAndroid Build Coastguard Worker"tests/VkHardwareBufferTest.cpp:" 198*c8dee2aaSAndroid Build Coastguard Worker 199*c8dee2aaSAndroid Build Coastguard Worker# All the tests in these files crash. 200*c8dee2aaSAndroid Build Coastguard WorkerGLOBIGNORE+="tests/GrThreadSafeCacheTest.cpp:" 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker# Bazel-related ignores (test runners, incompatible GMs, etc.). 203*c8dee2aaSAndroid Build Coastguard WorkerGLOBIGNORE+="gm/png_codec.cpp" 204*c8dee2aaSAndroid Build Coastguard Worker 205*c8dee2aaSAndroid Build Coastguard Worker# Emscripten prefers that the .a files go last in order, otherwise, it 206*c8dee2aaSAndroid Build Coastguard Worker# may drop symbols that it incorrectly thinks aren't used. One day, 207*c8dee2aaSAndroid Build Coastguard Worker# Emscripten will use LLD, which may relax this requirement. 208*c8dee2aaSAndroid Build Coastguard WorkerEMCC_DEBUG=1 ${EMCXX} \ 209*c8dee2aaSAndroid Build Coastguard Worker $RELEASE_CONF \ 210*c8dee2aaSAndroid Build Coastguard Worker -I. \ 211*c8dee2aaSAndroid Build Coastguard Worker -DGPU_TEST_UTILS \ 212*c8dee2aaSAndroid Build Coastguard Worker $SKIA_DEFINES \ 213*c8dee2aaSAndroid Build Coastguard Worker $WASM_GPU \ 214*c8dee2aaSAndroid Build Coastguard Worker -std=c++17 \ 215*c8dee2aaSAndroid Build Coastguard Worker --profiling-funcs \ 216*c8dee2aaSAndroid Build Coastguard Worker --profiling \ 217*c8dee2aaSAndroid Build Coastguard Worker --bind \ 218*c8dee2aaSAndroid Build Coastguard Worker --no-entry \ 219*c8dee2aaSAndroid Build Coastguard Worker --pre-js $BASE_DIR/gm.js \ 220*c8dee2aaSAndroid Build Coastguard Worker tools/Resources.cpp \ 221*c8dee2aaSAndroid Build Coastguard Worker $BASE_DIR/gm_bindings.cpp \ 222*c8dee2aaSAndroid Build Coastguard Worker $GMS_TO_BUILD \ 223*c8dee2aaSAndroid Build Coastguard Worker $TESTS_TO_BUILD \ 224*c8dee2aaSAndroid Build Coastguard Worker $GM_LIB \ 225*c8dee2aaSAndroid Build Coastguard Worker $BUILD_DIR/libskshaper.a \ 226*c8dee2aaSAndroid Build Coastguard Worker $BUILD_DIR/libskunicode_core.a \ 227*c8dee2aaSAndroid Build Coastguard Worker $BUILD_DIR/libskunicode_icu.a \ 228*c8dee2aaSAndroid Build Coastguard Worker $BUILD_DIR/libsvg.a \ 229*c8dee2aaSAndroid Build Coastguard Worker $BUILD_DIR/libskia.a \ 230*c8dee2aaSAndroid Build Coastguard Worker $BUILTIN_FONT \ 231*c8dee2aaSAndroid Build Coastguard Worker -sALLOW_MEMORY_GROWTH=1 \ 232*c8dee2aaSAndroid Build Coastguard Worker -sEXPORT_NAME="InitWasmGMTests" \ 233*c8dee2aaSAndroid Build Coastguard Worker -sEXPORTED_FUNCTIONS=['_malloc','_free'] \ 234*c8dee2aaSAndroid Build Coastguard Worker -sFORCE_FILESYSTEM=1 \ 235*c8dee2aaSAndroid Build Coastguard Worker -sFILESYSTEM=1 \ 236*c8dee2aaSAndroid Build Coastguard Worker -sMODULARIZE=1 \ 237*c8dee2aaSAndroid Build Coastguard Worker -sNO_EXIT_RUNTIME=1 \ 238*c8dee2aaSAndroid Build Coastguard Worker -sINITIAL_MEMORY=256MB \ 239*c8dee2aaSAndroid Build Coastguard Worker -sWASM=1 \ 240*c8dee2aaSAndroid Build Coastguard Worker -sSTRICT=1 \ 241*c8dee2aaSAndroid Build Coastguard Worker -o $BUILD_DIR/wasm_gm_tests.js 242