254 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			254 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/bash -eu
 | |
| # Copyright 2018 Google Inc.
 | |
| #
 | |
| # 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.
 | |
| #
 | |
| ################################################################################
 | |
| PREFIX=$WORK/prefix
 | |
| mkdir -p $PREFIX
 | |
| 
 | |
| export PKG_CONFIG="`which pkg-config` --static"
 | |
| export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
 | |
| export PATH=$PREFIX/bin:$PATH
 | |
| 
 | |
| BUILD=$WORK/build
 | |
| 
 | |
| rm -rf $WORK/*
 | |
| rm -rf $BUILD
 | |
| mkdir -p $BUILD
 | |
| 
 | |
| # Install Boost headers
 | |
| cd $SRC/
 | |
| tar jxf boost_1_76_0.tar.bz2
 | |
| cd boost_1_76_0/
 | |
| CFLAGS="" CXXFLAGS="" ./bootstrap.sh
 | |
| CFLAGS="" CXXFLAGS="" ./b2 headers
 | |
| cp -R boost/ /usr/include/
 | |
| 
 | |
| pushd $SRC/zlib
 | |
| CFLAGS=-fPIC ./configure --static --prefix=$PREFIX
 | |
| make install -j$(nproc)
 | |
| 
 | |
| pushd $SRC/freetype2
 | |
| ./autogen.sh
 | |
| ./configure --prefix="$PREFIX" --disable-shared PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
 | |
| make -j$(nproc)
 | |
| make install
 | |
| 
 | |
| pushd $SRC/Little-CMS
 | |
| ./autogen.sh --prefix="$PREFIX" --disable-shared PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
 | |
| make -j$(nproc)
 | |
| make install
 | |
| 
 | |
| mkdir -p $SRC/openjpeg/build
 | |
| pushd $SRC/openjpeg/build
 | |
| cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=$PREFIX
 | |
| make -j$(nproc) install
 | |
| 
 | |
| if [ "$SANITIZER" != "memory" ]; then
 | |
| 
 | |
|     pushd $SRC/fontconfig
 | |
|     meson \
 | |
|         --prefix=$PREFIX \
 | |
|         --libdir=lib \
 | |
|         --default-library=static \
 | |
|         _builddir
 | |
|     ninja -C _builddir
 | |
|     ninja -C _builddir install
 | |
|     popd
 | |
| 
 | |
|     pushd $SRC/glib-2.70.0
 | |
|     meson \
 | |
|         --prefix=$PREFIX \
 | |
|         --libdir=lib \
 | |
|         --default-library=static \
 | |
|         -Db_lundef=false \
 | |
|         -Doss_fuzz=enabled \
 | |
|         -Dlibmount=disabled \
 | |
|         -Dinternal_pcre=true \
 | |
|         _builddir
 | |
|     ninja -C _builddir
 | |
|     ninja -C _builddir install
 | |
|     popd
 | |
| 
 | |
|     pushd $SRC/libpng
 | |
|     autoreconf -fi
 | |
|     CPPFLAGS=-I$PREFIX/include LDFLAGS=-L$PREFIX/lib ./configure --prefix="$PREFIX" --disable-shared --disable-dependency-tracking
 | |
|     make -j$(nproc)
 | |
|     make install
 | |
| 
 | |
|     pushd $SRC/cairo
 | |
|     meson \
 | |
|         --prefix=$PREFIX \
 | |
|         --libdir=lib \
 | |
|         --default-library=static \
 | |
|         _builddir
 | |
|     ninja -C _builddir
 | |
|     ninja -C _builddir install
 | |
|     popd
 | |
| 
 | |
|     pushd $SRC/pango
 | |
|     meson \
 | |
|         -Ddefault_library=static \
 | |
|         --prefix=$PREFIX \
 | |
|         --libdir=lib \
 | |
|         _builddir
 | |
|     sed -i -e 's/ -Werror=implicit-fallthrough//g' _builddir/build.ninja
 | |
|     ninja -C _builddir
 | |
|     ninja -C _builddir install
 | |
|     popd
 | |
| fi
 | |
| 
 | |
| pushd $SRC/qtbase
 | |
| # add the flags to Qt build too
 | |
| sed -i -e "s/QMAKE_CXXFLAGS    += -stdlib=libc++/QMAKE_CXXFLAGS    += -stdlib=libc++  $CXXFLAGS\nQMAKE_CFLAGS += $CFLAGS/g" mkspecs/linux-clang-libc++/qmake.conf
 | |
| sed -i -e "s/QMAKE_LFLAGS      += -stdlib=libc++/QMAKE_LFLAGS      += -stdlib=libc++ -lpthread $CXXFLAGS/g" mkspecs/linux-clang-libc++/qmake.conf
 | |
| # disable sanitize=vptr for harfbuzz since it compiles without rtti
 | |
| sed -i -e "s/TARGET = qtharfbuzz/TARGET = qtharfbuzz\nQMAKE_CXXFLAGS += -fno-sanitize=vptr/g" src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
 | |
| # make qmake compile faster
 | |
| sed -i -e "s/MAKE\")/MAKE\" -j$(nproc))/g" configure
 | |
| ./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
 | |
| make -j$(nproc)
 | |
| make install
 | |
| popd
 | |
| 
 | |
| # Poppler complains when PKG_CONFIG is set to `which pkg-config --static` so
 | |
| # temporarily removing it
 | |
| export PKG_CONFIG="`which pkg-config`"
 | |
| 
 | |
| if [ "$SANITIZER" != "memory" ]; then
 | |
|     POPPLER_ENABLE_GLIB=ON
 | |
|     POPPLER_FONT_CONFIGURATION=fontconfig
 | |
| else
 | |
|     POPPLER_ENABLE_GLIB=OFF
 | |
|     POPPLER_FONT_CONFIGURATION=generic
 | |
| fi
 | |
| 
 | |
| mkdir -p $SRC/poppler/build
 | |
| pushd $SRC/poppler/build
 | |
| cmake .. \
 | |
|   -DCMAKE_BUILD_TYPE=debug \
 | |
|   -DBUILD_SHARED_LIBS=OFF \
 | |
|   -DENABLE_FUZZER=OFF \
 | |
|   -DFONT_CONFIGURATION=$POPPLER_FONT_CONFIGURATION \
 | |
|   -DENABLE_DCTDECODER=none \
 | |
|   -DENABLE_GOBJECT_INTROSPECTION=OFF \
 | |
|   -DENABLE_LIBPNG=OFF \
 | |
|   -DENABLE_ZLIB=OFF \
 | |
|   -DENABLE_LIBTIFF=OFF \
 | |
|   -DENABLE_LIBJPEG=OFF \
 | |
|   -DENABLE_GLIB=$POPPLER_ENABLE_GLIB \
 | |
|   -DENABLE_LIBCURL=OFF \
 | |
|   -DENABLE_QT5=ON \
 | |
|   -DENABLE_UTILS=OFF \
 | |
|   -DWITH_Cairo=$POPPLER_ENABLE_GLIB \
 | |
|   -DWITH_NSS3=OFF \
 | |
|   -DCMAKE_INSTALL_PREFIX=$PREFIX
 | |
| 
 | |
| export PKG_CONFIG="`which pkg-config` --static"
 | |
| make -j$(nproc) poppler poppler-cpp poppler-qt5
 | |
| if [ "$SANITIZER" != "memory" ]; then
 | |
|     make -j$(nproc) poppler-glib
 | |
| fi
 | |
| 
 | |
| PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -lc -lz -pthread -lrt -lpthread"
 | |
| DEPS="freetype2 lcms2 libopenjp2"
 | |
| if [ "$SANITIZER" != "memory" ]; then
 | |
|     DEPS="$DEPS fontconfig libpng"
 | |
| fi
 | |
| BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`"
 | |
| BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`"
 | |
| 
 | |
| fuzzers=$(find $SRC/poppler/cpp/tests/fuzzing/ -name "*_fuzzer.cc")
 | |
| 
 | |
| for f in $fuzzers; do
 | |
|     fuzzer_name=$(basename $f .cc)
 | |
| 
 | |
|     $CXX $CXXFLAGS -std=c++11 -I$SRC/poppler/cpp -I$SRC/poppler/build/cpp \
 | |
|         $BUILD_CFLAGS \
 | |
|         $f -o $OUT/$fuzzer_name \
 | |
|         $PREDEPS_LDFLAGS \
 | |
|         $SRC/poppler/build/cpp/libpoppler-cpp.a \
 | |
|         $SRC/poppler/build/libpoppler.a \
 | |
|         $BUILD_LDFLAGS \
 | |
|         $LIB_FUZZING_ENGINE \
 | |
|         $LIB_FUZZING_ENGINE \
 | |
|         -Wl,-Bdynamic
 | |
| done
 | |
| 
 | |
| if [ "$SANITIZER" != "memory" ]; then
 | |
|     DEPS="gmodule-2.0 glib-2.0 gio-2.0 gobject-2.0 freetype2 lcms2 libopenjp2 cairo cairo-gobject pango fontconfig libpng"
 | |
|     BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`"
 | |
|     BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`"
 | |
| 
 | |
|     fuzzers=$(find $SRC/poppler/glib/tests/fuzzing/ -name "*_fuzzer.cc")
 | |
|     for f in $fuzzers; do
 | |
|         fuzzer_name=$(basename $f .cc)
 | |
| 
 | |
|         $CXX $CXXFLAGS -std=c++11 -I$SRC/poppler/glib -I$SRC/poppler/build/glib \
 | |
|             $BUILD_CFLAGS \
 | |
|             $f -o $OUT/$fuzzer_name \
 | |
|             $PREDEPS_LDFLAGS \
 | |
|             $SRC/poppler/build/glib/libpoppler-glib.a \
 | |
|             $SRC/poppler/build/cpp/libpoppler-cpp.a \
 | |
|             $SRC/poppler/build/libpoppler.a \
 | |
|             $BUILD_LDFLAGS \
 | |
|             $LIB_FUZZING_ENGINE \
 | |
|             -Wl,-Bdynamic
 | |
|     done
 | |
| fi
 | |
| 
 | |
| PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -lc -lz -pthread -lrt -lpthread"
 | |
| DEPS="freetype2 lcms2 libopenjp2 Qt5Core Qt5Gui Qt5Xml"
 | |
| if [ "$SANITIZER" != "memory" ]; then
 | |
|     DEPS="$DEPS fontconfig libpng"
 | |
| fi
 | |
| BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`"
 | |
| BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`"
 | |
| 
 | |
| fuzzers=$(find $SRC/poppler/qt5/tests/fuzzing/ -name "*_fuzzer.cc")
 | |
| for f in $fuzzers; do
 | |
|     fuzzer_name=$(basename $f .cc)
 | |
| 
 | |
|     $CXX $CXXFLAGS -std=c++11 -fPIC \
 | |
|         -I$SRC/poppler/qt5/src -I$SRC/poppler/build/qt5/src \
 | |
|         $BUILD_CFLAGS \
 | |
|         $f -o $OUT/$fuzzer_name \
 | |
|         $PREDEPS_LDFLAGS \
 | |
|         $SRC/poppler/build/qt5/src/libpoppler-qt5.a \
 | |
|         $SRC/poppler/build/cpp/libpoppler-cpp.a \
 | |
|         $SRC/poppler/build/libpoppler.a \
 | |
|         $BUILD_LDFLAGS \
 | |
|         $LIB_FUZZING_ENGINE \
 | |
|         -Wl,-Bdynamic
 | |
| done
 | |
| 
 | |
| mv $SRC/{*.zip,*.dict} $OUT
 | |
| 
 | |
| if [ ! -f "${OUT}/poppler_seed_corpus.zip" ]; then
 | |
|     echo "missing seed corpus"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| if [ ! -f "${OUT}/poppler.dict" ]; then
 | |
|     echo "missing dictionary"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| fuzzers=$(find $OUT -name "*_fuzzer")
 | |
| for f in $fuzzers; do
 | |
|   fuzzer_name=$(basename $f)
 | |
|   ln -sf $OUT/poppler_seed_corpus.zip $OUT/${fuzzer_name}_seed_corpus.zip
 | |
|   ln -sf $OUT/poppler.dict $OUT/${fuzzer_name}.dict
 | |
| done
 |