對於makefile中的include ***,***指的是包含的文件,當執行makefile時,先執行include ***這句,加載包含的文件(夾),若是不存在則會報錯!測試
若是在include前面加了「-」,則在加載的時候會先去查找***文件是否存在,若是存在,則讀入且查看是否有規則對文件中的內容進行更新,若是有,那麼等更新完再加載。若是沒有相應的更新規則,那麼直接加載進來,但當***文件不存在的時候,會出現一個警告,但並不會直接退出,而是等完成makefile全部文件的讀取以後,再試圖用規則進行新建***文件,若是沒有規則新建這個***文件,則直接報錯,退出程序。blog
測試代碼:get
.PHONY:all cleangcc
MKDIR = mkdir
RM = rm
RMFLAGS = -frsed
CC = gccfile
AA = aa
DIR_OBJS = objs
DIR_EXES = exes
DIR_DEPS = deps
DIRS = $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS)gc
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))im
all:$(EXE)makefile
-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)
運行結果以下: