@@ -4,10 +4,12 @@ VERSION := $(shell head -n 1 ../CHANGES)
44MAJOR := $(firstword $(subst ., ,$(VERSION ) ) )
55
66FUZZER = $(NAME ) _fuzzer
7+ FUZZER_LOAD = $(NAME ) _fuzzer_load
78FUZZER_CORPUS = corpus
9+ FUZZER_LOAD_CORPUS = corpus_load
810
911# Fuzzer implies sanitizers
10- ifneq ($(filter fuzzer fuzzer-corpus-seeds,$(MAKECMDGOALS ) ) ,)
12+ ifneq ($(filter fuzzer fuzzer-corpus-seeds fuzzer-load fuzzer-load-corpus-seeds ,$(MAKECMDGOALS ) ) ,)
1113SANITIZE = yes
1214FUZZER_SAN_OPT = ,fuzzer
1315endif
@@ -60,13 +62,19 @@ TEST_STATIC = $(NAME)_test_static
6062PREFIX = /usr/local
6163LIBDIR = $(PREFIX ) /lib
6264
63- .PHONY : default all clean lib libstatic libshared test test-static test-valgrind fuzzer fuzzer-corpus-seeds clean-fuzzer-corpus install install-static install-shared uninstall
64-
65+ .PHONY : default
6566default : lib
67+
68+ .PHONY : all
6669all : default test
6770
71+ .PHONY : lib
6872lib : libshared libstatic
73+
74+ .PHONY : libshared
6975libshared : lib$(NAME ) .so.$(VERSION ) lib$(NAME ) .so lib$(NAME ) .so.$(MAJOR )
76+
77+ .PHONY : libstatic
7078libstatic : lib$(NAME ) .a
7179
7280lib$(NAME ) .so : lib$(NAME ) .so.$(VERSION ) lib$(NAME ) .so.$(MAJOR )
@@ -91,10 +99,12 @@ $(TEST_SHARED): lib$(NAME).so $(NAME)_test.c
9199$(TEST_STATIC ) : $(NAME ) .o $(NAME ) _test.c
92100 $(CC ) $(CFLAGS ) $(NAME ) .o $(NAME ) _test.c -o $@
93101
102+ .PHONY : test
94103test : $(TEST_SHARED ) $(TEST_STATIC )
95104 $(SAN_ENV ) LD_LIBRARY_PATH=.:$$ LD_LIBRARY_PATH ./$(TEST_SHARED )
96105 $(SAN_ENV ) ./$(TEST_STATIC )
97106
107+ .PHONY : test-static
98108test-static : $(TEST_STATIC )
99109 $(SAN_ENV ) ./$(TEST_STATIC )
100110
@@ -103,6 +113,7 @@ test-static: $(TEST_STATIC)
103113#
104114# make test-valgrind
105115#
116+ .PHONY : test-valgrind
106117test-valgrind : $(TEST_SHARED ) $(TEST_STATIC )
107118 LD_LIBRARY_PATH=.:$$ LD_LIBRARY_PATH valgrind --leak-check=full --error-exitcode=1 ./$(TEST_SHARED )
108119 valgrind --leak-check=full --error-exitcode=1 ./$(TEST_STATIC )
@@ -120,6 +131,7 @@ $(FUZZER): $(NAME).o $(NAME)_fuzzer.c
120131$(FUZZER_CORPUS ) / :
121132 mkdir -p $@
122133
134+ .PHONY : fuzzer
123135fuzzer : $(FUZZER ) | $(FUZZER_CORPUS ) /
124136 @echo
125137 @echo " Fuzzer built: ./$( FUZZER) "
@@ -130,6 +142,7 @@ fuzzer: $(FUZZER) | $(FUZZER_CORPUS)/
130142 @echo " Seed the corpus first with:"
131143 @echo " make fuzzer-corpus-seeds"
132144
145+ .PHONY : fuzzer-corpus-seeds
133146fuzzer-corpus-seeds : $(FUZZER ) | $(FUZZER_CORPUS ) /
134147 @if [ -z " $$ (ls -A $( FUZZER_CORPUS) / 2>/dev/null)" ]; then \
135148 printf ' qrcode\0TESTING123\0version=20' > $(FUZZER_CORPUS ) /qrcode_opts; \
@@ -147,30 +160,80 @@ fuzzer-corpus-seeds: $(FUZZER) | $(FUZZER_CORPUS)/
147160 echo " $( FUZZER_CORPUS) / already populated; skipping seed" ; \
148161 fi
149162
163+ .PHONY : clean-fuzzer-corpus
150164clean-fuzzer-corpus :
151- $(RM ) -r $(FUZZER_CORPUS ) /
165+ $(RM ) -r $(FUZZER_CORPUS ) / $(FUZZER_LOAD_CORPUS ) /
166+
167+ #
168+ # Load fuzzer: fuzzes the barcode.ps parser via fmemopen.
169+ # Requires clang.
170+ #
171+ # make fuzzer-load - Build and print run instructions
172+ # make fuzzer-load-corpus-seeds - Seed the corpus from barcode.ps
173+ # make clean-fuzzer-corpus - Remove corpus directories
174+ #
175+ $(FUZZER_LOAD ) : $(NAME ) .o $(NAME ) _fuzzer_load.c
176+ $(CC ) $(CFLAGS ) $(NAME ) .o $(NAME ) _fuzzer_load.c -o $@
177+
178+ $(FUZZER_LOAD_CORPUS ) / :
179+ mkdir -p $@
180+
181+ .PHONY : fuzzer-load
182+ fuzzer-load : $(FUZZER_LOAD ) | $(FUZZER_LOAD_CORPUS ) /
183+ @echo
184+ @echo " Load fuzzer built: ./$( FUZZER_LOAD) "
185+ @echo
186+ @echo " Run with:"
187+ @echo " cd libs/c && ./$( FUZZER_LOAD) -max_len=4096 $( FUZZER_LOAD_CORPUS) /"
188+ @echo
189+ @echo " Seed the corpus first with:"
190+ @echo " make fuzzer-load-corpus-seeds"
191+
192+ .PHONY : fuzzer-load-corpus-seeds
193+ fuzzer-load-corpus-seeds : $(FUZZER_LOAD ) | $(FUZZER_LOAD_CORPUS ) /
194+ @if [ -z " $$ (ls -A $( FUZZER_LOAD_CORPUS) / 2>/dev/null)" ]; then \
195+ printf ' ' > $(FUZZER_LOAD_CORPUS ) /empty; \
196+ printf ' %%!PS\n' > $(FUZZER_LOAD_CORPUS ) /header_only; \
197+ printf ' %% Barcode Writer in Pure PostScript - Version 2099-01-01\n' > $(FUZZER_LOAD_CORPUS ) /version_only; \
198+ printf ' %% Barcode Writer in Pure PostScript - Version 2099-01-01\n%% --BEGIN TEMPLATE--\n%% --END TEMPLATE--\n' > $(FUZZER_LOAD_CORPUS ) /empty_template; \
199+ printf ' %% Barcode Writer in Pure PostScript - Version 2099-01-01\n%% --BEGIN TEMPLATE--\n%% --BEGIN RESOURCE foo--\ncode\n%% --END RESOURCE foo--\n%% --END TEMPLATE--\n' > $(FUZZER_LOAD_CORPUS ) /one_resource; \
200+ printf ' %% Barcode Writer in Pure PostScript - Version 2099-01-01\n%% --BEGIN TEMPLATE--\n%% --BEGIN ENCODER bar--\n%% --REQUIRES foo--\n%% --DESC: Test\n%% --EXAM: data\n%% --EXOP: opts\n%% --RNDR: renlinear\n%% --FMLY: Test Family\ncode\n%% --END ENCODER bar--\n%% --END TEMPLATE--\n' > $(FUZZER_LOAD_CORPUS ) /encoder_metadata; \
201+ printf ' %% --BEGIN TEMPLATE--\n%% --BEGIN RESOURCE a--\nA\n%% --END RESOURCE a--\n%% --BEGIN RESOURCE b--\nB\n%% --END RESOURCE b--\n%% --BEGIN RESOURCE c--\nC\n%% --END RESOURCE c--\n%% --END TEMPLATE--\n' > $(FUZZER_LOAD_CORPUS ) /multi_resource; \
202+ sed ' s/$$/\r/' $(FUZZER_LOAD_CORPUS ) /encoder_metadata > $(FUZZER_LOAD_CORPUS ) /encoder_crlf; \
203+ sed ' s/$$/\r/' $(FUZZER_LOAD_CORPUS ) /multi_resource > $(FUZZER_LOAD_CORPUS ) /multi_crlf; \
204+ printf ' %% --BEGIN TEMPLATE--\n%% --BEGIN RESOURCE foo--\n' > $(FUZZER_LOAD_CORPUS ) /truncated; \
205+ echo " Seeded $( FUZZER_LOAD_CORPUS) / with $$ (ls $( FUZZER_LOAD_CORPUS) / | wc -l) inputs" ; \
206+ else \
207+ echo " $( FUZZER_LOAD_CORPUS) / already populated; skipping seed" ; \
208+ fi
152209
210+ .PHONY : clean
153211clean :
154- $(RM ) $(TEST_SHARED ) $(TEST_STATIC ) $(FUZZER ) * .o * .so* * .a * .d
212+ $(RM ) $(TEST_SHARED ) $(TEST_STATIC ) $(FUZZER ) $( FUZZER_LOAD ) * .o * .so* * .a * .d
155213
214+ .PHONY : install
156215install : install-static install-shared
157216
217+ .PHONY : install-headers
158218install-headers :
159219 install -d $(DESTDIR )$(PREFIX ) /include
160220 install -m 0644 $(NAME ) .h $(DESTDIR )$(PREFIX ) /include
161221 install -m 0644 ../bindings/cpp/$(NAME ) .hpp $(DESTDIR )$(PREFIX ) /include
162222
223+ .PHONY : install-static
163224install-static : libstatic install-headers
164225 install -d $(DESTDIR )$(LIBDIR )
165226 install -m 0644 lib$(NAME ) .a $(DESTDIR )$(LIBDIR )
166227
228+ .PHONY : install-shared
167229install-shared : libshared install-headers
168230 install -d $(DESTDIR )$(LIBDIR )
169231 install -m 0644 lib$(NAME ) .so.$(VERSION ) $(DESTDIR )$(LIBDIR )
170232 cd $(DESTDIR )$(LIBDIR ) && ln -sf lib$(NAME ) .so.$(VERSION ) lib$(NAME ) .so
171233 cd $(DESTDIR )$(LIBDIR ) && ln -sf lib$(NAME ) .so.$(VERSION ) lib$(NAME ) .so.$(MAJOR )
172234 -ldconfig
173235
236+ .PHONY : uninstall
174237uninstall :
175238 $(RM ) $(DESTDIR )$(PREFIX ) /include/$(NAME ) .h
176239 $(RM ) $(DESTDIR )$(PREFIX ) /include/$(NAME ) .hpp
0 commit comments