]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | # ################################################################ |
2 | # Copyright (c) 2016-present, Facebook, Inc. | |
3 | # All rights reserved. | |
4 | # | |
5 | # This source code is licensed under both the BSD-style license (found in the | |
6 | # LICENSE file in the root directory of this source tree) and the GPLv2 (found | |
7 | # in the COPYING file in the root directory of this source tree). | |
8 | # ################################################################ | |
9 | ||
10 | # Optionally user defined flags | |
11 | CFLAGS ?= -O3 | |
12 | CXXFLAGS ?= -O3 | |
13 | CPPFLAGS ?= | |
14 | LDFLAGS ?= | |
15 | ARFLAGS ?= | |
16 | LIB_FUZZING_ENGINE ?= libregression.a | |
17 | PYTHON ?= python | |
18 | ifeq ($(shell uname), Darwin) | |
19 | DOWNLOAD?=curl -L -o | |
20 | else | |
21 | DOWNLOAD?=wget -O | |
22 | endif | |
23 | CORPORA_URL_PREFIX:=https://github.com/facebook/zstd/releases/download/fuzz-corpora/ | |
24 | ||
25 | ZSTDDIR = ../../lib | |
26 | PRGDIR = ../../programs | |
27 | ||
28 | FUZZ_CPPFLAGS := -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \ | |
29 | -I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(PRGDIR) \ | |
9f95a23c | 30 | -DZSTD_MULTITHREAD $(CPPFLAGS) |
11fdf7f2 TL |
31 | FUZZ_EXTRA_FLAGS := -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ |
32 | -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ | |
9f95a23c | 33 | -Wstrict-prototypes -Wundef \ |
11fdf7f2 TL |
34 | -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ |
35 | -Wredundant-decls \ | |
36 | -g -fno-omit-frame-pointer | |
37 | FUZZ_CFLAGS := $(FUZZ_EXTRA_FLAGS) $(CFLAGS) | |
38 | FUZZ_CXXFLAGS := $(FUZZ_EXTRA_FLAGS) -std=c++11 $(CXXFLAGS) | |
9f95a23c | 39 | FUZZ_LDFLAGS := -pthread $(LDFLAGS) |
11fdf7f2 TL |
40 | FUZZ_ARFLAGS := $(ARFLAGS) |
41 | FUZZ_TARGET_FLAGS = $(FUZZ_CPPFLAGS) $(FUZZ_CXXFLAGS) $(FUZZ_LDFLAGS) | |
42 | ||
43 | FUZZ_HEADERS := fuzz_helpers.h fuzz.h zstd_helpers.h | |
9f95a23c | 44 | FUZZ_SRC := $(PRGDIR)/util.c zstd_helpers.c |
11fdf7f2 TL |
45 | |
46 | ZSTDCOMMON_SRC := $(ZSTDDIR)/common/*.c | |
47 | ZSTDCOMP_SRC := $(ZSTDDIR)/compress/*.c | |
48 | ZSTDDECOMP_SRC := $(ZSTDDIR)/decompress/*.c | |
9f95a23c | 49 | ZSTDDICT_SRC := $(ZSTDDIR)/dictBuilder/*.c |
11fdf7f2 TL |
50 | FUZZ_SRC := \ |
51 | $(FUZZ_SRC) \ | |
52 | $(ZSTDDECOMP_SRC) \ | |
53 | $(ZSTDCOMMON_SRC) \ | |
9f95a23c TL |
54 | $(ZSTDCOMP_SRC) \ |
55 | $(ZSTDDICT_SRC) | |
11fdf7f2 TL |
56 | |
57 | FUZZ_OBJ := $(patsubst %.c,%.o, $(wildcard $(FUZZ_SRC))) | |
58 | ||
59 | ||
60 | .PHONY: default all clean cleanall | |
61 | ||
62 | default: all | |
63 | ||
64 | FUZZ_TARGETS := \ | |
65 | simple_round_trip \ | |
66 | stream_round_trip \ | |
67 | block_round_trip \ | |
68 | simple_decompress \ | |
69 | stream_decompress \ | |
9f95a23c TL |
70 | block_decompress \ |
71 | dictionary_round_trip \ | |
72 | dictionary_decompress | |
11fdf7f2 TL |
73 | |
74 | all: $(FUZZ_TARGETS) | |
75 | ||
76 | %.o: %.c | |
77 | $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $^ -c -o $@ | |
78 | ||
79 | simple_round_trip: $(FUZZ_HEADERS) $(FUZZ_OBJ) simple_round_trip.o | |
80 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) simple_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ | |
81 | ||
82 | stream_round_trip: $(FUZZ_HEADERS) $(FUZZ_OBJ) stream_round_trip.o | |
83 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) stream_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ | |
84 | ||
85 | block_round_trip: $(FUZZ_HEADERS) $(FUZZ_OBJ) block_round_trip.o | |
86 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) block_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ | |
87 | ||
88 | simple_decompress: $(FUZZ_HEADERS) $(FUZZ_OBJ) simple_decompress.o | |
89 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) simple_decompress.o $(LIB_FUZZING_ENGINE) -o $@ | |
90 | ||
91 | stream_decompress: $(FUZZ_HEADERS) $(FUZZ_OBJ) stream_decompress.o | |
92 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) stream_decompress.o $(LIB_FUZZING_ENGINE) -o $@ | |
93 | ||
94 | block_decompress: $(FUZZ_HEADERS) $(FUZZ_OBJ) block_decompress.o | |
95 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) block_decompress.o $(LIB_FUZZING_ENGINE) -o $@ | |
96 | ||
9f95a23c TL |
97 | dictionary_round_trip: $(FUZZ_HEADERS) $(FUZZ_OBJ) dictionary_round_trip.o |
98 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) dictionary_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ | |
99 | ||
100 | dictionary_decompress: $(FUZZ_HEADERS) $(FUZZ_OBJ) dictionary_decompress.o | |
101 | $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_OBJ) dictionary_decompress.o $(LIB_FUZZING_ENGINE) -o $@ | |
102 | ||
103 | libregression.a: $(FUZZ_HEADERS) $(PRGDIR)/util.h $(PRGDIR)/util.c regression_driver.o | |
11fdf7f2 TL |
104 | $(AR) $(FUZZ_ARFLAGS) $@ regression_driver.o |
105 | ||
106 | # Install libfuzzer (not usable for MSAN testing) | |
9f95a23c | 107 | # Provided for convenience. To use this library run make libFuzzer and |
11fdf7f2 TL |
108 | # set LDFLAGS=-L. |
109 | .PHONY: libFuzzer | |
110 | libFuzzer: | |
111 | @$(RM) -rf Fuzzer | |
9f95a23c | 112 | @git clone https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer Fuzzer |
11fdf7f2 TL |
113 | @cd Fuzzer && ./build.sh |
114 | ||
115 | corpora/%_seed_corpus.zip: | |
116 | @mkdir -p corpora | |
117 | $(DOWNLOAD) $@ $(CORPORA_URL_PREFIX)$*_seed_corpus.zip | |
118 | ||
119 | corpora/%: corpora/%_seed_corpus.zip | |
120 | unzip -q $^ -d $@ | |
121 | ||
122 | .PHONY: corpora | |
123 | corpora: $(patsubst %,corpora/%,$(FUZZ_TARGETS)) | |
124 | ||
125 | regressiontest: corpora | |
126 | CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" $(PYTHON) ./fuzz.py build all | |
127 | $(PYTHON) ./fuzz.py regression all | |
128 | ||
129 | clean: | |
130 | @$(MAKE) -C $(ZSTDDIR) clean | |
131 | @$(RM) *.a *.o | |
132 | @$(RM) simple_round_trip stream_round_trip simple_decompress \ | |
133 | stream_decompress block_decompress block_round_trip | |
134 | ||
135 | cleanall: | |
136 | @$(RM) -r Fuzzer | |
137 | @$(RM) -r corpora |