1#!/bin/bash -eu 2# Copyright 2019 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################################################################################ 17 18export PKG_CONFIG_PATH=/work/lib/pkgconfig 19export LDFLAGS="$CXXFLAGS" 20 21# libz 22pushd $SRC/zlib 23./configure --static --prefix=$WORK 24make -j$(nproc) all 25make install 26popd 27 28# libexif 29pushd $SRC/libexif 30autoreconf -fi 31./configure \ 32 --enable-static \ 33 --disable-shared \ 34 --disable-docs \ 35 --disable-dependency-tracking \ 36 --prefix=$WORK 37make -j$(nproc) 38make install 39popd 40 41# lcms 42pushd $SRC/lcms 43./autogen.sh 44./configure \ 45 --enable-static \ 46 --disable-shared \ 47 --disable-dependency-tracking \ 48 --prefix=$WORK 49make -j$(nproc) 50make install 51popd 52 53# aom 54pushd $SRC/aom 55mkdir -p build/linux 56cd build/linux 57cmake -G "Unix Makefiles" \ 58 -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX \ 59 -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 60 -DCMAKE_INSTALL_PREFIX=$WORK -DCMAKE_INSTALL_LIBDIR=lib \ 61 -DENABLE_SHARED=FALSE -DCONFIG_PIC=1 \ 62 -DENABLE_EXAMPLES=0 -DENABLE_DOCS=0 -DENABLE_TESTS=0 \ 63 -DCONFIG_SIZE_LIMIT=1 \ 64 -DDECODE_HEIGHT_LIMIT=12288 -DDECODE_WIDTH_LIMIT=12288 \ 65 -DDO_RANGE_CHECK_CLAMP=1 \ 66 -DAOM_MAX_ALLOCABLE_MEMORY=536870912 \ 67 -DAOM_TARGET_CPU=generic \ 68 ../../ 69make clean 70make -j$(nproc) 71make install 72popd 73 74# libheif 75pushd $SRC/libheif 76autoreconf -fi 77./configure \ 78 --disable-shared \ 79 --enable-static \ 80 --disable-examples \ 81 --disable-go \ 82 --prefix=$WORK \ 83 CPPFLAGS=-I$WORK/include 84make clean 85make -j$(nproc) 86make install 87popd 88 89# libjpeg-turbo 90pushd $SRC/libjpeg-turbo 91cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DENABLE_STATIC=TRUE -DENABLE_SHARED=FALSE -DWITH_TURBOJPEG=FALSE 92make -j$(nproc) 93make install 94popd 95 96# libpng 97pushd $SRC/libpng 98sed -ie "s/option WARNING /& disabled/" scripts/pnglibconf.dfa 99autoreconf -fi 100./configure \ 101 --prefix=$WORK \ 102 --disable-shared \ 103 --disable-dependency-tracking 104make -j$(nproc) 105make install 106popd 107 108# libspng 109pushd $SRC/libspng 110cmake . -DCMAKE_INSTALL_PREFIX=$WORK -DSPNG_STATIC=TRUE -DSPNG_SHARED=FALSE -DZLIB_ROOT=$WORK 111make -j$(nproc) 112make install 113# Fix pkg-config file of libspng 114sed -i'.bak' "s/-lspng/&_static/" $WORK/lib/pkgconfig/libspng.pc 115popd 116 117# libwebp 118pushd $SRC/libwebp 119autoreconf -fi 120./configure \ 121 --enable-libwebpdemux \ 122 --enable-libwebpmux \ 123 --disable-shared \ 124 --disable-jpeg \ 125 --disable-tiff \ 126 --disable-gif \ 127 --disable-wic \ 128 --disable-threading \ 129 --disable-dependency-tracking \ 130 --prefix=$WORK 131make -j$(nproc) 132make install 133popd 134 135# libtiff ... a bug in libtiff master as of 20 Nov 2019 means we have to 136# explicitly disable lzma 137pushd $SRC/libtiff 138autoreconf -fi 139./configure \ 140 --disable-lzma \ 141 --disable-shared \ 142 --disable-dependency-tracking \ 143 --prefix=$WORK 144make -j$(nproc) 145make install 146popd 147 148# jpeg-xl (libjxl) 149pushd $SRC/libjxl 150sed -i'.bak' "/add_subdirectory(tools)/d" CMakeLists.txt 151# Don't overwrite our linker flags 152sed -i'.bak' "/set(CMAKE_EXE_LINKER_FLAGS/{N;d;}" CMakeLists.txt 153cmake -G "Unix Makefiles" \ 154 -DCMAKE_BUILD_TYPE=Release \ 155 -DCMAKE_C_COMPILER=$CC \ 156 -DCMAKE_CXX_COMPILER=$CXX \ 157 -DCMAKE_C_FLAGS="$CFLAGS" \ 158 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 159 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 160 -DCMAKE_MODULE_LINKER_FLAGS="$LDFLAGS" \ 161 -DCMAKE_INSTALL_PREFIX="$WORK" \ 162 -DCMAKE_THREAD_LIBS_INIT="-lpthread" \ 163 -DCMAKE_USE_PTHREADS_INIT=1 \ 164 -DBUILD_SHARED_LIBS=0 \ 165 -DBUILD_TESTING=0 \ 166 -DJPEGXL_STATIC=1 \ 167 -DJPEGXL_FORCE_SYSTEM_BROTLI=1 \ 168 -DJPEGXL_ENABLE_FUZZERS=0 \ 169 -DJPEGXL_ENABLE_MANPAGES=0 \ 170 -DJPEGXL_ENABLE_BENCHMARK=0 \ 171 -DJPEGXL_ENABLE_EXAMPLES=0 \ 172 -DJPEGXL_ENABLE_SKCMS=0 \ 173 -DJPEGXL_ENABLE_SJPEG=0 \ 174 . 175make -j$(nproc) 176make install 177popd 178 179# libimagequant 180pushd $SRC/libimagequant 181meson setup --prefix=$WORK --libdir=lib --default-library=static build 182cd build 183ninja -j$(nproc) 184ninja install 185popd 186 187# cgif 188pushd $SRC/cgif 189meson setup --prefix=$WORK --libdir=lib --default-library=static build 190cd build 191ninja -j$(nproc) 192ninja install 193popd 194 195# libvips 196sed -i'.bak' "/test/d" Makefile.am 197sed -i'.bak' "/tools/d" Makefile.am 198PKG_CONFIG="pkg-config --static" ./autogen.sh \ 199 --disable-shared \ 200 --disable-modules \ 201 --disable-gtk-doc \ 202 --disable-gtk-doc-html \ 203 --disable-dependency-tracking \ 204 --prefix=$WORK 205make -j$(nproc) CCLD=$CXX 206make install 207 208# Merge the seed corpus in a single directory, exclude files larger than 2k 209mkdir -p fuzz/corpus 210find \ 211 $SRC/afl-testcases/{gif*,jpeg*,png,tiff,webp}/full/images \ 212 fuzz/*_fuzzer_corpus \ 213 test/test-suite/images \ 214 -type f -size -2k \ 215 -exec bash -c 'hash=($(sha1sum {})); mv {} fuzz/corpus/$hash' ';' 216zip -jrq $OUT/seed_corpus.zip fuzz/corpus 217 218# Build fuzzers and link corpus 219for fuzzer in fuzz/*_fuzzer.cc; do 220 target=$(basename "$fuzzer" .cc) 221 $CXX $CXXFLAGS -std=c++11 "$fuzzer" -o "$OUT/$target" \ 222 -I$WORK/include \ 223 -I/usr/include/glib-2.0 \ 224 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include \ 225 $WORK/lib/libvips.a \ 226 $WORK/lib/libexif.a \ 227 $WORK/lib/liblcms2.a \ 228 $WORK/lib/libjpeg.a \ 229 $WORK/lib/libpng.a \ 230 $WORK/lib/libspng_static.a \ 231 $WORK/lib/libz.a \ 232 $WORK/lib/libwebpmux.a \ 233 $WORK/lib/libwebpdemux.a \ 234 $WORK/lib/libwebp.a \ 235 $WORK/lib/libtiff.a \ 236 $WORK/lib/libheif.a \ 237 $WORK/lib/libaom.a \ 238 $WORK/lib/libjxl.a \ 239 $WORK/lib/libjxl_threads.a \ 240 $WORK/lib/libhwy.a \ 241 $WORK/lib/libimagequant.a \ 242 $WORK/lib/libcgif.a \ 243 $LIB_FUZZING_ENGINE \ 244 -Wl,-Bstatic \ 245 -lfftw3 -lexpat -lbrotlienc -lbrotlidec -lbrotlicommon \ 246 -lgmodule-2.0 -lgio-2.0 -lgobject-2.0 -lffi -lglib-2.0 \ 247 -lresolv -lmount -lblkid -lselinux -lsepol -lpcre \ 248 -Wl,-Bdynamic -pthread 249 ln -sf "seed_corpus.zip" "$OUT/${target}_seed_corpus.zip" 250done 251 252# Copy options and dictionary files to $OUT 253find fuzz -name '*_fuzzer.dict' -exec cp -v '{}' $OUT ';' 254find fuzz -name '*_fuzzer.options' -exec cp -v '{}' $OUT ';' 255