Advertisement
Guest User

Untitled

a guest
Aug 27th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. .PHONY: all
  2. all:
  3.  
  4. include Project.mk
  5. -include Common.mk
  6.  
  7. CXXFLAGS += -I$(WORK_PATH)/src
  8.  
  9. # Generator for target object, source, and include files
  10.  
  11. define GEN_target_info
  12. TARGETS := $(wildcard $(2)/*.cpp)
  13. endef
  14.  
  15. # Generator for list of resultant object files, source, includes, etc.
  16.  
  17. define GEN_info_schema
  18. $(1)_SRC := $(patsubst $(1)/%.$(SCHEMA_EXT),$(WORK_PATH)/src/$(1)/%.h,$(wildcard $(1)/*.$(SCHEMA_EXT)))
  19. $(1)_OBJ := $(patsubst $(WORK_PATH)/src/$(1)/%.cpp,$(WORK_PATH)/obj/$(1)/%.o,$(wildcard $(WORK_PATH)/src/$(1)/*.cpp))
  20. ALL_SCHEMA_SRC += $$($(1)_SRC)
  21. ALL_SCHEMA_RULES += $(WORK_PATH)/src/$(1).rules
  22. CORE_LIB += $(WORK_PATH)/obj/$(1)gen.a
  23. endef
  24.  
  25. define GEN_info_source
  26. $(2)_SRC := $(wildcard $(2)/*.$(1))
  27. $(2)_OBJ := $(patsubst $(2)/%.$(1),$(WORK_PATH)/obj/$(2)/%.o,$(wildcard $(2)/*.$(1)))
  28. $(2)_DEP := $(patsubst $(2)/%.$(1),$(WORK_PATH)/obj/$(2)/%.$(1).d,$(wildcard $(2)/*.$(1)))
  29. ALL_SRC += $$($(2)_SRC)
  30. ALL_OBJ += $$($(2)_OBJ)
  31. ALL_DEP += $$($(2)_DEP)
  32. endef
  33.  
  34. define GEN_info_header
  35. $(2)_INC := $(wildcard $(2)/*.$(1))
  36. ALL_INC += $$($(2)_INC)
  37. endef
  38.  
  39. define GEN_info_target
  40. TARGET_BIN := $(patsubst $(2)/%.$(1),%,$(wildcard $(2)/*.$(1)))
  41. TARGET_BIN_FULLPATH := $(patsubst $(2)/%.$(1),$(BIN_PATH)/%,$(wildcard $(2)/*.$(1)))
  42. endef
  43.  
  44. define GEN_info_core
  45. CORE_SRC += $($(1)_SRC)
  46. CORE_OBJ += $($(1)_OBJ)
  47. CORE_DEP += $($(1)_DEP)
  48. CORE_INC += $($(1)_INC)
  49. CORE_LIB += $(WORK_PATH)/obj/$(1).a
  50. endef
  51.  
  52. define GEN_info_submodule
  53. CXXFLAGS_LATE += -I$(1)/obj
  54. LDFLAGS_LATE += -L$(1)/obj -l$(1)
  55. endef
  56.  
  57. ALL_BUILDABLE := $(MODULES) $(TARGETS)
  58. $(foreach where,$(SCHEMA),$(eval $(call GEN_info_schema,$(where))))
  59. $(foreach where,$(ALL_BUILDABLE),$(eval $(call GEN_info_source,cpp,$(where))))
  60. $(foreach where,$(ALL_BUILDABLE),$(eval $(call GEN_info_header,h,$(where))))
  61. $(foreach where,$(MODULES),$(eval $(call GEN_info_core,$(where))))
  62. $(foreach where,$(TARGETS),$(eval $(call GEN_info_target,cpp,$(where))))
  63.  
  64. $(foreach what,$(SUBMODULES),$(eval $(call GEN_info_submodule,$(what))))
  65.  
  66. define GEN_rules_schema
  67. $(WORK_PATH)/src/$(1).rules : $$($(1)_SRC) $(WORK_PATH)/src/.depend
  68. @touch $$@
  69.  
  70. $(WORK_PATH)/src/$(1)/%.h : $(1)/%.$(SCHEMA_EXT) $(WORK_PATH)/src/$(1)/.depend $(1)/autogen
  71. $(1)/autogen $$< $(WORK_PATH)/src/$(1)/
  72. endef
  73.  
  74. define GEN_rules_cpp
  75. $(WORK_PATH)/obj/$(1)/%.o : $(2)$(1)/%.cpp $(WORK_PATH)/obj/$(1)/.depend | $(WORK_PATH)/generated.mk
  76. $(CXX) $$< $(CXXFLAGS) $(CXXFLAGS_LATE) -MM -MF $$(@:.o=.cpp.d)
  77. @sed -i.bu "1s/^/$(WORK_PATH)\/obj\/$(1)\//" $$(@:.o=.cpp.d)
  78. $(CXX) $$< -c $(CXXFLAGS) $(CXXFLAGS_LATE) -o $$@
  79. endef
  80.  
  81. define GEN_rules_archive
  82. $(WORK_PATH)/obj/$(2).a : $$($(1)_OBJ) $(WORK_PATH)/obj/.depend
  83. ar rs $$@ $$($(1)_OBJ)
  84. endef
  85.  
  86. define GEN_rules_target
  87. $(BIN_PATH)/$(1) : $(WORK_PATH)/obj/$(TARGETS)/$(1).o $(CORE_LIB)
  88. @mkdir -p $(BIN_PATH)
  89. $(CXX) -o $(BIN_PATH)/$(1) $(LDFLAGS) \
  90. $(WORK_PATH)/obj/$(TARGETS)/$(1).o $(CORE_LIB) $(LDFLAGS_LATE)
  91. endef
  92.  
  93. ifdef LIB_NAME
  94. TARGET_LIB := $(WORK_PATH)/lib$(LIB_NAME).a
  95.  
  96. $(TARGET_LIB) : $(CORE_LIB) $(ALL_PUBLIC)
  97. ifdef LIB_INCLUDE
  98. @mkdir -p $(WORK_PATH)/obj/$(LIB_NAME)
  99. cp -Lr $(LIB_INCLUDE)/* $(WORK_PATH)/obj/$(LIB_NAME)/
  100. endif
  101. @rm -f $(TARGET_LIB)
  102. ar rs $@ $(CORE_OBJ)
  103.  
  104. .PHONY: lib
  105. lib : $(TARGET_LIB)
  106. endif
  107.  
  108. all : $(TARGET_BIN_FULLPATH) $(TARGET_LIB)
  109.  
  110. .PHONY: clean
  111. clean :
  112. rm -fr $(WORK_PATH)/*
  113.  
  114. .PHONY: lines
  115. lines :
  116. @echo "Project contains" `ls */*.h | wc -l` "header files," `ls */*.cpp | wc -l` "source files"
  117. @echo -ne "\ttotaling" `cat */*.h */*.cpp */autogen | wc -l` "lines.\n"
  118.  
  119. .PHONY: todo
  120. todo :
  121. @grep -In TODO $(ALL_SRC) $(ALL_INC)
  122.  
  123. .PHONY: ycm
  124. ycm: .ycm_extra_conf.py
  125.  
  126. .ycm_extra_conf.py :
  127. @echo "import os" > .ycm_extra_conf.py
  128. @echo "def FlagsForFile(filename, **kwargs):" >> .ycm_extra_conf.py
  129. @echo " extension = os.path.splitext(filename)[1]" >> .ycm_extra_conf.py
  130. @echo " flags = \"$(CXXFLAGS) $(CXXFLAGS_LATE) -x c++\".split()" >> .ycm_extra_conf.py
  131. @echo " return { 'flags': flags, 'do_cache': True }" >> .ycm_extra_conf.py
  132.  
  133. -include $(ALL_DEP)
  134. $(foreach where,$(MODULES),$(eval $(call GEN_rules_cpp,$(where),)))
  135. $(foreach where,$(MODULES),$(eval $(call GEN_rules_archive,$(where),$(where))))
  136. $(foreach where,$(SCHEMA),$(eval $(call GEN_rules_cpp,$(where),$(WORK_PATH)/src/)))
  137. $(foreach where,$(SCHEMA),$(eval $(call GEN_rules_archive,$(where),$(where)gen)))
  138.  
  139. $(foreach where,$(TARGETS),$(eval $(call GEN_rules_cpp,$(where),)))
  140. $(foreach where,$(TARGET_BIN),$(eval $(call GEN_rules_target,$(where))))
  141.  
  142. # Generate folder for compiled objects, as well as handling basic depends
  143.  
  144. .PRECIOUS: $(WORK_PATH)/obj/%/.depend
  145. .PRECIOUS: $(ALL_DEP)
  146. $(WORK_PATH)/obj/%/.depend :
  147. -@mkdir -p $(@D)
  148. @touch $@
  149.  
  150. .PRECIOUS: $(WORK_PATH)/obj/.depend
  151. $(WORK_PATH)/obj/.depend :
  152. -@mkdir -p $(@D)
  153. @touch $@
  154.  
  155. .PRECIOUS: $(WORK_PATH)/src/%/.depend
  156. $(WORK_PATH)/src/%/.depend :
  157. -@mkdir -p $(@D)
  158. @touch $@
  159.  
  160. .PRECIOUS: $(WORK_PATH)/src/.depend
  161. $(WORK_PATH)/src/.depend :
  162. -@mkdir -p $(@D)
  163. @touch $@
  164.  
  165. # Handle code generation build steps
  166.  
  167. $(foreach where,$(SCHEMA),$(eval $(call GEN_rules_schema,$(where))))
  168.  
  169. $(WORK_PATH)/generated.mk : $(ALL_SCHEMA_RULES)
  170. @touch $@
  171.  
  172. -include $(WORK_PATH)/generated.mk
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement