1CC ?= clang 2CXX ?= clang++ 3 4# By default, use our own standalone_fuzz_target_runner. 5# This runner does no fuzzing, but simply executes the inputs 6# provided via parameters. 7# Run e.g. "make all LIB_FUZZING_ENGINE=/path/to/libFuzzer.a" 8# to link the fuzzer(s) against a real fuzzing engine. 9# 10# OSS-Fuzz will define its own value for LIB_FUZZING_ENGINE. 11LIB_FUZZING_ENGINE ?= standalone_fuzz_target_runner.o 12 13# Default to Python 3. 14# 15# Windows ships Python 3 as `python.exe`, which may not be on PATH. py.exe is. 16ifeq ($(OS),Windows_NT) 17PYTHON?=py -3 18else 19PYTHON?=python3 20endif 21 22PYTHON_CONFIG ?= $$OUT/sanpy/bin/python-config 23PYTHON_CONFIG_FLAGS ?= --ldflags --embed 24 25CXXFLAGS += -Wno-deprecated-register 26 27all: standalone_fuzz_target_runner.o oss-fuzz 28 29standalone_fuzz_target_runner.o: standalone_fuzz_target_runner.cc 30 31$$OUT/%_fuzzer_seed_corpus.zip: %_corpus.py 32 $(PYTHON) $< $@ 33 34pyutil.o: pyutil.cc pyutil.h 35 $(CXX) $(CXXFLAGS) -g -O1 \ 36 `$(PYTHON_CONFIG) --cflags` \ 37 -I../../mercurial -c -o pyutil.o pyutil.cc 38 39bdiff-oss-fuzz.o: ../../mercurial/bdiff.c 40 $(CC) $(CFLAGS) -c -o bdiff-oss-fuzz.o ../../mercurial/bdiff.c 41 42bdiff_fuzzer: bdiff.cc bdiff-oss-fuzz.o 43 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial bdiff.cc \ 44 bdiff-oss-fuzz.o $(LIB_FUZZING_ENGINE) -o \ 45 $$OUT/bdiff_fuzzer 46 47mpatch.o: ../../mercurial/mpatch.c 48 $(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c -o mpatch.o \ 49 ../../mercurial/mpatch.c 50 51mpatch-oss-fuzz.o: ../../mercurial/mpatch.c 52 $(CC) $(CFLAGS) -c -o mpatch-oss-fuzz.o ../../mercurial/mpatch.c 53 54mpatch_fuzzer: mpatch.cc mpatch-oss-fuzz.o $$OUT/mpatch_fuzzer_seed_corpus.zip 55 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial mpatch.cc \ 56 mpatch-oss-fuzz.o $(LIB_FUZZING_ENGINE) -o \ 57 $$OUT/mpatch_fuzzer 58 59fuzz-x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h 60 $(CC) $(CFLAGS) -c \ 61 -o $@ \ 62 $< 63 64xdiff_fuzzer: xdiff.cc fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o 65 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial xdiff.cc \ 66 fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o \ 67 $(LIB_FUZZING_ENGINE) -o $$OUT/xdiff_fuzzer 68 69parsers-%.o: ../../mercurial/cext/%.c 70 $(CC) -I../../mercurial `$(PYTHON_CONFIG) --cflags` $(CFLAGS) -c \ 71 -o $@ $< 72 73PARSERS_OBJS=parsers-manifest.o parsers-charencode.o parsers-parsers.o parsers-dirs.o parsers-pathencode.o parsers-revlog.o 74 75dirs_fuzzer: dirs.cc pyutil.o $(PARSERS_OBJS) $$OUT/dirs_fuzzer_seed_corpus.zip 76 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 77 -Wno-register -Wno-macro-redefined \ 78 -I../../mercurial dirs.cc \ 79 pyutil.o $(PARSERS_OBJS) \ 80 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 81 -o $$OUT/dirs_fuzzer 82 83fncache_fuzzer: fncache.cc 84 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 85 -Wno-register -Wno-macro-redefined \ 86 -I../../mercurial fncache.cc \ 87 pyutil.o $(PARSERS_OBJS) \ 88 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 89 -o $$OUT/fncache_fuzzer 90 91jsonescapeu8fast_fuzzer: jsonescapeu8fast.cc pyutil.o $(PARSERS_OBJS) 92 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 93 -Wno-register -Wno-macro-redefined \ 94 -I../../mercurial jsonescapeu8fast.cc \ 95 pyutil.o $(PARSERS_OBJS) \ 96 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 97 -o $$OUT/jsonescapeu8fast_fuzzer 98 99manifest_fuzzer: manifest.cc pyutil.o $(PARSERS_OBJS) $$OUT/manifest_fuzzer_seed_corpus.zip 100 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 101 -Wno-register -Wno-macro-redefined \ 102 -I../../mercurial manifest.cc \ 103 pyutil.o $(PARSERS_OBJS) \ 104 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 105 -o $$OUT/manifest_fuzzer 106 107revlog_fuzzer: revlog.cc pyutil.o $(PARSERS_OBJS) $$OUT/revlog_fuzzer_seed_corpus.zip 108 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 109 -Wno-register -Wno-macro-redefined \ 110 -I../../mercurial revlog.cc \ 111 pyutil.o $(PARSERS_OBJS) \ 112 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 113 -o $$OUT/revlog_fuzzer 114 115dirstate_fuzzer: dirstate.cc pyutil.o $(PARSERS_OBJS) $$OUT/dirstate_fuzzer_seed_corpus.zip 116 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 117 -Wno-register -Wno-macro-redefined \ 118 -I../../mercurial dirstate.cc \ 119 pyutil.o $(PARSERS_OBJS) \ 120 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 121 -o $$OUT/dirstate_fuzzer 122 123fm1readmarkers_fuzzer: fm1readmarkers.cc pyutil.o $(PARSERS_OBJS) $$OUT/fm1readmarkers_fuzzer_seed_corpus.zip 124 $(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \ 125 -Wno-register -Wno-macro-redefined \ 126 -I../../mercurial fm1readmarkers.cc \ 127 pyutil.o $(PARSERS_OBJS) \ 128 $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) $(PYTHON_CONFIG_FLAGS)` \ 129 -o $$OUT/fm1readmarkers_fuzzer 130 131clean: 132 $(RM) *.o *_fuzzer \ 133 bdiff \ 134 mpatch \ 135 xdiff 136 137oss-fuzz: bdiff_fuzzer mpatch_fuzzer xdiff_fuzzer dirs_fuzzer fncache_fuzzer jsonescapeu8fast_fuzzer manifest_fuzzer revlog_fuzzer dirstate_fuzzer fm1readmarkers_fuzzer 138 139.PHONY: all clean oss-fuzz 140