• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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