1*c8dee2aaSAndroid Build Coastguard Worker#!/bin/bash 2*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2018 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 WorkerHTML_SHELL=$BASE_DIR/shell.html 11*c8dee2aaSAndroid Build Coastguard WorkerBUILD_DIR=${BUILD_DIR:="out/pathkit"} 12*c8dee2aaSAndroid Build Coastguard Workermkdir -p $BUILD_DIR 13*c8dee2aaSAndroid Build Coastguard Worker# sometimes the .a files keep old symbols around - cleaning them out makes sure 14*c8dee2aaSAndroid Build Coastguard Worker# we get a fresh build. 15*c8dee2aaSAndroid Build Coastguard Workerrm -f $BUILD_DIR/*.a 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker# This expects the environment variable EMSDK to be set 18*c8dee2aaSAndroid Build Coastguard Workerif [[ ! -d $EMSDK ]]; then 19*c8dee2aaSAndroid Build Coastguard Worker echo "Be sure to set the EMSDK environment variable." 20*c8dee2aaSAndroid Build Coastguard Worker exit 1 21*c8dee2aaSAndroid Build Coastguard Workerfi 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker# Navigate to SKIA_HOME from where this file is located. 24*c8dee2aaSAndroid Build Coastguard Workerpushd $BASE_DIR/../.. 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Workerecho "Putting output in $BUILD_DIR (pwd = `pwd`)" 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker# Run this from $SKIA_HOME, not from the directory this file is in. 29*c8dee2aaSAndroid Build Coastguard Workerif [[ ! -d ./src ]]; then 30*c8dee2aaSAndroid Build Coastguard Worker echo "Cannot locate Skia source. Is the source checkout okay? Exiting." 31*c8dee2aaSAndroid Build Coastguard Worker exit 1 32*c8dee2aaSAndroid Build Coastguard Workerfi 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Workerif [[ $@ == *help* ]]; then 35*c8dee2aaSAndroid Build Coastguard Worker echo "By default, this script builds a production WASM build of PathKit." 36*c8dee2aaSAndroid Build Coastguard Worker echo "" 37*c8dee2aaSAndroid Build Coastguard Worker echo "It is put in ${BUILD_DIR}, configured by the BUILD_DIR environment" 38*c8dee2aaSAndroid Build Coastguard Worker echo "variable. Additionally, the EMSDK environment variable must be set." 39*c8dee2aaSAndroid Build Coastguard Worker echo "This script takes several optional parameters:" 40*c8dee2aaSAndroid Build Coastguard Worker echo " test = Make a build suitable for running tests or profiling" 41*c8dee2aaSAndroid Build Coastguard Worker echo " debug = Make a build suitable for debugging (defines SK_DEBUG)" 42*c8dee2aaSAndroid Build Coastguard Worker echo " asm.js = Build for asm.js instead of WASM (very experimental)" 43*c8dee2aaSAndroid Build Coastguard Worker echo " serve = starts a webserver allowing a user to navigate to" 44*c8dee2aaSAndroid Build Coastguard Worker echo " localhost:8000/pathkit.html to view the demo page." 45*c8dee2aaSAndroid Build Coastguard Worker exit 0 46*c8dee2aaSAndroid Build Coastguard Workerfi 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker# Use -O0 for larger builds (but generally quicker) 50*c8dee2aaSAndroid Build Coastguard Worker# Use -Oz for (much slower, but smaller/faster) production builds 51*c8dee2aaSAndroid Build Coastguard Workerexport EMCC_CLOSURE_ARGS="--externs $BASE_DIR/externs.js " 52*c8dee2aaSAndroid Build Coastguard WorkerRELEASE_CONF="-Oz --closure 1 -DSK_RELEASE" 53*c8dee2aaSAndroid Build Coastguard Worker# It is very important for the -DSK_RELEASE/-DSK_DEBUG to match on the libskia.a, otherwise 54*c8dee2aaSAndroid Build Coastguard Worker# things like SKDEBUGCODE are sometimes compiled in and sometimes not, which can cause headaches 55*c8dee2aaSAndroid Build Coastguard Worker# like sizeof() mismatching between .cpp files and .h files. 56*c8dee2aaSAndroid Build Coastguard WorkerEXTRA_CFLAGS="\"-DSK_RELEASE\"" 57*c8dee2aaSAndroid Build Coastguard Workerif [[ $@ == *test* ]]; then 58*c8dee2aaSAndroid Build Coastguard Worker echo "Building a Testing/Profiling build" 59*c8dee2aaSAndroid Build Coastguard Worker RELEASE_CONF="-O2 --profiling -DPATHKIT_TESTING -DSK_RELEASE" 60*c8dee2aaSAndroid Build Coastguard Workerelif [[ $@ == *debug* ]]; then 61*c8dee2aaSAndroid Build Coastguard Worker echo "Building a Debug build" 62*c8dee2aaSAndroid Build Coastguard Worker EXTRA_CFLAGS="\"-DSK_DEBUG\"" 63*c8dee2aaSAndroid Build Coastguard Worker RELEASE_CONF="-O0 --js-opts 0 -sSAFE_HEAP=1 -sASSERTIONS=1 -g3 -DPATHKIT_TESTING -DSK_DEBUG" 64*c8dee2aaSAndroid Build Coastguard Workerfi 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard WorkerWASM_CONF="-sWASM=1" 67*c8dee2aaSAndroid Build Coastguard Workerif [[ $@ == *asm.js* ]]; then 68*c8dee2aaSAndroid Build Coastguard Worker echo "Building with asm.js instead of WASM" 69*c8dee2aaSAndroid Build Coastguard Worker WASM_CONF="-sWASM=0 -sALLOW_MEMORY_GROWTH=1" 70*c8dee2aaSAndroid Build Coastguard Workerfi 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard WorkerOUTPUT="-o $BUILD_DIR/pathkit.js" 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Workersource $EMSDK/emsdk_env.sh 75*c8dee2aaSAndroid Build Coastguard WorkerEMCXX=`which em++` 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker./bin/fetch-ninja 78*c8dee2aaSAndroid Build Coastguard WorkerNINJA=third_party/ninja/ninja 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Workerecho "Compiling bitcode" 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker./bin/fetch-gn 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker./bin/gn gen ${BUILD_DIR} \ 85*c8dee2aaSAndroid Build Coastguard Worker --args="skia_emsdk_dir=\"${EMSDK}\" \ 86*c8dee2aaSAndroid Build Coastguard Worker extra_cflags=[ 87*c8dee2aaSAndroid Build Coastguard Worker \"-sMAIN_MODULE=1\", 88*c8dee2aaSAndroid Build Coastguard Worker ${EXTRA_CFLAGS} 89*c8dee2aaSAndroid Build Coastguard Worker ] \ 90*c8dee2aaSAndroid Build Coastguard Worker is_debug=false \ 91*c8dee2aaSAndroid Build Coastguard Worker is_official_build=true \ 92*c8dee2aaSAndroid Build Coastguard Worker is_trivial_abi=true \ 93*c8dee2aaSAndroid Build Coastguard Worker is_component_build=false \ 94*c8dee2aaSAndroid Build Coastguard Worker werror=true \ 95*c8dee2aaSAndroid Build Coastguard Worker target_cpu=\"wasm\" " 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker${NINJA} -C ${BUILD_DIR} libpathkit.a 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Workerecho "Generating WASM" 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker${EMCXX} $RELEASE_CONF -std=c++17 \ 102*c8dee2aaSAndroid Build Coastguard Worker-I. \ 103*c8dee2aaSAndroid Build Coastguard Worker--bind \ 104*c8dee2aaSAndroid Build Coastguard Worker--no-entry \ 105*c8dee2aaSAndroid Build Coastguard Worker--pre-js $BASE_DIR/helper.js \ 106*c8dee2aaSAndroid Build Coastguard Worker--pre-js $BASE_DIR/chaining.js \ 107*c8dee2aaSAndroid Build Coastguard Worker-fno-rtti -fno-exceptions -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 \ 108*c8dee2aaSAndroid Build Coastguard Worker"-DSK_TRIVIAL_ABI=[[clang::trivial_abi]]" \ 109*c8dee2aaSAndroid Build Coastguard Worker$WASM_CONF \ 110*c8dee2aaSAndroid Build Coastguard Worker-sERROR_ON_UNDEFINED_SYMBOLS=1 \ 111*c8dee2aaSAndroid Build Coastguard Worker-sEXPORT_NAME="PathKitInit" \ 112*c8dee2aaSAndroid Build Coastguard Worker-sMODULARIZE=1 \ 113*c8dee2aaSAndroid Build Coastguard Worker-sNO_EXIT_RUNTIME=1 \ 114*c8dee2aaSAndroid Build Coastguard Worker-sNO_FILESYSTEM=1 \ 115*c8dee2aaSAndroid Build Coastguard Worker-sDYNAMIC_EXECUTION=0 \ 116*c8dee2aaSAndroid Build Coastguard Worker-sINITIAL_MEMORY=32MB \ 117*c8dee2aaSAndroid Build Coastguard Worker-sALLOW_MEMORY_GROWTH=1 \ 118*c8dee2aaSAndroid Build Coastguard Worker-sSTRICT=1 \ 119*c8dee2aaSAndroid Build Coastguard Worker$OUTPUT \ 120*c8dee2aaSAndroid Build Coastguard Worker$BASE_DIR/pathkit_wasm_bindings.cpp \ 121*c8dee2aaSAndroid Build Coastguard Worker${BUILD_DIR}/libpathkit.a 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker 124