一个简单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不能满足要求

posted @ 2021-12-13 14:39  Yong_无止境  阅读(82)  评论(0编辑  收藏  举报