1#!/bin/bash
2
3# Build Skia with one of Clang's many sanitizers.
4#
5# $ tools/xsan_build {address,thread,undefined,etc.} [any other flags to pass to make...]
6#
7# This script assumes the use of Clang >=3.2.
8#
9# For more information, see:
10#   http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation
11
12set -e
13set -x
14
15here=$(cd `dirname $0`; echo `pwd`)
16cores=48
17
18echo "Bootstrapping CMake"
19pushd $here/../third_party/externals/cmake
20./bootstrap --parallel=$cores
21make -j $cores cmake
22popd
23
24cmake=$here/../third_party/externals/cmake/bin/cmake
25
26echo "Building Clang"
27pushd $here/../third_party/externals/llvm
28mkdir -p out/
29cd out/
30rm -f CMakeCache.txt   # Force CMake to re-configure, in case DEPS has changed.
31$cmake -DCMAKE_BUILD_TYPE=Release -G Ninja ..
32ninja
33popd
34
35export CC=$here/../third_party/externals/llvm/out/bin/clang
36export CXX=$here/../third_party/externals/llvm/out/bin/clang++
37$CC --version
38
39if [[ "$1" == "memory" ]]; then
40    echo "Building libc++ with MSAN"
41    pushd $here/../third_party/externals/llvm
42    mkdir -p msan_out/
43    cd msan_out/
44    rm -f CMakeCache.txt   # Force CMake to re-configure, in case DEPS has changed.
45    $cmake -DLLVM_USE_SANITIZER=MemoryWithOrigins -DCMAKE_BUILD_TYPE=Release -G Ninja ..
46    ninja cxx cxxabi   # No need to build all of LLVM+Clang with MSAN, just libc++.
47    popd
48
49    msan_out=$here/../third_party/externals/llvm/msan_out
50
51    export GYP_DEFINES="skia_gpu=0 skia_no_fontconfig=1 skia_freetype_static=1 ${GYP_DEFINES}"
52    export CXXFLAGS="-stdlib=libc++ -I$msan_out/include ${CXX_FLAGS}"
53    export LDFLAGS="-stdlib=libc++ -L$msan_out/lib -Wl,-rpath,$msan_out/lib ${LDFLAGS}"
54fi
55export GYP_DEFINES="skia_sanitizer=$1 ${GYP_DEFINES}"
56
57shift
58make $@
59