Makefile 14 KB

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