一个牛的Makefile

CC := gcc

CFLAGS := -g -Wall
LDFLAGS := -g -Wall
SOURCES := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SOURCES))
TARGET := Asn1
all:$(TARGET)
$(TARGET):$(OBJS)
$(LINK.o) $^ $(OUTPUT_OPTION)
.PHONY:clean
clean:
- $(RM) $(TARGET) *.o
include $(SOURCES:.c=.d)
%.d:%.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\).o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
 
使用这个Makefile,所有的依赖关系都不用自己关心了。在不同项目中,要改的只有
TARGET := Asn1(最终的可执行文件)一行。
注意:
1、wildcard的功能:展开*.c为Asn1.c Main.c(本项目)
2、patsubst的功能:
$(patsubst <pattern>,<replacement>,<text>)
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。(From:《跟我一起写Makefile》)
1、 @set -e; rm -f $@; \
中@的作用是在make是不显示由.c生成.d的方式。
2、 sed 's,\($*\).o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
中是“一”.o,而不是小L.o。
 
本文参考:《Linux C一站式编程》 《跟我一起写Makefile》《Makefile自动产生依赖》 《Makefile自动依赖》

 

你可能感兴趣的:(职场,自动,依赖,makefile,休闲)