Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .PHONY: all
- all:
- include Project.mk
- -include Common.mk
- CXXFLAGS += -I$(WORK_PATH)/src
- # Generator for target object, source, and include files
- define GEN_target_info
- TARGETS := $(wildcard $(2)/*.cpp)
- endef
- # Generator for list of resultant object files, source, includes, etc.
- define GEN_info_schema
- $(1)_SRC := $(patsubst $(1)/%.$(SCHEMA_EXT),$(WORK_PATH)/src/$(1)/%.h,$(wildcard $(1)/*.$(SCHEMA_EXT)))
- $(1)_OBJ := $(patsubst $(WORK_PATH)/src/$(1)/%.cpp,$(WORK_PATH)/obj/$(1)/%.o,$(wildcard $(WORK_PATH)/src/$(1)/*.cpp))
- ALL_SCHEMA_SRC += $$($(1)_SRC)
- ALL_SCHEMA_RULES += $(WORK_PATH)/src/$(1).rules
- CORE_LIB += $(WORK_PATH)/obj/$(1)gen.a
- endef
- define GEN_info_source
- $(2)_SRC := $(wildcard $(2)/*.$(1))
- $(2)_OBJ := $(patsubst $(2)/%.$(1),$(WORK_PATH)/obj/$(2)/%.o,$(wildcard $(2)/*.$(1)))
- $(2)_DEP := $(patsubst $(2)/%.$(1),$(WORK_PATH)/obj/$(2)/%.$(1).d,$(wildcard $(2)/*.$(1)))
- ALL_SRC += $$($(2)_SRC)
- ALL_OBJ += $$($(2)_OBJ)
- ALL_DEP += $$($(2)_DEP)
- endef
- define GEN_info_header
- $(2)_INC := $(wildcard $(2)/*.$(1))
- ALL_INC += $$($(2)_INC)
- endef
- define GEN_info_target
- TARGET_BIN := $(patsubst $(2)/%.$(1),%,$(wildcard $(2)/*.$(1)))
- TARGET_BIN_FULLPATH := $(patsubst $(2)/%.$(1),$(BIN_PATH)/%,$(wildcard $(2)/*.$(1)))
- endef
- define GEN_info_core
- CORE_SRC += $($(1)_SRC)
- CORE_OBJ += $($(1)_OBJ)
- CORE_DEP += $($(1)_DEP)
- CORE_INC += $($(1)_INC)
- CORE_LIB += $(WORK_PATH)/obj/$(1).a
- endef
- define GEN_info_submodule
- CXXFLAGS_LATE += -I$(1)/obj
- LDFLAGS_LATE += -L$(1)/obj -l$(1)
- endef
- ALL_BUILDABLE := $(MODULES) $(TARGETS)
- $(foreach where,$(SCHEMA),$(eval $(call GEN_info_schema,$(where))))
- $(foreach where,$(ALL_BUILDABLE),$(eval $(call GEN_info_source,cpp,$(where))))
- $(foreach where,$(ALL_BUILDABLE),$(eval $(call GEN_info_header,h,$(where))))
- $(foreach where,$(MODULES),$(eval $(call GEN_info_core,$(where))))
- $(foreach where,$(TARGETS),$(eval $(call GEN_info_target,cpp,$(where))))
- $(foreach what,$(SUBMODULES),$(eval $(call GEN_info_submodule,$(what))))
- define GEN_rules_schema
- $(WORK_PATH)/src/$(1).rules : $$($(1)_SRC) $(WORK_PATH)/src/.depend
- @touch $$@
- $(WORK_PATH)/src/$(1)/%.h : $(1)/%.$(SCHEMA_EXT) $(WORK_PATH)/src/$(1)/.depend $(1)/autogen
- $(1)/autogen $$< $(WORK_PATH)/src/$(1)/
- endef
- define GEN_rules_cpp
- $(WORK_PATH)/obj/$(1)/%.o : $(2)$(1)/%.cpp $(WORK_PATH)/obj/$(1)/.depend | $(WORK_PATH)/generated.mk
- $(CXX) $$< $(CXXFLAGS) $(CXXFLAGS_LATE) -MM -MF $$(@:.o=.cpp.d)
- @sed -i.bu "1s/^/$(WORK_PATH)\/obj\/$(1)\//" $$(@:.o=.cpp.d)
- $(CXX) $$< -c $(CXXFLAGS) $(CXXFLAGS_LATE) -o $$@
- endef
- define GEN_rules_archive
- $(WORK_PATH)/obj/$(2).a : $$($(1)_OBJ) $(WORK_PATH)/obj/.depend
- ar rs $$@ $$($(1)_OBJ)
- endef
- define GEN_rules_target
- $(BIN_PATH)/$(1) : $(WORK_PATH)/obj/$(TARGETS)/$(1).o $(CORE_LIB)
- @mkdir -p $(BIN_PATH)
- $(CXX) -o $(BIN_PATH)/$(1) $(LDFLAGS) \
- $(WORK_PATH)/obj/$(TARGETS)/$(1).o $(CORE_LIB) $(LDFLAGS_LATE)
- endef
- ifdef LIB_NAME
- TARGET_LIB := $(WORK_PATH)/lib$(LIB_NAME).a
- $(TARGET_LIB) : $(CORE_LIB) $(ALL_PUBLIC)
- ifdef LIB_INCLUDE
- @mkdir -p $(WORK_PATH)/obj/$(LIB_NAME)
- cp -Lr $(LIB_INCLUDE)/* $(WORK_PATH)/obj/$(LIB_NAME)/
- endif
- @rm -f $(TARGET_LIB)
- ar rs $@ $(CORE_OBJ)
- .PHONY: lib
- lib : $(TARGET_LIB)
- endif
- all : $(TARGET_BIN_FULLPATH) $(TARGET_LIB)
- .PHONY: clean
- clean :
- rm -fr $(WORK_PATH)/*
- .PHONY: lines
- lines :
- @echo "Project contains" `ls */*.h | wc -l` "header files," `ls */*.cpp | wc -l` "source files"
- @echo -ne "\ttotaling" `cat */*.h */*.cpp */autogen | wc -l` "lines.\n"
- .PHONY: todo
- todo :
- @grep -In TODO $(ALL_SRC) $(ALL_INC)
- .PHONY: ycm
- ycm: .ycm_extra_conf.py
- .ycm_extra_conf.py :
- @echo "import os" > .ycm_extra_conf.py
- @echo "def FlagsForFile(filename, **kwargs):" >> .ycm_extra_conf.py
- @echo " extension = os.path.splitext(filename)[1]" >> .ycm_extra_conf.py
- @echo " flags = \"$(CXXFLAGS) $(CXXFLAGS_LATE) -x c++\".split()" >> .ycm_extra_conf.py
- @echo " return { 'flags': flags, 'do_cache': True }" >> .ycm_extra_conf.py
- -include $(ALL_DEP)
- $(foreach where,$(MODULES),$(eval $(call GEN_rules_cpp,$(where),)))
- $(foreach where,$(MODULES),$(eval $(call GEN_rules_archive,$(where),$(where))))
- $(foreach where,$(SCHEMA),$(eval $(call GEN_rules_cpp,$(where),$(WORK_PATH)/src/)))
- $(foreach where,$(SCHEMA),$(eval $(call GEN_rules_archive,$(where),$(where)gen)))
- $(foreach where,$(TARGETS),$(eval $(call GEN_rules_cpp,$(where),)))
- $(foreach where,$(TARGET_BIN),$(eval $(call GEN_rules_target,$(where))))
- # Generate folder for compiled objects, as well as handling basic depends
- .PRECIOUS: $(WORK_PATH)/obj/%/.depend
- .PRECIOUS: $(ALL_DEP)
- $(WORK_PATH)/obj/%/.depend :
- -@mkdir -p $(@D)
- @touch $@
- .PRECIOUS: $(WORK_PATH)/obj/.depend
- $(WORK_PATH)/obj/.depend :
- -@mkdir -p $(@D)
- @touch $@
- .PRECIOUS: $(WORK_PATH)/src/%/.depend
- $(WORK_PATH)/src/%/.depend :
- -@mkdir -p $(@D)
- @touch $@
- .PRECIOUS: $(WORK_PATH)/src/.depend
- $(WORK_PATH)/src/.depend :
- -@mkdir -p $(@D)
- @touch $@
- # Handle code generation build steps
- $(foreach where,$(SCHEMA),$(eval $(call GEN_rules_schema,$(where))))
- $(WORK_PATH)/generated.mk : $(ALL_SCHEMA_RULES)
- @touch $@
- -include $(WORK_PATH)/generated.mk
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement