diff options
Diffstat (limited to 'projects/clickhouse/build.sh')
-rwxr-xr-x | projects/clickhouse/build.sh | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/projects/clickhouse/build.sh b/projects/clickhouse/build.sh new file mode 100755 index 000000000..a0415f085 --- /dev/null +++ b/projects/clickhouse/build.sh @@ -0,0 +1,107 @@ +#!/bin/bash -eu +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +################################################################################ + +mkdir $SRC/ClickHouse/build +cd $SRC/ClickHouse/build + +sed -i -e '/warnings.cmake)/d' $SRC/ClickHouse/CMakeLists.txt + +# It will be hard to maintain any compilation fails (if any) in two repositories. +# Also ClickHouse won't compile without this. +# It is very strange, because we have as many warnings as you could imagine. +sed -i -e 's/add_warning(/no_warning(/g' $SRC/ClickHouse/CMakeLists.txt + +# ClickHouse uses libcxx from contrib. +# Enabling this manually will cause duplicate symbols at linker stage. +CXXFLAGS=${CXXFLAGS//-stdlib=libc++/} + +CLICKHOUSE_CMAKE_FLAGS=( + "-DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/ccache" + "-DCMAKE_C_COMPILER=$CC" + "-DCMAKE_CXX_COMPILER=$CXX" + "-DCMAKE_BUILD_TYPE=RelWithDebInfo" + "-DLIB_FUZZING_ENGINE:STRING=$LIB_FUZZING_ENGINE" + "-DENABLE_EMBEDDED_COMPILER=0" + "-DENABLE_THINLTO=0" + "-DENABLE_TESTS=0" + "-DENABLE_EXAMPLES=0" + "-DENABLE_UTILS=0" + "-DENABLE_JEMALLOC=0" + "-DENABLE_FUZZING=1" + "-DENABLE_CLICKHOUSE_ODBC_BRIDGE=OFF" + "-DENABLE_LIBRARIES=0" + "-DENABLE_SSL=1" + "-DUSE_INTERNAL_SSL_LIBRARY=1" + "-DUSE_UNWIND=ON" + "-DGLIBC_COMPATIBILITY=OFF" +) + +if [ "$SANITIZER" = "coverage" ]; then + cmake -G Ninja $SRC/ClickHouse ${CLICKHOUSE_CMAKE_FLAGS[@]} -DCMAKE_CXX_FLAGS="$CXXFLAGS" -DCMAKE_C_FLAGS="$CFLAGS" -DWITH_COVERAGE=1 +else + cmake -G Ninja $SRC/ClickHouse ${CLICKHOUSE_CMAKE_FLAGS[@]} -DCMAKE_CXX_FLAGS="$CXXFLAGS" -DCMAKE_C_FLAGS="$CFLAGS" -DWITH_COVERAGE=1 -DSANITIZE=$SANITIZER +fi + +NUM_JOBS=$(($(nproc || grep -c ^processor /proc/cpuinfo) / 2)) + +TARGETS=$(find $SRC/ClickHouse/src -name '*_fuzzer.cpp' -execdir basename {} .cpp ';' | tr '\n' ' ') + +for FUZZER_TARGET in $TARGETS +do + ninja -j $NUM_JOBS $FUZZER_TARGET + # Find this binary in build directory and strip it + TEMP=$(find $SRC/ClickHouse/build -name $FUZZER_TARGET) + strip --strip-unneeded $TEMP +done + +# copy out fuzzer binaries +find $SRC/ClickHouse/build -name '*_fuzzer' -exec cp -v '{}' $OUT ';' + +# copy out fuzzer options and dictionaries +cp $SRC/ClickHouse/tests/fuzz/*.dict $OUT/ +cp $SRC/ClickHouse/tests/fuzz/*.options $OUT/ + +# prepare corpus dirs +mkdir $SRC/ClickHouse/tests/fuzz/lexer_fuzzer.in/ +mkdir $SRC/ClickHouse/tests/fuzz/select_parser_fuzzer.in/ +mkdir $SRC/ClickHouse/tests/fuzz/create_parser_fuzzer.in/ + +# prepare corpus +cp $SRC/ClickHouse/tests/queries/0_stateless/*.sql $SRC/ClickHouse/tests/fuzz/lexer_fuzzer.in/ +cp $SRC/ClickHouse/tests/queries/0_stateless/*.sql $SRC/ClickHouse/tests/fuzz/select_parser_fuzzer.in/ +cp $SRC/ClickHouse/tests/queries/0_stateless/*.sql $SRC/ClickHouse/tests/fuzz/create_parser_fuzzer.in/ +cp $SRC/ClickHouse/tests/queries/1_stateful/*.sql $SRC/ClickHouse/tests/fuzz/lexer_fuzzer.in/ +cp $SRC/ClickHouse/tests/queries/1_stateful/*.sql $SRC/ClickHouse/tests/fuzz/select_parser_fuzzer.in/ +cp $SRC/ClickHouse/tests/queries/1_stateful/*.sql $SRC/ClickHouse/tests/fuzz/create_parser_fuzzer.in/ + +# copy out corpus +cd $SRC/ClickHouse/tests/fuzz +for dir in *_fuzzer.in; do + fuzzer=$(basename $dir .in) + zip -rj "$OUT/${fuzzer}_seed_corpus.zip" "${dir}/" +done + +# copy sources for code coverage if required +if [ "$SANITIZER" = "coverage" ]; then + mkdir -p $OUT/src/ClickHouse/ + cp -rL --parents $SRC/ClickHouse/src $OUT + cp -rL --parents $SRC/ClickHouse/base $OUT + cp -rL --parents $SRC/ClickHouse/programs $OUT +fi + +# Just check binaries size +BINARIES_SIZE=$(find $SRC/ClickHouse/build -name '*_fuzzer' -exec du -sh '{}' ';') |