xref: /aosp_15_r20/external/skia/modules/canvaskit/compile_gm.sh (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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