2018-05-21 19:22:29 +00:00
#!/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.
#
################################################################################
2020-11-28 05:04:58 +00:00
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
2021-05-14 20:25:37 +00:00
# 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/
2020-11-28 05:04:58 +00:00
pushd $SRC /zlib
CFLAGS = -fPIC ./configure --static --prefix= $PREFIX
make install -j$( nproc)
2018-05-21 19:22:29 +00:00
2022-02-18 13:04:25 +00:00
pushd $SRC
tar zxf nss-3.75-with-nspr-4.32.tar.gz
cd nss-3.75
nss_flag = ""
SAVE_CFLAGS = " $CFLAGS "
SAVE_CXXFLAGS = " $CXXFLAGS "
if [ " $SANITIZER " = "memory" ] ; then
nss_flag = "--msan"
elif [ " $SANITIZER " = "address" ] ; then
nss_flag = "--asan"
elif [ " $SANITIZER " = "undefined" ] ; then
nss_flag = "--ubsan"
elif [ " $SANITIZER " = "coverage" ] ; then
# some parts of nss don't like -fcoverage-mapping nor -fprofile-instr-generate :/
CFLAGS = " ${ CFLAGS / "-fcoverage-mapping" / " " } "
CFLAGS = " ${ CFLAGS / "-fprofile-instr-generate" / " " } "
CXXFLAGS = " ${ CXXFLAGS / "-fcoverage-mapping" / " " } "
CXXFLAGS = " ${ CXXFLAGS / "-fprofile-instr-generate" / " " } "
fi
2022-02-18 14:48:30 +00:00
./nss/build.sh $nss_flag --disable-tests --static -v -Dmozilla_client= 1 -Dzlib_libs= $PREFIX /lib/libz.a -Dsign_libs= 0
2022-02-18 13:04:25 +00:00
CFLAGS = " $SAVE_CFLAGS "
CXXFLAGS = " $SAVE_CXXFLAGS "
# NSS has a .pc.in file but doesn't do anything with it
cp nss/pkg/pkg-config/nss.pc.in $PREFIX /lib/pkgconfig/nss.pc
sed -i " s#\${libdir}# ${ SRC } /nss-3.75/dist/Debug/lib#g " $PREFIX /lib/pkgconfig/nss.pc
sed -i " s#\${includedir}# ${ SRC } /nss-3.75/dist/public/nss#g " $PREFIX /lib/pkgconfig/nss.pc
sed -i "s#%NSS_VERSION%#3.75#g" $PREFIX /lib/pkgconfig/nss.pc
cp dist/Debug/lib/pkgconfig/nspr.pc $PREFIX /lib/pkgconfig/
pushd $SRC /freetype
2018-05-21 19:22:29 +00:00
./autogen.sh
2020-11-28 05:04:58 +00:00
./configure --prefix= " $PREFIX " --disable-shared PKG_CONFIG_PATH = " $PKG_CONFIG_PATH "
2018-05-21 19:22:29 +00:00
make -j$( nproc)
make install
2020-03-20 15:45:47 +00:00
pushd $SRC /Little-CMS
2021-06-27 04:47:30 +00:00
./autogen.sh --prefix= " $PREFIX " --disable-shared PKG_CONFIG_PATH = " $PKG_CONFIG_PATH "
2020-03-20 15:45:47 +00:00
make -j$( nproc)
make install
2020-03-21 04:12:04 +00:00
mkdir -p $SRC /openjpeg/build
pushd $SRC /openjpeg/build
2022-07-06 03:30:51 +00:00
sed -i " s#\${LCMS_LIBNAME}#-L $PREFIX /lib \${LCMS_LIBNAME}# " ../src/bin/jp2/CMakeLists.txt
PKG_CONFIG = ` which pkg-config` cmake .. -DBUILD_SHARED_LIBS= OFF -DCMAKE_INSTALL_PREFIX= $PREFIX
2020-03-21 04:12:04 +00:00
make -j$( nproc) install
2020-11-28 05:04:58 +00:00
if [ " $SANITIZER " != "memory" ] ; then
pushd $SRC /fontconfig
meson \
--prefix= $PREFIX \
--libdir= lib \
--default-library= static \
_builddir
ninja -C _builddir
ninja -C _builddir install
popd
2021-10-07 08:50:08 +00:00
pushd $SRC /glib-2.70.0
2021-11-07 21:41:41 +00:00
# remove once there's a released glib that contains https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2324
sed -i s#https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.bz2#https://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.bz2# subprojects/libpcre.wrap
2020-11-28 05:04:58 +00:00
meson \
--prefix= $PREFIX \
--libdir= lib \
--default-library= static \
-Db_lundef= false \
-Doss_fuzz= enabled \
-Dlibmount= disabled \
_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
2021-06-09 23:23:01 +00:00
pushd $SRC /pango
2022-07-06 03:30:51 +00:00
CFLAGS = " $CFLAGS -fno-sanitize=vptr " CXXFLAGS = " $CXXFLAGS -fno-sanitize=vptr " meson \
2020-11-28 05:04:58 +00:00
-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
2022-02-18 14:48:30 +00:00
# Fix memory stuff in qt 5.15 unfixable since branch is closed now
sed -i -e "s/struct statx statxBuffer/struct statx statxBuffer = {}/g" src/corelib/io/qfilesystemengine_unix.cpp
2020-11-28 05:04:58 +00:00
./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
2020-03-21 04:12:04 +00:00
mkdir -p $SRC /poppler/build
pushd $SRC /poppler/build
cmake .. \
2018-05-21 19:22:29 +00:00
-DCMAKE_BUILD_TYPE= debug \
-DBUILD_SHARED_LIBS= OFF \
2020-11-28 05:04:58 +00:00
-DENABLE_FUZZER= OFF \
-DFONT_CONFIGURATION= $POPPLER_FONT_CONFIGURATION \
2018-05-21 19:22:29 +00:00
-DENABLE_DCTDECODER= none \
2020-11-28 05:04:58 +00:00
-DENABLE_GOBJECT_INTROSPECTION= OFF \
2018-05-21 19:22:29 +00:00
-DENABLE_LIBPNG= OFF \
-DENABLE_ZLIB= OFF \
-DENABLE_LIBTIFF= OFF \
-DENABLE_LIBJPEG= OFF \
2020-11-28 05:04:58 +00:00
-DENABLE_GLIB= $POPPLER_ENABLE_GLIB \
2018-05-21 19:22:29 +00:00
-DENABLE_LIBCURL= OFF \
2020-11-28 05:04:58 +00:00
-DENABLE_QT5= ON \
2018-05-21 19:22:29 +00:00
-DENABLE_UTILS= OFF \
2020-11-28 05:04:58 +00:00
-DWITH_Cairo= $POPPLER_ENABLE_GLIB \
-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 ` "
2022-02-18 13:04:25 +00:00
# static linking is hard ^_^
NSS_STATIC_LIBS = ` ls $SRC /nss-3.75/dist/Debug/lib/lib*.a`
NSS_STATIC_LIBS = " $NSS_STATIC_LIBS $NSS_STATIC_LIBS $NSS_STATIC_LIBS "
BUILD_LDFLAGS = " $BUILD_LDFLAGS $NSS_STATIC_LIBS "
2020-11-28 05:04:58 +00:00
fuzzers = $( find $SRC /poppler/cpp/tests/fuzzing/ -name "*_fuzzer.cc" )
for f in $fuzzers ; do
fuzzer_name = $( basename $f .cc)
2021-03-04 00:29:04 +00:00
$CXX $CXXFLAGS -std= c++11 -I$SRC /poppler/cpp -I$SRC /poppler/build/cpp \
2020-11-28 05:04:58 +00:00
$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
2018-05-21 19:22:29 +00:00
2020-11-28 05:04:58 +00:00
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 ` "
2022-02-18 13:04:25 +00:00
BUILD_LDFLAGS = " $BUILD_LDFLAGS $NSS_STATIC_LIBS "
2018-05-21 19:22:29 +00:00
2020-11-28 05:04:58 +00:00
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 ` "
2022-02-18 13:04:25 +00:00
BUILD_LDFLAGS = " $BUILD_LDFLAGS $NSS_STATIC_LIBS "
2020-11-28 05:04:58 +00:00
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 \
2021-03-04 00:29:04 +00:00
-I$SRC /poppler/qt5/src -I$SRC /poppler/build/qt5/src \
2020-11-28 05:04:58 +00:00
$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
2018-05-21 19:22:29 +00:00
mv $SRC /{ *.zip,*.dict} $OUT
2020-11-28 05:04:58 +00:00
if [ ! -f " ${ OUT } /poppler_seed_corpus.zip " ] ; then
echo "missing seed corpus"
exit 1
2018-05-21 19:22:29 +00:00
fi
2020-11-28 05:04:58 +00:00
if [ ! -f " ${ OUT } /poppler.dict " ] ; then
echo "missing dictionary"
exit 1
2018-05-21 19:22:29 +00:00
fi
2020-11-28 05:04:58 +00:00
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