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