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