Makefile 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. @if [ -e "$@/Makefile" ]; then \
  129. depth=$(MAKELEVEL); \
  130. while [ $${depth} -gt 0 ] ; do \
  131. echo -n " "; \
  132. depth=`expr $$depth - 1`; \
  133. done; \
  134. true; \
  135. echo " <$@>"; \
  136. $(MAKE) -s -S -C $@ artifacts $(ARCH); \
  137. depth=$(MAKELEVEL); \
  138. while [ $${depth} -gt 0 ] ; do \
  139. echo -n " "; \
  140. depth=`expr $$depth - 1`; \
  141. done; \
  142. true; \
  143. echo " </$@>"; \
  144. fi
  145. .PHONY: all
  146. all: $(TARGETS)
  147. .PHONY: clean
  148. clean:
  149. @if [ "$(ARCH)" = "any" ]; then \
  150. for arch in $(ARCHS); do \
  151. echo "ARCH: $$arch"; \
  152. $(MAKE) -s -S $(MAKECMDGOALS) $$arch; \
  153. done; \
  154. true; \
  155. else \
  156. for dir in $(SUBDIRS); do \
  157. if [ -e "$$dir/Makefile" ]; then \
  158. depth=$(MAKELEVEL); \
  159. while [ $${depth} -gt 0 ] ; do \
  160. echo -n " "; \
  161. depth=`expr $$depth - 1`; \
  162. done; \
  163. echo " <$$dir>"; \
  164. $(MAKE) -s -S -C $$dir $@ $(ARCH); \
  165. while [ $${depth} -gt 0 ] ; do \
  166. echo -n " "; \
  167. depth=`expr $$depth - 1`; \
  168. done; \
  169. echo " </$$dir>"; \
  170. fi \
  171. done; \
  172. for target in $(TARGETS); do \
  173. rm -f $$target.$(ARCH); \
  174. done; \
  175. rm -f lib/$(ARCH)/*; \
  176. true; \
  177. fi
  178. @rm -f $(LOCALOBJECTS) $(LOCALDEPENDS) || true
  179. .PHONY: cleandeps
  180. cleandeps:
  181. @if [ "$(ARCH)" = "any" ]; then \
  182. for arch in $(ARCHS); do \
  183. echo "ARCH: $$arch"; \
  184. $(MAKE) -s -S $(MAKECMDGOALS) $$arch; \
  185. done; \
  186. true; \
  187. else \
  188. for dir in $(SUBDIRS); do \
  189. if [ -e "$$dir/Makefile" ]; then \
  190. depth=$(MAKELEVEL); \
  191. while [ $${depth} -gt 0 ] ; do \
  192. echo -n " "; \
  193. depth=`expr $$depth - 1`; \
  194. done; \
  195. echo " <$$dir>"; \
  196. $(MAKE) -s -S -C $$dir $@ $(ARCH); \
  197. while [ $${depth} -gt 0 ] ; do \
  198. echo -n " "; \
  199. depth=`expr $$depth - 1`; \
  200. done; \
  201. echo " </$$dir>"; \
  202. fi \
  203. done; \
  204. for target in $(TARGETS); do \
  205. rm -f $$target.$(ARCH); \
  206. done; \
  207. true; \
  208. fi
  209. @rm -f $(LOCALDEPENDS) || true
  210. .PHONY: $(ARCH)
  211. $(ARCH):
  212. @if [ "$(words $(MAKECMDGOALS))" = "0" ]; then \
  213. if [ "$(ARCH)" = "any" ]; then \
  214. for arch in $(ARCHS); do \
  215. echo "ARCH: $$arch"; \
  216. $(MAKE) -s -S $(.DEFAULT_GOAL) $$arch; \
  217. done; \
  218. true; \
  219. else \
  220. $(MAKE) -s -S $(.DEFAULT_GOAL) $(ARCH); \
  221. fi \
  222. fi