Makefile 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. ifdef BUILDDIR
  2. # make sure BUILDDIR ends with a slash
  3. override BUILDDIR := $(BUILDDIR)/
  4. # bit of a hack, but we want to make sure BUILDDIR directory structure
  5. # is correct before any commands
  6. $(if $(findstring n,$(MAKEFLAGS)),, $(shell mkdir -p \
  7. $(BUILDDIR) \
  8. $(BUILDDIR)bd \
  9. $(BUILDDIR)tests))
  10. endif
  11. # overridable target/src/tools/flags/etc
  12. ifneq ($(wildcard test.c main.c),)
  13. TARGET ?= $(BUILDDIR)lfs
  14. else
  15. TARGET ?= $(BUILDDIR)lfs.a
  16. endif
  17. CC ?= gcc
  18. AR ?= ar
  19. SIZE ?= size
  20. CTAGS ?= ctags
  21. NM ?= nm
  22. LCOV ?= lcov
  23. SRC ?= $(wildcard *.c)
  24. OBJ := $(SRC:%.c=$(BUILDDIR)%.o)
  25. DEP := $(SRC:%.c=$(BUILDDIR)%.d)
  26. ASM := $(SRC:%.c=$(BUILDDIR)%.s)
  27. CGI := $(SRC:%.c=$(BUILDDIR)%.ci)
  28. ifdef DEBUG
  29. override CFLAGS += -O0 -g3
  30. else
  31. override CFLAGS += -Os
  32. endif
  33. ifdef TRACE
  34. override CFLAGS += -DLFS_YES_TRACE
  35. endif
  36. override CFLAGS += -I.
  37. override CFLAGS += -std=c99 -Wall -pedantic
  38. override CFLAGS += -Wextra -Wshadow -Wjump-misses-init -Wundef
  39. ifdef VERBOSE
  40. override TESTFLAGS += -v
  41. override CALLSFLAGS += -v
  42. override CODEFLAGS += -v
  43. override DATAFLAGS += -v
  44. override STACKFLAGS += -v
  45. override COVERAGEFLAGS += -v
  46. endif
  47. ifdef EXEC
  48. override TESTFLAGS += --exec="$(EXEC)"
  49. endif
  50. ifdef BUILDDIR
  51. override TESTFLAGS += --build-dir="$(BUILDDIR:/=)"
  52. override CALLSFLAGS += --build-dir="$(BUILDDIR:/=)"
  53. override CODEFLAGS += --build-dir="$(BUILDDIR:/=)"
  54. override DATAFLAGS += --build-dir="$(BUILDDIR:/=)"
  55. override STACKFLAGS += --build-dir="$(BUILDDIR:/=)"
  56. override COVERAGEFLAGS += --build-dir="$(BUILDDIR:/=)"
  57. endif
  58. ifneq ($(NM),nm)
  59. override CODEFLAGS += --nm-tool="$(NM)"
  60. override DATAFLAGS += --nm-tool="$(NM)"
  61. endif
  62. override CODEFLAGS += -S
  63. override DATAFLAGS += -S
  64. override STACKFLAGS += -S
  65. override COVERAGEFLAGS += -s
  66. # commands
  67. .PHONY: all build
  68. all build: $(TARGET)
  69. .PHONY: asm
  70. asm: $(ASM)
  71. .PHONY: size
  72. size: $(OBJ)
  73. $(SIZE) -t $^
  74. .PHONY: tags
  75. tags:
  76. $(CTAGS) --totals --c-types=+p $(shell find -H -name '*.h') $(SRC)
  77. .PHONY: code
  78. code: $(OBJ)
  79. ./scripts/code.py $^ $(CODEFLAGS)
  80. .PHONY: data
  81. data: $(OBJ)
  82. ./scripts/data.py $^ $(DATAFLAGS)
  83. .PHONY: calls
  84. calls: $(CGI)
  85. ./scripts/calls.py $^ $(CALLSFLAGS)
  86. .PHONY: stack
  87. stack: $(CGI)
  88. ./scripts/stack.py $^ $(STACKFLAGS)
  89. .PHONY: test
  90. test:
  91. ./scripts/test.py $(TESTFLAGS)
  92. .SECONDEXPANSION:
  93. test%: tests/test$$(firstword $$(subst \#, ,%)).toml
  94. ./scripts/test.py $@ $(TESTFLAGS)
  95. .PHONY: coverage
  96. coverage:
  97. ./scripts/coverage.py $(BUILDDIR)tests/*.toml.info $(COVERAGEFLAGS)
  98. # rules
  99. -include $(DEP)
  100. .SUFFIXES:
  101. $(BUILDDIR)lfs: $(OBJ)
  102. $(CC) $(CFLAGS) $^ $(LFLAGS) -o $@
  103. $(BUILDDIR)%.a: $(OBJ)
  104. $(AR) rcs $@ $^
  105. $(BUILDDIR)%.o: %.c
  106. $(CC) -c -MMD $(CFLAGS) $< -o $@
  107. $(BUILDDIR)%.s: %.c
  108. $(CC) -S $(CFLAGS) $< -o $@
  109. $(BUILDDIR)%.ci: %.c
  110. $(CC) -c -MMD -fcallgraph-info=su $(CFLAGS) $< -o $(@:.ci=.o)
  111. # clean everything
  112. .PHONY: clean
  113. clean:
  114. rm -f $(TARGET)
  115. rm -f $(OBJ)
  116. rm -f $(CGI)
  117. rm -f $(DEP)
  118. rm -f $(ASM)
  119. rm -f $(BUILDDIR)tests/*.toml.*