Makefile模板(改进)
Makefile模板:1) 模块文件(不含main函数) 分类存放于src/xxx目录下面。例如: src/conf/conf.c;src/util/pool.c
2) 公共头文件存放于 src/include目录,模块私有头文件放置于模块目录src/xxx目录下面
3) 所有的含有main入口点的源代码文件放置于src/目录下面,例如 src/main.c, src/test.c等。
4) 支持增加自定义目标,定义好自己的目标后就能够 编译出可执行文件(见模板最后示例). bin/main, bin/test等。
5) 支持依赖自动推导。
6) 使用时,请自行修改变量: CC、LINK、 SRC_FILE_TYPE、 MAIN_FILE、 SRC_MODULES、 LIBS、 INCLUDE_PATH 即可。
============================================
#================================================# User define parameter#PROGRAM = helloCC = g++LINK = g++CFLAGS = -Wall #LDFLAGS = SRC_FILE_TYPE = cxxSRC_DIR := srcLIBS := -lpthreadINCLUDE_PATH := -I$(SRC_DIR)/include #define main source file in which "main()" function exist!#MAIN_FILE = mainMAIN_FILE = $(PROGRAM)# module define which act as subdirectory reside in "src" directory#SRC_MODULES = main conf ca comm pm utils ic reg timer SRC_MODULES = main #==================================================# Optional User define parameter##program build mode is: debug/releaseBUILD_MODE := debug#BUILD_MODE := release#Auto dependent generated? (YES/NO)#AUTO_DEPENDENT = YES#AUTO_DEPENDENT = NO#=================================================#directory defineBUILD_DIR := ./binDEPS_DIR := $(BUILD_DIR)/depend#================================================= #get out put directoryifeq ($(BUILD_MODE),debug)OUTPUT_DIR := $(BUILD_DIR)/debugCFLAGS += -g -O0elseifeq ($(BUILD_MODE),release)OUTPUT_DIR := $(BUILD_DIR)/releaseCFLAGS += -O3else$(error "BUILD_MODE error!(release/debug)")endifendif##set targettarget = $(PROGRAM)#add path#VPATH = $(shell find $(SRC_DIR) -type d)#VPATH = $(SRC_DIR)VPATH += $(addprefix $(SRC_DIR)/, $(SRC_MODULES))#FIND_SRC_FILES = $(shell find $(SRC_DIR) -maxdepth 1 -name "*.$(SRC_FILE_TYPE)")#SRC_FILES = $(notdir $(FIND_SRC_FILES) )FIND_SRC_FILES = $(foreach dir, $(VPATH), $(wildcard $(dir)/*.$(SRC_FILE_TYPE)))SRC_FILES = $(notdir $(FIND_SRC_FILES) )OBJ_FILES = $(SRC_FILES:.$(SRC_FILE_TYPE)=.o)#auto depend file?ifeq ($(AUTO_DEPENDENT) ,YES)DEP_FILES = $(SRC_FILES:.$(SRC_FILE_TYPE)=.d)endifOUTPUT_OBJS = $(addprefix $(OUTPUT_DIR)/,$(OBJ_FILES))OUTPUT_DEPS = $(addprefix $(DEPS_DIR)/,$(DEP_FILES))#INCLUDE_PATH += $(addprefix -I , $(VPATH))##======start of init shell ======#### exec init shell command$(shell mkdir -p "$(OUTPUT_DIR)")$(shell mkdir -p "$(DEPS_DIR)")#$(foreach dir, $(SRC_MODULES),$(shell mkdir -p "$(DEPS_DIR)/$(dir)"))##======= end of init ==============###add target.PHONY:allall: $(BUILD_DIR)/$(target).PHONY: helphelp:@echo "make's target is:"@echo "make all --make all and generate target!"@echo "make run --make all and run the target! "@echo "make clean --make clean the object files!"@echo "make cleanall --make clean all ,clean everything!"@echo "Test:"@echo "make test --maketest target!"@echo "make testrun--make test target and run it!"@echo "make help --this help!"@echo " "@echo " "## #link all objs and libs$(BUILD_DIR)/$(target): $(OUTPUT_DIR)/$(MAIN_FILE).o $(OUTPUT_DEPS) $(OUTPUT_OBJS) $(LINK) $(LIB_PATH)$< $(OUTPUT_OBJS) $(CFLAGS) -o $@ $(LIBS)@echo "Make '$(BUILD_DIR)/$(target)' finished!" #compile source files into object files$(OUTPUT_DIR)/%.o: %.$(SRC_FILE_TYPE) $(CC) $(CFLAGS) $(INCLUDE_PATH) -I $(basename $<) -c $< -o $@#src dir compiler$(OUTPUT_DIR)/%.o: $(SRC_DIR)/%.$(SRC_FILE_TYPE)$(CC) $(CFLAGS) $(INCLUDE_PATH) -c $< -o $@#$(DEPS_DIR)/%.d: %.$(SRC_FILE_TYPE)@echo -n "$(OUTPUT_DIR)/" > $@$(CC) -MM $(INCLUDE_PATH) $< >> $@.PHONY:testtest: $(OUTPUT_DIR)/test.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS).PHONY:testruntestrun: test$(BUILD_DIR)/test.PHONY:runrun: $(BUILD_DIR)/$(target)$(BUILD_DIR)/$(target).PHONY:cleanclean:-rm -rf $(OUTPUT_DIR)-rm -f $(BUILD_DIR)/$(target).PHONY:cleanallcleanall:clean-rm -rf $(BUILD_DIR)/*#dep files-include $(OUTPUT_DEPS)#=========== user custom target define here ===================================#.PHONY:test#test1: $(OUTPUT_DIR)/test1.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)#$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)#.PHONY:test#test2: $(OUTPUT_DIR)/test2.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)#$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)#.PHONY:test#test3: $(OUTPUT_DIR)/test3.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)#$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)
页:
[1]