`
siwind
  • 浏览: 142470 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 = hello
CC = g++
LINK = g++
CFLAGS = -Wall 
#LDFLAGS = 

SRC_FILE_TYPE = cxx
SRC_DIR := src

LIBS := -lpthread
INCLUDE_PATH := -I$(SRC_DIR)/include 

#define main source file in which "main()" function exist!
#MAIN_FILE = main
MAIN_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/release
BUILD_MODE := debug
#BUILD_MODE := release

#Auto dependent generated? (YES/NO)
#AUTO_DEPENDENT = YES
#AUTO_DEPENDENT = NO

#=================================================
#directory define
BUILD_DIR := ./bin
DEPS_DIR := $(BUILD_DIR)/depend

#================================================= 
#get out put directory
ifeq ($(BUILD_MODE),debug)
OUTPUT_DIR := $(BUILD_DIR)/debug
CFLAGS += -g -O0

else
ifeq ($(BUILD_MODE),release)
OUTPUT_DIR := $(BUILD_DIR)/release
CFLAGS += -O3

else
$(error "BUILD_MODE error!(release/debug)")
endif
endif

##set target
target = $(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)
endif

OUTPUT_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:all
all: $(BUILD_DIR)/$(target)

.PHONY: help
help:
	@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     --  make  test 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:test
test: $(OUTPUT_DIR)/test.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)
	$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)
	

.PHONY:testrun
testrun: test
	$(BUILD_DIR)/test

.PHONY:run
run: $(BUILD_DIR)/$(target)
	$(BUILD_DIR)/$(target)

.PHONY:clean
clean:
	-rm -rf $(OUTPUT_DIR)
	-rm -f $(BUILD_DIR)/$(target)

.PHONY:cleanall
cleanall: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)






分享到:
评论

相关推荐

    Makefile模板示例

    Makefile模板示例;两个简单的Makefile模板和一个复杂的Makefile模板

    通用的makefile模板

    通用的makefile模板,支持模块化编译,支持多平台,支持多项目配置。 简单配置,只需添加源文件列表和指定编译目标,就可以直接编译。 支持添加test。 默认包含gtest测试样例

    linux开发Makefile模板

    使用Makefile模板,用户只需要根据需要配置头文件路径,库文件路径,编译器、目标文件名即可一键make,生成对应编译器平台的可执行程序

    makefile模板

    几个好用的makefile模板,稍加改动或不加改动就可以拿来自己用作makefile文件

    linux_ 几个常用makefile模板.pdf

    linux_ 几个常用makefile模板.pdf

    LINUX驱动Makefile模板[文].pdf

    LINUX驱动Makefile模板[文].pdf

    Linux动态库,静态库,exe的makefile模板

    创建动态库,静态库,exe文件的makefile模板,转Linux的同学可以看看,直接填充就可以了

    基本通用makefile模板

    基本通用makefile模板, 目录结构 ./src ./include ./lib。 makefile和*.c文件放在 ./src 目录, 头文件放在 ./include目录, 库文件放在 ./lib目录。不需要静态编译,取消 -static。 my_main_c 替换为你需要编译的...

    通用Makefile模板

    这是我自己制作的一个通用Makefile模板,你只需要像填空一下设置一些必要的编译器参数和源代码目录即可,其他复杂的依赖关系,目录文件等都会自动帮你生成,免去你的很多烦恼。 注意:每一个.c文件都会在对应的目录...

    Makefile模板 和我一起学习Makefile

    Makefile模板,linux下生手,半生不熟的人的好伙伴.照葫芦画瓢的好东西.

    Makefile.zip_Makefile模板_makefile

    通用Makefile模板,简单易用,自动生成依赖关系,使用时放到项目源码的顶级目录,根据提示然后填写相关信息,Makefile会自动处理依赖关系和头文件路径等内容。

    Makefile模板

    常用的Makefile万能模板,可快速进行makefile编写,及linux下的gcc编译

    makefile工程 模板

    1.独立的makefile模板 2.makefile工程 3.文件配置 4.软件设计

    单独模块Makefile模板

    单独编译linux 内核某一模块,使用此Makefile只用修改c文件及模块名字

    一套的实用完整Makefile参考模板

    本文档列举了一个完整的linux makefile文件结构模板,对于linux编译初学者而言相当有帮助。

    makefile简单模板

    makefile简单模板, 支持多文件编译和增量编译

Global site tag (gtag.js) - Google Analytics