一个简单makefile
目标
实现一个简单的通用makefile,包含C文件自动识别,头文件依赖自动生成,所有中间文件保存在同一路径下。
实现
.PHONY : all clean CC = gcc CFLAGS = LDFLAGS = TARGET = test SRCS = $(wildcard *.c) OBJS = $(patsubst %.c, tmp/%.o, $(SRCS)) DEPS = $(patsubst %.c, tmp/%.d, $(SRCS)) all : $(TARGET) $(TARGET) : $(OBJS) $(CC) -o $@ $^ $(LDFLAGS) tmp/%.o : %.c $(shell if [ ! -e tmp ];then mkdir -p tmp; fi) $(CC) -o $@ -c $< $(CFLAGS) $(INCLUDEFLAGS) tmp/%.d : %.c $(shell if [ ! -e tmp ];then mkdir -p tmp; fi) @set -e; rm -f $@; $(CC) -MM $< $(INCLUDEFLAGS) > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,tmp/\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ ifneq ($(MAKECMDGOALS), clean) -include $(DEPS) endif clean : rm -rf $(TARGET) tmp
说明:
1.编译过程生成的中间文件全部存在放在tmp目录
2.最后生成的目标文件是TARGET指定的变量值
3.makefile和源文件要放在同一级目录下
4.限制:只使用于小项目,如果涉及源码文件要放在不同的文件夹下,该makefile不能满足要求