我常用的makefile之产生优秀的.depend文件

注:以下文件的.depend文件相应后缀为.d,即xxx.c的.depend文件为xxx.d。

 

直接用gcc -MM产生的.depend文件形如:

test.o : test.c test.h

这样有个坏处,就是当 test.c 文件改变时,.depend文件仍然没变。若新的 test.c 中增加了头文件,则这个头文件并不会在依赖关系中(.dpend文件没变嘛)。所以要把.depend文件和其关联上。即变为

test.o test.d: test.c test.h

实现上面的转换用到了sed。
原理说了,下面就直接贴makefile了
 
 
ARCH=arm
ifeq ($(ARCH), arm)
CC=arm-hisiv200-linux-gcc
AR=arm-hisiv200-linux-ar
AS=arm-hisiv200-linux-as
LD=arm-hisiv200-linux-ld
CPP=arm-hisiv200-linux-g++
CP = cp
else
CC=gcc
AR=ar
AS=as
LD=ld
CPP=g++
CP=cp
endif
 
SRC:=
OBJ:=
 
SRC += $(wildcard ../*.c)
OBJ += $(patsubst %.c, %.o, $(notdir $(SRC)))
 
RULES_OBJ := $(patsubst %.c, %.d, $(filter %.c, $(SRC)))
 
TARGET_LIB=libvod.a
 
VPATH += ../
 
CFLAGS = -Wall -g
LDFLAGS = -lpthread
 
CPPFLAGS += -I../../../include/vod
 
all:$(OBJ)
 $(AR) ruv $(TARGET_LIB) $(OBJ)
 mv $(TARGET_LIB) ../
 

#产生.d文件
%.d: %.c
 $(CC) -MM $(CPPFLAGS) $< | sed -e 's/^\(.*\)\.o/\1\.o \1\.d/' > $@
 
%.o: %.c
 $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
 
clean:
 -rm -f $(OBJ)
 @-rm -f ../$(TARGET_LIB)
 @-rm -f *~ .*swp a.out
 @-rm -f *.o
 @-rm -f *.s
 
.PHONY:clean
 
include $(RULES_OBJ)
 
 
 
 

你可能感兴趣的:(我常用的makefile之产生优秀的.depend文件)