1# overrideable build dir, default is in-place
2BUILDDIR ?= .
3# overridable target/src/tools/flags/etc
4ifneq ($(wildcard test.c main.c),)
5TARGET ?= $(BUILDDIR)/lfs
6else
7TARGET ?= $(BUILDDIR)/liblfs.a
8endif
9
10
11CC       ?= gcc
12AR       ?= ar
13SIZE     ?= size
14CTAGS    ?= ctags
15NM       ?= nm
16OBJDUMP  ?= objdump
17VALGRIND ?= valgrind
18GDB		 ?= gdb
19PERF	 ?= perf
20
21SRC  ?= $(filter-out $(wildcard *.t.* *.b.*),$(wildcard *.c))
22OBJ  := $(SRC:%.c=$(BUILDDIR)/%.o)
23DEP  := $(SRC:%.c=$(BUILDDIR)/%.d)
24ASM  := $(SRC:%.c=$(BUILDDIR)/%.s)
25CI   := $(SRC:%.c=$(BUILDDIR)/%.ci)
26GCDA := $(SRC:%.c=$(BUILDDIR)/%.t.gcda)
27
28TESTS ?= $(wildcard tests/*.toml)
29TEST_SRC ?= $(SRC) \
30		$(filter-out $(wildcard bd/*.t.* bd/*.b.*),$(wildcard bd/*.c)) \
31		runners/test_runner.c
32TEST_RUNNER ?= $(BUILDDIR)/runners/test_runner
33TEST_A     := $(TESTS:%.toml=$(BUILDDIR)/%.t.a.c) \
34		$(TEST_SRC:%.c=$(BUILDDIR)/%.t.a.c)
35TEST_C     := $(TEST_A:%.t.a.c=%.t.c)
36TEST_OBJ   := $(TEST_C:%.t.c=%.t.o)
37TEST_DEP   := $(TEST_C:%.t.c=%.t.d)
38TEST_CI	   := $(TEST_C:%.t.c=%.t.ci)
39TEST_GCNO  := $(TEST_C:%.t.c=%.t.gcno)
40TEST_GCDA  := $(TEST_C:%.t.c=%.t.gcda)
41TEST_PERF  := $(TEST_RUNNER:%=%.perf)
42TEST_TRACE := $(TEST_RUNNER:%=%.trace)
43TEST_CSV   := $(TEST_RUNNER:%=%.csv)
44
45BENCHES ?= $(wildcard benches/*.toml)
46BENCH_SRC ?= $(SRC) \
47		$(filter-out $(wildcard bd/*.t.* bd/*.b.*),$(wildcard bd/*.c)) \
48		runners/bench_runner.c
49BENCH_RUNNER ?= $(BUILDDIR)/runners/bench_runner
50BENCH_A     := $(BENCHES:%.toml=$(BUILDDIR)/%.b.a.c) \
51		$(BENCH_SRC:%.c=$(BUILDDIR)/%.b.a.c)
52BENCH_C     := $(BENCH_A:%.b.a.c=%.b.c)
53BENCH_OBJ   := $(BENCH_C:%.b.c=%.b.o)
54BENCH_DEP   := $(BENCH_C:%.b.c=%.b.d)
55BENCH_CI    := $(BENCH_C:%.b.c=%.b.ci)
56BENCH_GCNO  := $(BENCH_C:%.b.c=%.b.gcno)
57BENCH_GCDA  := $(BENCH_C:%.b.c=%.b.gcda)
58BENCH_PERF  := $(BENCH_RUNNER:%=%.perf)
59BENCH_TRACE := $(BENCH_RUNNER:%=%.trace)
60BENCH_CSV   := $(BENCH_RUNNER:%=%.csv)
61
62CFLAGS += -fcallgraph-info=su
63CFLAGS += -g3
64CFLAGS += -I.
65CFLAGS += -std=c99 -Wall -Wextra -pedantic
66CFLAGS += -ftrack-macro-expansion=0
67ifdef DEBUG
68CFLAGS += -O0
69else
70CFLAGS += -Os
71endif
72ifdef TRACE
73CFLAGS += -DLFS_YES_TRACE
74endif
75ifdef YES_COV
76CFLAGS += --coverage
77endif
78ifdef YES_PERF
79CFLAGS += -fno-omit-frame-pointer
80endif
81ifdef YES_PERFBD
82CFLAGS += -fno-omit-frame-pointer
83endif
84
85ifdef VERBOSE
86CODEFLAGS    += -v
87DATAFLAGS    += -v
88STACKFLAGS   += -v
89STRUCTSFLAGS += -v
90COVFLAGS     += -v
91PERFFLAGS    += -v
92PERFBDFLAGS  += -v
93endif
94# forward -j flag
95PERFFLAGS   += $(filter -j%,$(MAKEFLAGS))
96PERFBDFLAGS += $(filter -j%,$(MAKEFLAGS))
97ifneq ($(NM),nm)
98CODEFLAGS += --nm-path="$(NM)"
99DATAFLAGS += --nm-path="$(NM)"
100endif
101ifneq ($(OBJDUMP),objdump)
102CODEFLAGS    += --objdump-path="$(OBJDUMP)"
103DATAFLAGS    += --objdump-path="$(OBJDUMP)"
104STRUCTSFLAGS += --objdump-path="$(OBJDUMP)"
105PERFFLAGS    += --objdump-path="$(OBJDUMP)"
106PERFBDFLAGS  += --objdump-path="$(OBJDUMP)"
107endif
108ifneq ($(PERF),perf)
109PERFFLAGS += --perf-path="$(PERF)"
110endif
111
112TESTFLAGS  += -b
113BENCHFLAGS += -b
114# forward -j flag
115TESTFLAGS  += $(filter -j%,$(MAKEFLAGS))
116BENCHFLAGS += $(filter -j%,$(MAKEFLAGS))
117ifdef YES_PERF
118TESTFLAGS  += -p $(TEST_PERF)
119BENCHFLAGS += -p $(BENCH_PERF)
120endif
121ifdef YES_PERFBD
122TESTFLAGS += -t $(TEST_TRACE) --trace-backtrace --trace-freq=100
123endif
124ifndef NO_PERFBD
125BENCHFLAGS += -t $(BENCH_TRACE) --trace-backtrace --trace-freq=100
126endif
127ifdef YES_TESTMARKS
128TESTFLAGS += -o $(TEST_CSV)
129endif
130ifndef NO_BENCHMARKS
131BENCHFLAGS += -o $(BENCH_CSV)
132endif
133ifdef VERBOSE
134TESTFLAGS   += -v
135TESTCFLAGS  += -v
136BENCHFLAGS  += -v
137BENCHCFLAGS += -v
138endif
139ifdef EXEC
140TESTFLAGS  += --exec="$(EXEC)"
141BENCHFLAGS += --exec="$(EXEC)"
142endif
143ifneq ($(GDB),gdb)
144TESTFLAGS  += --gdb-path="$(GDB)"
145BENCHFLAGS += --gdb-path="$(GDB)"
146endif
147ifneq ($(VALGRIND),valgrind)
148TESTFLAGS  += --valgrind-path="$(VALGRIND)"
149BENCHFLAGS += --valgrind-path="$(VALGRIND)"
150endif
151ifneq ($(PERF),perf)
152TESTFLAGS  += --perf-path="$(PERF)"
153BENCHFLAGS += --perf-path="$(PERF)"
154endif
155
156# this is a bit of a hack, but we want to make sure the BUILDDIR
157# directory structure is correct before we run any commands
158ifneq ($(BUILDDIR),.)
159$(if $(findstring n,$(MAKEFLAGS)),, $(shell mkdir -p \
160	$(addprefix $(BUILDDIR)/,$(dir \
161		$(SRC) \
162		$(TESTS) \
163		$(TEST_SRC) \
164		$(BENCHES) \
165		$(BENCH_SRC)))))
166endif
167
168
169# commands
170
171## Build littlefs
172.PHONY: all build
173all build: $(TARGET)
174
175## Build assembly files
176.PHONY: asm
177asm: $(ASM)
178
179## Find the total size
180.PHONY: size
181size: $(OBJ)
182	$(SIZE) -t $^
183
184## Generate a ctags file
185.PHONY: tags
186tags:
187	$(CTAGS) --totals --c-types=+p $(shell find -H -name '*.h') $(SRC)
188
189## Show this help text
190.PHONY: help
191help:
192	@$(strip awk '/^## / { \
193			sub(/^## /,""); \
194			getline rule; \
195			while (rule ~ /^(#|\.PHONY|ifdef|ifndef)/) getline rule; \
196			gsub(/:.*/, "", rule); \
197			printf " "" %-25s %s\n", rule, $$0 \
198		}' $(MAKEFILE_LIST))
199
200## Find the per-function code size
201.PHONY: code
202code: CODEFLAGS+=-S
203code: $(OBJ) $(BUILDDIR)/lfs.code.csv
204	./scripts/code.py $(OBJ) $(CODEFLAGS)
205
206## Compare per-function code size
207.PHONY: code-diff
208code-diff: $(OBJ)
209	./scripts/code.py $^ $(CODEFLAGS) -d $(BUILDDIR)/lfs.code.csv
210
211## Find the per-function data size
212.PHONY: data
213data: DATAFLAGS+=-S
214data: $(OBJ) $(BUILDDIR)/lfs.data.csv
215	./scripts/data.py $(OBJ) $(DATAFLAGS)
216
217## Compare per-function data size
218.PHONY: data-diff
219data-diff: $(OBJ)
220	./scripts/data.py $^ $(DATAFLAGS) -d $(BUILDDIR)/lfs.data.csv
221
222## Find the per-function stack usage
223.PHONY: stack
224stack: STACKFLAGS+=-S
225stack: $(CI) $(BUILDDIR)/lfs.stack.csv
226	./scripts/stack.py $(CI) $(STACKFLAGS)
227
228## Compare per-function stack usage
229.PHONY: stack-diff
230stack-diff: $(CI)
231	./scripts/stack.py $^ $(STACKFLAGS) -d $(BUILDDIR)/lfs.stack.csv
232
233## Find function sizes
234.PHONY: funcs
235funcs: SUMMARYFLAGS+=-S
236funcs: \
237		$(BUILDDIR)/lfs.code.csv \
238		$(BUILDDIR)/lfs.data.csv \
239		$(BUILDDIR)/lfs.stack.csv
240	$(strip ./scripts/summary.py $^ \
241		-bfunction \
242		-fcode=code_size \
243		-fdata=data_size \
244		-fstack=stack_limit --max=stack \
245		$(SUMMARYFLAGS))
246
247## Compare function sizes
248.PHONY: funcs-diff
249funcs-diff: SHELL=/bin/bash
250funcs-diff: $(OBJ) $(CI)
251	$(strip ./scripts/summary.py \
252		<(./scripts/code.py $(OBJ) -q $(CODEFLAGS) -o-) \
253		<(./scripts/data.py $(OBJ) -q $(DATAFLAGS) -o-) \
254		<(./scripts/stack.py $(CI) -q $(STACKFLAGS) -o-) \
255		-bfunction \
256		-fcode=code_size \
257		-fdata=data_size \
258		-fstack=stack_limit --max=stack \
259		$(SUMMARYFLAGS) -d <(./scripts/summary.py \
260			$(BUILDDIR)/lfs.code.csv \
261			$(BUILDDIR)/lfs.data.csv \
262			$(BUILDDIR)/lfs.stack.csv \
263			-q $(SUMMARYFLAGS) -o-))
264
265## Find struct sizes
266.PHONY: structs
267structs: STRUCTSFLAGS+=-S
268structs: $(OBJ) $(BUILDDIR)/lfs.structs.csv
269	./scripts/structs.py $(OBJ) $(STRUCTSFLAGS)
270
271## Compare struct sizes
272.PHONY: structs-diff
273structs-diff: $(OBJ)
274	./scripts/structs.py $^ $(STRUCTSFLAGS) -d $(BUILDDIR)/lfs.structs.csv
275
276## Find the line/branch coverage after a test run
277.PHONY: cov
278cov: COVFLAGS+=-s
279cov: $(GCDA) $(BUILDDIR)/lfs.cov.csv
280	$(strip ./scripts/cov.py $(GCDA) \
281		$(patsubst %,-F%,$(SRC)) \
282		$(COVFLAGS))
283
284## Compare line/branch coverage
285.PHONY: cov-diff
286cov-diff: $(GCDA)
287	$(strip ./scripts/cov.py $^ \
288		$(patsubst %,-F%,$(SRC)) \
289		$(COVFLAGS) -d $(BUILDDIR)/lfs.cov.csv)
290
291## Find the perf results after bench run with YES_PERF
292.PHONY: perf
293perf: PERFFLAGS+=-S
294perf: $(BENCH_PERF) $(BUILDDIR)/lfs.perf.csv
295	$(strip ./scripts/perf.py $(BENCH_PERF) \
296		$(patsubst %,-F%,$(SRC)) \
297		$(PERFFLAGS))
298
299## Compare perf results
300.PHONY: perf-diff
301perf-diff: $(BENCH_PERF)
302	$(strip ./scripts/perf.py $^ \
303		$(patsubst %,-F%,$(SRC)) \
304		$(PERFFLAGS) -d $(BUILDDIR)/lfs.perf.csv)
305
306## Find the perfbd results after a bench run
307.PHONY: perfbd
308perfbd: PERFBDFLAGS+=-S
309perfbd: $(BENCH_TRACE) $(BUILDDIR)/lfs.perfbd.csv
310	$(strip ./scripts/perfbd.py $(BENCH_RUNNER) $(BENCH_TRACE) \
311		$(patsubst %,-F%,$(SRC)) \
312		$(PERFBDFLAGS))
313
314## Compare perfbd results
315.PHONY: perfbd-diff
316perfbd-diff: $(BENCH_TRACE)
317	$(strip ./scripts/perfbd.py $(BENCH_RUNNER) $^ \
318		$(patsubst %,-F%,$(SRC)) \
319		$(PERFBDFLAGS) -d $(BUILDDIR)/lfs.perfbd.csv)
320
321## Find a summary of compile-time sizes
322.PHONY: summary sizes
323summary sizes: \
324		$(BUILDDIR)/lfs.code.csv \
325		$(BUILDDIR)/lfs.data.csv \
326		$(BUILDDIR)/lfs.stack.csv \
327		$(BUILDDIR)/lfs.structs.csv
328	$(strip ./scripts/summary.py $^ \
329		-fcode=code_size \
330		-fdata=data_size \
331		-fstack=stack_limit --max=stack \
332		-fstructs=struct_size \
333		-Y $(SUMMARYFLAGS))
334
335## Compare compile-time sizes
336.PHONY: summary-diff sizes-diff
337summary-diff sizes-diff: SHELL=/bin/bash
338summary-diff sizes-diff: $(OBJ) $(CI)
339	$(strip ./scripts/summary.py \
340		<(./scripts/code.py $(OBJ) -q $(CODEFLAGS) -o-) \
341		<(./scripts/data.py $(OBJ) -q $(DATAFLAGS) -o-) \
342		<(./scripts/stack.py $(CI) -q $(STACKFLAGS) -o-) \
343		<(./scripts/structs.py $(OBJ) -q $(STRUCTSFLAGS) -o-) \
344		-fcode=code_size \
345		-fdata=data_size \
346		-fstack=stack_limit --max=stack \
347		-fstructs=struct_size \
348		-Y $(SUMMARYFLAGS) -d <(./scripts/summary.py \
349			$(BUILDDIR)/lfs.code.csv \
350			$(BUILDDIR)/lfs.data.csv \
351			$(BUILDDIR)/lfs.stack.csv \
352			$(BUILDDIR)/lfs.structs.csv \
353			-q $(SUMMARYFLAGS) -o-))
354
355## Build the test-runner
356.PHONY: test-runner build-test
357ifndef NO_COV
358test-runner build-test: CFLAGS+=--coverage
359endif
360ifdef YES_PERF
361test-runner build-test: CFLAGS+=-fno-omit-frame-pointer
362endif
363ifdef YES_PERFBD
364test-runner build-test: CFLAGS+=-fno-omit-frame-pointer
365endif
366# note we remove some binary dependent files during compilation,
367# otherwise it's way to easy to end up with outdated results
368test-runner build-test: $(TEST_RUNNER)
369ifndef NO_COV
370	rm -f $(TEST_GCDA)
371endif
372ifdef YES_PERF
373	rm -f $(TEST_PERF)
374endif
375ifdef YES_PERFBD
376	rm -f $(TEST_TRACE)
377endif
378
379## Run the tests, -j enables parallel tests
380.PHONY: test
381test: test-runner
382	./scripts/test.py $(TEST_RUNNER) $(TESTFLAGS)
383
384## List the tests
385.PHONY: test-list
386test-list: test-runner
387	./scripts/test.py $(TEST_RUNNER) $(TESTFLAGS) -l
388
389## Summarize the testmarks
390.PHONY: testmarks
391testmarks: SUMMARYFLAGS+=-spassed
392testmarks: $(TEST_CSV) $(BUILDDIR)/lfs.test.csv
393	$(strip ./scripts/summary.py $(TEST_CSV) \
394		-bsuite \
395		-fpassed=test_passed \
396		$(SUMMARYFLAGS))
397
398## Compare testmarks against a previous run
399.PHONY: testmarks-diff
400testmarks-diff: $(TEST_CSV)
401	$(strip ./scripts/summary.py $^ \
402		-bsuite \
403		-fpassed=test_passed \
404		$(SUMMARYFLAGS) -d $(BUILDDIR)/lfs.test.csv)
405
406## Build the bench-runner
407.PHONY: bench-runner build-bench
408ifdef YES_COV
409bench-runner build-bench: CFLAGS+=--coverage
410endif
411ifdef YES_PERF
412bench-runner build-bench: CFLAGS+=-fno-omit-frame-pointer
413endif
414ifndef NO_PERFBD
415bench-runner build-bench: CFLAGS+=-fno-omit-frame-pointer
416endif
417# note we remove some binary dependent files during compilation,
418# otherwise it's way to easy to end up with outdated results
419bench-runner build-bench: $(BENCH_RUNNER)
420ifdef YES_COV 
421	rm -f $(BENCH_GCDA)
422endif
423ifdef YES_PERF
424	rm -f $(BENCH_PERF)
425endif
426ifndef NO_PERFBD
427	rm -f $(BENCH_TRACE)
428endif
429
430## Run the benchmarks, -j enables parallel benchmarks
431.PHONY: bench
432bench: bench-runner
433	./scripts/bench.py $(BENCH_RUNNER) $(BENCHFLAGS)
434
435## List the benchmarks
436.PHONY: bench-list
437bench-list: bench-runner
438	./scripts/bench.py $(BENCH_RUNNER) $(BENCHFLAGS) -l
439
440## Summarize the benchmarks
441.PHONY: benchmarks
442benchmarks: SUMMARYFLAGS+=-Serased -Sproged -Sreaded
443benchmarks: $(BENCH_CSV) $(BUILDDIR)/lfs.bench.csv
444	$(strip ./scripts/summary.py $(BENCH_CSV) \
445		-bsuite \
446		-freaded=bench_readed \
447		-fproged=bench_proged \
448		-ferased=bench_erased \
449		$(SUMMARYFLAGS))
450
451## Compare benchmarks against a previous run
452.PHONY: benchmarks-diff
453benchmarks-diff: $(BENCH_CSV)
454	$(strip ./scripts/summary.py $^ \
455		-bsuite \
456		-freaded=bench_readed \
457		-fproged=bench_proged \
458		-ferased=bench_erased \
459		$(SUMMARYFLAGS) -d $(BUILDDIR)/lfs.bench.csv)
460
461
462
463# rules
464-include $(DEP)
465-include $(TEST_DEP)
466.SUFFIXES:
467.SECONDARY:
468
469$(BUILDDIR)/lfs: $(OBJ)
470	$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@
471
472$(BUILDDIR)/liblfs.a: $(OBJ)
473	$(AR) rcs $@ $^
474
475$(BUILDDIR)/lfs.code.csv: $(OBJ)
476	./scripts/code.py $^ -q $(CODEFLAGS) -o $@
477
478$(BUILDDIR)/lfs.data.csv: $(OBJ)
479	./scripts/data.py $^ -q $(DATAFLAGS) -o $@
480
481$(BUILDDIR)/lfs.stack.csv: $(CI)
482	./scripts/stack.py $^ -q $(STACKFLAGS) -o $@
483
484$(BUILDDIR)/lfs.structs.csv: $(OBJ)
485	./scripts/structs.py $^ -q $(STRUCTSFLAGS) -o $@
486
487$(BUILDDIR)/lfs.cov.csv: $(GCDA)
488	$(strip ./scripts/cov.py $^ \
489		$(patsubst %,-F%,$(SRC)) \
490		-q $(COVFLAGS) -o $@)
491
492$(BUILDDIR)/lfs.perf.csv: $(BENCH_PERF)
493	$(strip ./scripts/perf.py $^ \
494		$(patsubst %,-F%,$(SRC)) \
495		-q $(PERFFLAGS) -o $@)
496
497$(BUILDDIR)/lfs.perfbd.csv: $(BENCH_TRACE)
498	$(strip ./scripts/perfbd.py $(BENCH_RUNNER) $^ \
499		$(patsubst %,-F%,$(SRC)) \
500		-q $(PERFBDFLAGS) -o $@)
501
502$(BUILDDIR)/lfs.test.csv: $(TEST_CSV)
503	cp $^ $@
504
505$(BUILDDIR)/lfs.bench.csv: $(BENCH_CSV)
506	cp $^ $@
507
508$(BUILDDIR)/runners/test_runner: $(TEST_OBJ)
509	$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@
510
511$(BUILDDIR)/runners/bench_runner: $(BENCH_OBJ)
512	$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@
513
514# our main build rule generates .o, .d, and .ci files, the latter
515# used for stack analysis
516$(BUILDDIR)/%.o $(BUILDDIR)/%.ci: %.c
517	$(CC) -c -MMD $(CFLAGS) $< -o $(BUILDDIR)/$*.o
518
519$(BUILDDIR)/%.o $(BUILDDIR)/%.ci: $(BUILDDIR)/%.c
520	$(CC) -c -MMD $(CFLAGS) $< -o $(BUILDDIR)/$*.o
521
522$(BUILDDIR)/%.s: %.c
523	$(CC) -S $(CFLAGS) $< -o $@
524
525$(BUILDDIR)/%.c: %.a.c
526	./scripts/prettyasserts.py -p LFS_ASSERT $< -o $@
527
528$(BUILDDIR)/%.c: $(BUILDDIR)/%.a.c
529	./scripts/prettyasserts.py -p LFS_ASSERT $< -o $@
530
531$(BUILDDIR)/%.t.a.c: %.toml
532	./scripts/test.py -c $< $(TESTCFLAGS) -o $@
533
534$(BUILDDIR)/%.t.a.c: %.c $(TESTS)
535	./scripts/test.py -c $(TESTS) -s $< $(TESTCFLAGS) -o $@
536
537$(BUILDDIR)/%.b.a.c: %.toml
538	./scripts/bench.py -c $< $(BENCHCFLAGS) -o $@
539
540$(BUILDDIR)/%.b.a.c: %.c $(BENCHES)
541	./scripts/bench.py -c $(BENCHES) -s $< $(BENCHCFLAGS) -o $@
542
543## Clean everything
544.PHONY: clean
545clean:
546	rm -f $(BUILDDIR)/lfs
547	rm -f $(BUILDDIR)/liblfs.a
548	rm -f $(BUILDDIR)/lfs.code.csv
549	rm -f $(BUILDDIR)/lfs.data.csv
550	rm -f $(BUILDDIR)/lfs.stack.csv
551	rm -f $(BUILDDIR)/lfs.structs.csv
552	rm -f $(BUILDDIR)/lfs.cov.csv
553	rm -f $(BUILDDIR)/lfs.perf.csv
554	rm -f $(BUILDDIR)/lfs.perfbd.csv
555	rm -f $(BUILDDIR)/lfs.test.csv
556	rm -f $(BUILDDIR)/lfs.bench.csv
557	rm -f $(OBJ)
558	rm -f $(DEP)
559	rm -f $(ASM)
560	rm -f $(CI)
561	rm -f $(TEST_RUNNER)
562	rm -f $(TEST_A)
563	rm -f $(TEST_C)
564	rm -f $(TEST_OBJ)
565	rm -f $(TEST_DEP)
566	rm -f $(TEST_CI)
567	rm -f $(TEST_GCNO)
568	rm -f $(TEST_GCDA)
569	rm -f $(TEST_PERF)
570	rm -f $(TEST_TRACE)
571	rm -f $(TEST_CSV)
572	rm -f $(BENCH_RUNNER)
573	rm -f $(BENCH_A)
574	rm -f $(BENCH_C)
575	rm -f $(BENCH_OBJ)
576	rm -f $(BENCH_DEP)
577	rm -f $(BENCH_CI)
578	rm -f $(BENCH_GCNO)
579	rm -f $(BENCH_GCDA)
580	rm -f $(BENCH_PERF)
581	rm -f $(BENCH_TRACE)
582	rm -f $(BENCH_CSV)
583