Makefile 14 KB

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