Makefile 6.1 KB

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