makefile模板(应用程序)
2013-07-11 15:05
274 查看
TARGET := uart2net SRCS := main.c \ fifo.c \ serial.c \ epoll.c CROSS_COMPILE = GCC := $(CROSS_COMPILE)gcc G++ := $(CROSS_COMPILE)g++ OBJS := ${SRCS:.c=.o} DEPS := ${SRCS:.c=.dep} XDEPS := $(wildcard ${DEPS}) CCFLAGS = -std=gnu99 -O2 -Wall -Werror -ggdb LDFLAGS = -lpthread LIBS = .PHONY: all clean distclean all:: ${TARGET} ifneq (${XDEPS},) include ${XDEPS} endif ${TARGET}: ${OBJS} ${CC} ${LDFLAGS} -o $@ $^ ${LIBS} ${OBJS}: %.o: %.c %.dep ${CC} ${CCFLAGS} -o $@ -c $< ${DEPS}: %.dep: %.c Makefile ${CC} ${CCFLAGS} -MM $< > $@ clean:: rm -f *~ *.o ${TARGET} distclean:: rm -f *~ *.o *.dep
第二个模板
1. 使用环境
GNU make 3.8.1或者以上版本
sed
gcc/binutils
cygwin或者Linux
2. 关键变量
CROSS_COMPILE:交叉编译器前缀
OPTIMIZE:关于优化的编译参数
WARNINGS:关于warning的编译参数
DEFS: 关于宏定义的编译参数
EXTRA_CFLAGS:其它的编译参数
$(OPTIMIZE) $(WARNINGS) $(DEFS) $(EXTRA_CFLAGS)共同构成了传给gcc的编译参数。
INC_DIR:头文件目录
SRC_DIR:源文件目录(当前目录.是被默认包含的)
OBJ_DIR:object文件的输出目录
EXTRA_SRC:源文件列表
EXCLUDE_FILES:exclude文件列表
SUFFIX:源文件的后缀名
TARGET:最终的目标程序名
TARGET_TYPE:目标程序的类型。
可以定义的类型为:ar(static library),so(shared library)和app(application)。
最终Makefile的行为是:
在$(SRC_DIR)定义的每个目录中查找后缀为$(SUFFIX)的文件,并加上$(EXTRA_SRC)中的文件,然后排除掉
$(EXCLUDE_FILES)中的文件,获得本工程定义的源文件列表。对于每一个源文件,编译生成的一个.o文件和一个.d文件
(依赖文件),放在$(OBJ_DIR)目录下。最终生成的目标文件为$(TARGET)。
此Makefile已经充分考虑到文件之间的依赖关系,即,如果某个头文件发生改变,当运行make的时候,所有依赖于它的
源文件都将被重新编译。
############################################################################### # # A smart Makefile template for GNU/LINUX programming # # Author: PRC (ijkxyz AT msn DOT com) # Date: 2011/06/17 # # Usage: # $ make Compile and link (or archive) # $ make clean Clean the objectives and target. ############################################################################### CROSS_COMPILE = OPTIMIZE := -O2 WARNINGS := -Wall -Wno-unused -Wno-format -Werror DEFS := -DMYDEF=1 -UMYDEF2 EXTRA_CFLAGS := LDFLAGS = -lpthread INC_DIR = SRC_DIR = OBJ_DIR = out/target EXTRA_SRC = main.c \ fifo.c \ serial.c \ epoll.c EXCLUDE_FILES = SUFFIX = c cpp cc cxx TARGET := out/uart2net #TARGET_TYPE := ar TARGET_TYPE := app #TARGET_TYPE := so ##################################################################################### # Do not change any part of them unless you have understood this script very well # # This is a kind remind. # ##################################################################################### #FUNC# Add a new line to the input stream. define add_newline $1 endef #FUNC# set the variable `src-x' according to the input $1 define set_src_x src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3)) endef #FUNC# set the variable `obj-x' according to the input $1 define set_obj_x obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2)) endef #VAR# Get the uniform representation of the object directory path name ifneq ($(OBJ_DIR),) prefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::') prefix_objdir := $(filter-out /,$(prefix_objdir)/) endif GCC := $(CROSS_COMPILE)gcc G++ := $(CROSS_COMPILE)g++ SRC_DIR := $(sort $(SRC_DIR)) inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d) #--# Do smart deduction automatically $(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES)))) $(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir)))) $(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f)))) $(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d)))) all_objs = $(foreach i,$(SUFFIX),$(obj-$i)) all_srcs = $(foreach i,$(SUFFIX),$(src-$i)) CFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS) TARGET_TYPE := $(strip $(TARGET_TYPE)) ifeq ($(filter $(TARGET_TYPE),so ar app),) $(error Unexpected TARGET_TYPE `$(TARGET_TYPE)') endif ifeq ($(TARGET_TYPE),so) CFLAGS += -fpic -shared LDFLAGS += -shared endif PHONY = all .mkdir clean all: .mkdir $(TARGET) define cmd_o $$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST) $(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) $(LDFLAGS) -c -o $$@ $$< endef $(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir)))) ifeq ($(TARGET_TYPE),ar) $(TARGET): AR := $(CROSS_COMPILE)ar $(TARGET): $(all_objs) rm -f $@ $(AR) rcvs $@ $(all_objs) else $(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC)) $(TARGET): $(all_objs) @echo "compile now....." @echo "objs=$(all_objs)" @echo "src=$(all_srcs)" $(LD) $(LDFLAGS) $(all_objs) -o $@ endif .mkdir: @if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi clean: rm -f $(prefix_objdir)*.o $(TARGET) -include $(patsubst %.o,%.o.d,$(all_objs)) .PHONY: $(PHONY)
相关文章推荐
- Makefile的通用模板解析
- linux_____makefile_____模板
- 艾伟_转载:用C#设计Windows应用程序模板
- Linux的通用makefile模板
- linux: 几个常用makefile模板
- makefile编写---单个子目录编译模板
- Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介
- 简单Makefile模板
- Makefile模板
- linux: 几个常用makefile模板(动态库、静态库、可执行程序)
- java应用程序Ant通用模板
- Xcode 应用程序常用模板
- Makefile的简单使用与最简单模板
- 简单Makefile文件模板
- 一个linux下g++使用的 makefile 模板
- LDD3源码分析之hello.c与Makefile模板
- Linux工程下所有C代码编译Makefile模板
- Makefile万能模板
- linux makefile模板
- Symfony2博客应用程序教程:第三部分-路由、控制器和模板