Makefile 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. # Makefile
  2. #
  3. DATETIME := `date +'%y%m%d-%H%M'`
  4. MAKEFILEPATH := $(strip $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))))
  5. ROOTPATH := $(shell git rev-parse --show-toplevel)
  6. COMMANDLINE := $(shell ps -o args= $$PPID)
  7. ARCHS := $(shell ls $(ROOTPATH)/Makefiles/Makefile.conf.* | grep -v base | sed 's/.*Makefile\.conf\.//g')
  8. ARCHS += any
  9. ARCH := $(filter $(ARCHS),$(MAKECMDGOALS))
  10. MAKECMDGOALS := $(filter-out $(ARCH),$(MAKECMDGOALS))
  11. ARCHS := $(filter-out any,$(ARCHS))
  12. ifeq ($(ARCH),)
  13. ARCH := x86-64
  14. endif
  15. ifeq (,$(findstring -S,$(COMMANDLINE)))
  16. ifneq ($(ARCH),)
  17. $(info ARCH: $(ARCH))
  18. endif
  19. endif
  20. -include $(ROOTPATH)/Makefiles/Makefile.conf.$(ARCH)
  21. -include $(ROOTPATH)/Makefiles/Makefile.conf.base
  22. -include $(ROOTPATH)/Makefile.conf
  23. PID := $(shell echo $$$$)
  24. PREFIX = nice -n 19 /usr/bin/time --format='%E (%U)' -o /dev/shm/t-$(PID)
  25. POSTFIX = && cat /dev/shm/t-$(PID) | xargs -I "%" echo -en '\033[1A\033[100D\033[60C' "%\n" && rm -f /dev/shm/t-$(PID)
  26. ARNAME = $(notdir $(CURDIR)).a.$(ARCH)_
  27. SUBDIRS := $(wildcard */.)
  28. SUBDIRS := $(foreach dir,$(SUBDIRS),$(subst /.,,$(dir)))
  29. FILTER = crash% doc% include% lib% Libraries% Makefiles%
  30. SUBDIRS := $(filter-out $(FILTER),$(SUBDIRS))
  31. SUBDIRARS = $(foreach dir,$(SUBDIRS),$(dir)/$(dir).a)
  32. LOCALSOURCES = $(wildcard *.cpp *.cc)
  33. LOCALOBJECTS := $(LOCALSOURCES:.cpp=.o.$(ARCH))
  34. LOCALOBJECTS := $(LOCALOBJECTS:.cc=.o.$(ARCH))
  35. LOCALDEPENDS = $(LOCALOBJECTS:.o.$(ARCH)=.d.$(ARCH))
  36. SOURCES = $(wildcard *.cpp */*.cpp */*/*.cpp */*/*/*.cpp)
  37. FILTER = Libraries%
  38. SOURCES := $(filter-out $(FILTER),$(SOURCES))
  39. OBJECTS = $(SOURCES:.cpp=.o.$(ARCH))
  40. DEPENDS = $(OBJECTS:.o.$(ARCH)=.d.$(ARCH))
  41. TARGETS =
  42. define build_target_library_arch
  43. $(eval $@_DATETIME := $(DATETIME))
  44. @echo -n " [AR] $(1)\n"
  45. @$(PREFIX) $(AR) -crs $(1) $(2) $(POSTFIX)
  46. @mkdir -p $(ROOTPATH)/lib/$(ARCH)
  47. @mv $(1) $$(echo $(ROOTPATH)/lib/$(ARCH)/lib$(1) | sed 's/\.$(ARCH)//g')
  48. endef
  49. define build_target_arch
  50. $(eval $@_DATETIME := $(DATETIME))
  51. @echo -n " [LD] $(1)\n"
  52. @$(PREFIX) $(CC) -o $(1) $(2) $(LFLAGS) $(CFLAGS) $(POSTFIX)
  53. @$(OBJCOPY) --only-keep-debug $(1) $(DEBUGDIR)/$(1)-$($@_DATETIME).debug
  54. @$(STRIP) $(SFLAGS) $(1)
  55. @$(OBJCOPY) --add-gnu-debuglink="$(DEBUGDIR)/$(1)-$($@_DATETIME).debug" $(1)
  56. @chmod -x $(DEBUGDIR)/$(1)-$($@_DATETIME).debug
  57. endef
  58. define build_target
  59. @if [ "$(ARCH)" = "any" ]; then \
  60. for arch in $(ARCHS); do \
  61. echo "ARCH: $$arch"; \
  62. $(MAKE) -s -S $(1) $$arch; \
  63. done; \
  64. true; \
  65. else \
  66. $(MAKE) -s -S $(1).$(ARCH) $(ARCH); \
  67. fi
  68. endef
  69. $(LOCALOBJECTS): | $(SUBDIRS)
  70. $(OBJECTS): | $(SUBDIRS)
  71. artifacts: $(LOCALOBJECTS)
  72. .DEFAULT_GOAL := artifacts
  73. -include Makefile.target
  74. ifneq ($(MAKECMDGOALS),clean)
  75. -include $(LOCALDEPENDS)
  76. endif
  77. %.d.$(ARCH): %.cpp
  78. @if [ "$(ARCH)" != "any" ]; then \
  79. depth=$(MAKELEVEL); \
  80. while [ $${depth} -gt 0 ] ; do \
  81. echo -n " "; \
  82. depth=`expr $$depth - 1`; \
  83. done; \
  84. true; \
  85. echo -n " [MM] $@\n"; \
  86. $(PREFIX) $(CC) $(CFLAGS) $< -MM -MT $(@:.d.$(ARCH)=.o.$(ARCH)) >$@ $(POSTFIX); \
  87. fi
  88. %.o.$(ARCH): %.cpp
  89. @depth=$(MAKELEVEL); \
  90. while [ $${depth} -gt 0 ] ; do \
  91. echo -n " "; \
  92. depth=`expr $$depth - 1`; \
  93. done; \
  94. true
  95. @echo -n " [CC] $@\n"
  96. @$(PREFIX) $(CC) -c $(CFLAGS) $< -o $@ $(POSTFIX)
  97. %.d.$(ARCH): %.cc
  98. @if [ "$(ARCH)" != "any" ]; then \
  99. depth=$(MAKELEVEL); \
  100. while [ $${depth} -gt 0 ] ; do \
  101. echo -n " "; \
  102. depth=`expr $$depth - 1`; \
  103. done; \
  104. true; \
  105. echo -n " [MM] $@\n"; \
  106. $(PREFIX) $(CC) $(CFLAGS) $< -MM -MT $(@:.d.$(ARCH)=.o.$(ARCH)) >$@ $(POSTFIX); \
  107. fi
  108. %.o.$(ARCH): %.cc
  109. @depth=$(MAKELEVEL); \
  110. while [ $${depth} -gt 0 ] ; do \
  111. echo -n " "; \
  112. depth=`expr $$depth - 1`; \
  113. done; \
  114. true
  115. @echo -n " [CC] $@\n"
  116. @$(PREFIX) $(CC) -c $(CFLAGS) $< -o $@ $(POSTFIX)
  117. $(ARNAME): $(SUBDIRS) $(LOCALOBJECTS)
  118. @depth=$(MAKELEVEL); \
  119. while [ $${depth} -gt 0 ] ; do \
  120. echo -n " "; \
  121. depth=`expr $$depth - 1`; \
  122. done; \
  123. true
  124. @echo -n " [AR] $@\n"
  125. @$(PREFIX) $(AR) rcuT $@ $(LOCALOBJECTS) $(SUBDIRARS) $(POSTFIX)
  126. .PHONY: $(SUBDIRS)
  127. $(SUBDIRS):
  128. @depth=$(MAKELEVEL); \
  129. while [ $${depth} -gt 0 ] ; do \
  130. echo -n " "; \
  131. depth=`expr $$depth - 1`; \
  132. done; \
  133. true
  134. @echo " <$@>"
  135. @$(MAKE) -s -S -C $@ artifacts $(ARCH)
  136. @depth=$(MAKELEVEL); \
  137. while [ $${depth} -gt 0 ] ; do \
  138. echo -n " "; \
  139. depth=`expr $$depth - 1`; \
  140. done; \
  141. true
  142. @echo " </$@>"
  143. .PHONY: all
  144. all: $(TARGETS)
  145. .PHONY: clean
  146. clean:
  147. @if [ "$(ARCH)" = "any" ]; then \
  148. for arch in $(ARCHS); do \
  149. echo "ARCH: $$arch"; \
  150. $(MAKE) -s -S $(MAKECMDGOALS) $$arch; \
  151. done; \
  152. true; \
  153. else \
  154. for dir in $(SUBDIRS); do \
  155. depth=$(MAKELEVEL); \
  156. while [ $${depth} -gt 0 ] ; do \
  157. echo -n " "; \
  158. depth=`expr $$depth - 1`; \
  159. done; \
  160. echo " <$$dir>"; \
  161. $(MAKE) -s -S -C $$dir $@ $(ARCH); \
  162. while [ $${depth} -gt 0 ] ; do \
  163. echo -n " "; \
  164. depth=`expr $$depth - 1`; \
  165. done; \
  166. echo " </$$dir>"; \
  167. done; \
  168. for target in $(TARGETS); do \
  169. rm -f $$target.$(ARCH); \
  170. done; \
  171. rm -f lib/$(ARCH)/*; \
  172. true; \
  173. fi
  174. @rm -f $(LOCALOBJECTS) $(LOCALDEPENDS) || true
  175. .PHONY: cleandeps
  176. cleandeps:
  177. @if [ "$(ARCH)" = "any" ]; then \
  178. for arch in $(ARCHS); do \
  179. echo "ARCH: $$arch"; \
  180. $(MAKE) -s -S $(MAKECMDGOALS) $$arch; \
  181. done; \
  182. true; \
  183. else \
  184. for dir in $(SUBDIRS); do \
  185. depth=$(MAKELEVEL); \
  186. while [ $${depth} -gt 0 ] ; do \
  187. echo -n " "; \
  188. depth=`expr $$depth - 1`; \
  189. done; \
  190. echo " <$$dir>"; \
  191. $(MAKE) -s -S -C $$dir $@ $(ARCH); \
  192. while [ $${depth} -gt 0 ] ; do \
  193. echo -n " "; \
  194. depth=`expr $$depth - 1`; \
  195. done; \
  196. echo " </$$dir>"; \
  197. done; \
  198. for target in $(TARGETS); do \
  199. rm -f $$target.$(ARCH); \
  200. done; \
  201. true; \
  202. fi
  203. @rm -f $(LOCALDEPENDS) || true
  204. .PHONY: $(ARCH)
  205. $(ARCH):
  206. @if [ "$(words $(MAKECMDGOALS))" = "0" ]; then \
  207. if [ "$(ARCH)" = "any" ]; then \
  208. for arch in $(ARCHS); do \
  209. echo "ARCH: $$arch"; \
  210. $(MAKE) -s -S $(.DEFAULT_GOAL) $$arch; \
  211. done; \
  212. true; \
  213. else \
  214. $(MAKE) -s -S $(.DEFAULT_GOAL) $(ARCH); \
  215. fi \
  216. fi