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