Makefile 14 KB

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