makefile中的include *******

对于makefile中的include ***,***指的是包含的文件,当执行makefile时,先执行include ***这句,加载包含的文件(夹),如果不存在则会报错!

如果在include前面加了“-”,则在加载的时候会先去查找***文件是否存在,如果存在,则读入且查看是否有规则对文件中的内容进行更新,如果有,那么等更新完再加载。如果没有相应的更新规则,那么直接加载进来,但当***文件不存在的时候,会出现一个警告,但并不会直接退出,而是等完成makefile所有文件的读取之后,再试图用规则进行新建***文件,如果没有规则新建这个***文件,则直接报错,退出程序。

测试代码:

.PHONY:all clean


MKDIR = mkdir
RM = rm
RMFLAGS = -fr

CC = gcc

AA = aa
DIR_OBJS = objs
DIR_EXES = exes
DIR_DEPS = deps
DIRS = $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS)

EXE = complicated.exe
EXE := $(addprefix $(DIR_EXES)/,$(EXE))

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
OBJS := $(addprefix $(DIR_OBJS)/,$(OBJS))
DEPS = $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/,$(DEPS))

all:$(EXE)

-include $(DEPS)
-include $(AA) 

$(AA):
        touch $(AA)

$(DIRS):

   $(MKDIR) $@
$(EXE):$(DIR_EXES) $(OBJS)
        $(CC) -o $@ $(filter %.o,$^)
$(DIR_OBJS)/%.o:$(DIR_OBJS) %.c
        $(CC) -o $@ -c $(filter %.c,$^)
$(DIR_DEPS)/%.dep:$(DIR_DEPS) %.c
        @echo "making $@ ..."
        @set -e; \
        $(RM) $(RMFLAGS) $@.tmp; \
        $(CC) -E -MM $(filter %.c,$^) > $@.tmp; \
        sed 's,\(.*\)\o[ :]*,objs/\l.o $@: ,g' < $@.tmp > $@ ; \
        $(RM) $(RMFLAGS) $@.tmp

clean:
        $(RM) $(RMFLAGS) $(DIRS)

 

运行结果如下:

posted @ 2013-07-05 12:42  梧桐树下的一缕阳光  阅读(1768)  评论(0编辑  收藏  举报