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