1#!/bin/bash -eu 2# Copyright 2018 Google Inc. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16################################################################################ 17PREFIX=$WORK/prefix 18mkdir -p $PREFIX 19 20export PKG_CONFIG="`which pkg-config` --static" 21export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig 22export PATH=$PREFIX/bin:$PATH 23 24BUILD=$WORK/build 25 26rm -rf $WORK/* 27rm -rf $BUILD 28mkdir -p $BUILD 29 30# Install Boost headers 31cd $SRC/ 32tar jxf boost_1_76_0.tar.bz2 33cd boost_1_76_0/ 34CFLAGS="" CXXFLAGS="" ./bootstrap.sh 35CFLAGS="" CXXFLAGS="" ./b2 headers 36cp -R boost/ /usr/include/ 37 38pushd $SRC/zlib 39CFLAGS=-fPIC ./configure --static --prefix=$PREFIX 40make install -j$(nproc) 41 42pushd $SRC/freetype2 43./autogen.sh 44./configure --prefix="$PREFIX" --disable-shared PKG_CONFIG_PATH="$PKG_CONFIG_PATH" 45make -j$(nproc) 46make install 47 48pushd $SRC/Little-CMS 49./autogen.sh --prefix="$PREFIX" --disable-shared PKG_CONFIG_PATH="$PKG_CONFIG_PATH" 50make -j$(nproc) 51make install 52 53mkdir -p $SRC/openjpeg/build 54pushd $SRC/openjpeg/build 55cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=$PREFIX 56make -j$(nproc) install 57 58if [ "$SANITIZER" != "memory" ]; then 59 60 pushd $SRC/fontconfig 61 meson \ 62 --prefix=$PREFIX \ 63 --libdir=lib \ 64 --default-library=static \ 65 _builddir 66 ninja -C _builddir 67 ninja -C _builddir install 68 popd 69 70 pushd $SRC/glib-2.70.0 71 meson \ 72 --prefix=$PREFIX \ 73 --libdir=lib \ 74 --default-library=static \ 75 -Db_lundef=false \ 76 -Doss_fuzz=enabled \ 77 -Dlibmount=disabled \ 78 -Dinternal_pcre=true \ 79 _builddir 80 ninja -C _builddir 81 ninja -C _builddir install 82 popd 83 84 pushd $SRC/libpng 85 autoreconf -fi 86 CPPFLAGS=-I$PREFIX/include LDFLAGS=-L$PREFIX/lib ./configure --prefix="$PREFIX" --disable-shared --disable-dependency-tracking 87 make -j$(nproc) 88 make install 89 90 pushd $SRC/cairo 91 meson \ 92 --prefix=$PREFIX \ 93 --libdir=lib \ 94 --default-library=static \ 95 _builddir 96 ninja -C _builddir 97 ninja -C _builddir install 98 popd 99 100 pushd $SRC/pango 101 meson \ 102 -Ddefault_library=static \ 103 --prefix=$PREFIX \ 104 --libdir=lib \ 105 _builddir 106 sed -i -e 's/ -Werror=implicit-fallthrough//g' _builddir/build.ninja 107 ninja -C _builddir 108 ninja -C _builddir install 109 popd 110fi 111 112pushd $SRC/qtbase 113# add the flags to Qt build too 114sed -i -e "s/QMAKE_CXXFLAGS += -stdlib=libc++/QMAKE_CXXFLAGS += -stdlib=libc++ $CXXFLAGS\nQMAKE_CFLAGS += $CFLAGS/g" mkspecs/linux-clang-libc++/qmake.conf 115sed -i -e "s/QMAKE_LFLAGS += -stdlib=libc++/QMAKE_LFLAGS += -stdlib=libc++ -lpthread $CXXFLAGS/g" mkspecs/linux-clang-libc++/qmake.conf 116# disable sanitize=vptr for harfbuzz since it compiles without rtti 117sed -i -e "s/TARGET = qtharfbuzz/TARGET = qtharfbuzz\nQMAKE_CXXFLAGS += -fno-sanitize=vptr/g" src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro 118# make qmake compile faster 119sed -i -e "s/MAKE\")/MAKE\" -j$(nproc))/g" configure 120./configure --glib=no --libpng=qt -opensource -confirm-license -static -no-opengl -no-icu -no-pkg-config -platform linux-clang-libc++ -nomake tests -nomake examples -prefix $PREFIX -D QT_NO_DEPRECATED_WARNINGS 121make -j$(nproc) 122make install 123popd 124 125# Poppler complains when PKG_CONFIG is set to `which pkg-config --static` so 126# temporarily removing it 127export PKG_CONFIG="`which pkg-config`" 128 129if [ "$SANITIZER" != "memory" ]; then 130 POPPLER_ENABLE_GLIB=ON 131 POPPLER_FONT_CONFIGURATION=fontconfig 132else 133 POPPLER_ENABLE_GLIB=OFF 134 POPPLER_FONT_CONFIGURATION=generic 135fi 136 137mkdir -p $SRC/poppler/build 138pushd $SRC/poppler/build 139cmake .. \ 140 -DCMAKE_BUILD_TYPE=debug \ 141 -DBUILD_SHARED_LIBS=OFF \ 142 -DENABLE_FUZZER=OFF \ 143 -DFONT_CONFIGURATION=$POPPLER_FONT_CONFIGURATION \ 144 -DENABLE_DCTDECODER=none \ 145 -DENABLE_GOBJECT_INTROSPECTION=OFF \ 146 -DENABLE_LIBPNG=OFF \ 147 -DENABLE_ZLIB=OFF \ 148 -DENABLE_LIBTIFF=OFF \ 149 -DENABLE_LIBJPEG=OFF \ 150 -DENABLE_GLIB=$POPPLER_ENABLE_GLIB \ 151 -DENABLE_LIBCURL=OFF \ 152 -DENABLE_QT5=ON \ 153 -DENABLE_UTILS=OFF \ 154 -DWITH_Cairo=$POPPLER_ENABLE_GLIB \ 155 -DWITH_NSS3=OFF \ 156 -DCMAKE_INSTALL_PREFIX=$PREFIX 157 158export PKG_CONFIG="`which pkg-config` --static" 159make -j$(nproc) poppler poppler-cpp poppler-qt5 160if [ "$SANITIZER" != "memory" ]; then 161 make -j$(nproc) poppler-glib 162fi 163 164PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -lc -lz -pthread -lrt -lpthread" 165DEPS="freetype2 lcms2 libopenjp2" 166if [ "$SANITIZER" != "memory" ]; then 167 DEPS="$DEPS fontconfig libpng" 168fi 169BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`" 170BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`" 171 172fuzzers=$(find $SRC/poppler/cpp/tests/fuzzing/ -name "*_fuzzer.cc") 173 174for f in $fuzzers; do 175 fuzzer_name=$(basename $f .cc) 176 177 $CXX $CXXFLAGS -std=c++11 -I$SRC/poppler/cpp -I$SRC/poppler/build/cpp \ 178 $BUILD_CFLAGS \ 179 $f -o $OUT/$fuzzer_name \ 180 $PREDEPS_LDFLAGS \ 181 $SRC/poppler/build/cpp/libpoppler-cpp.a \ 182 $SRC/poppler/build/libpoppler.a \ 183 $BUILD_LDFLAGS \ 184 $LIB_FUZZING_ENGINE \ 185 $LIB_FUZZING_ENGINE \ 186 -Wl,-Bdynamic 187done 188 189if [ "$SANITIZER" != "memory" ]; then 190 DEPS="gmodule-2.0 glib-2.0 gio-2.0 gobject-2.0 freetype2 lcms2 libopenjp2 cairo cairo-gobject pango fontconfig libpng" 191 BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`" 192 BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`" 193 194 fuzzers=$(find $SRC/poppler/glib/tests/fuzzing/ -name "*_fuzzer.cc") 195 for f in $fuzzers; do 196 fuzzer_name=$(basename $f .cc) 197 198 $CXX $CXXFLAGS -std=c++11 -I$SRC/poppler/glib -I$SRC/poppler/build/glib \ 199 $BUILD_CFLAGS \ 200 $f -o $OUT/$fuzzer_name \ 201 $PREDEPS_LDFLAGS \ 202 $SRC/poppler/build/glib/libpoppler-glib.a \ 203 $SRC/poppler/build/cpp/libpoppler-cpp.a \ 204 $SRC/poppler/build/libpoppler.a \ 205 $BUILD_LDFLAGS \ 206 $LIB_FUZZING_ENGINE \ 207 -Wl,-Bdynamic 208 done 209fi 210 211PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -lc -lz -pthread -lrt -lpthread" 212DEPS="freetype2 lcms2 libopenjp2 Qt5Core Qt5Gui Qt5Xml" 213if [ "$SANITIZER" != "memory" ]; then 214 DEPS="$DEPS fontconfig libpng" 215fi 216BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`" 217BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`" 218 219fuzzers=$(find $SRC/poppler/qt5/tests/fuzzing/ -name "*_fuzzer.cc") 220for f in $fuzzers; do 221 fuzzer_name=$(basename $f .cc) 222 223 $CXX $CXXFLAGS -std=c++11 -fPIC \ 224 -I$SRC/poppler/qt5/src -I$SRC/poppler/build/qt5/src \ 225 $BUILD_CFLAGS \ 226 $f -o $OUT/$fuzzer_name \ 227 $PREDEPS_LDFLAGS \ 228 $SRC/poppler/build/qt5/src/libpoppler-qt5.a \ 229 $SRC/poppler/build/cpp/libpoppler-cpp.a \ 230 $SRC/poppler/build/libpoppler.a \ 231 $BUILD_LDFLAGS \ 232 $LIB_FUZZING_ENGINE \ 233 -Wl,-Bdynamic 234done 235 236mv $SRC/{*.zip,*.dict} $OUT 237 238if [ ! -f "${OUT}/poppler_seed_corpus.zip" ]; then 239 echo "missing seed corpus" 240 exit 1 241fi 242 243if [ ! -f "${OUT}/poppler.dict" ]; then 244 echo "missing dictionary" 245 exit 1 246fi 247 248fuzzers=$(find $OUT -name "*_fuzzer") 249for f in $fuzzers; do 250 fuzzer_name=$(basename $f) 251 ln -sf $OUT/poppler_seed_corpus.zip $OUT/${fuzzer_name}_seed_corpus.zip 252 ln -sf $OUT/poppler.dict $OUT/${fuzzer_name}.dict 253done 254