Makefile 14 KB

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