1. 問題引入——如何在makefile中組織.dep
文件到指定目錄稚失?
解決思路:當include發(fā)現(xiàn).dep
文件存在時:
1)通過規(guī)則和命令創(chuàng)建deps
文件夾
2)將所有.dep
文件創(chuàng)建到deps
文件夾
3).dep
文件中記錄目標文件的依賴關系
.PHONY : all
MKDIR := mkdir
RM := rm -rf
CC := gcc
DIR_DEPS := deps
SRCS := $(wildcard *.c)
DEPS := $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))
all :
@echo "all"
ifeq ("$(MAKECMDGOALS)", "all")
-include $(DEPS)
endif
ifeq ("$(MAKECMDGOALS)", "")
-include $(DEPS)
endif
$(DIR_DEPS) :
$(MKDIR) $@
ifeq ("$(wildcard $(DIR_DEPS))", "")
$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c
else
$(DIR_DEPS)/%.dep : %.c
endif
@echo "Creating $@ ..."
@set -e; \
$(CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@
clean :
$(RM) $(DIR_DEPS)
2. include暗黑操作:
1)使用減號(-)不但關閉了include發(fā)出的警告,通過關閉了錯誤政勃;當錯誤發(fā)生時make將忽略這些錯誤锭碳!
2)如果include觸發(fā)規(guī)則創(chuàng)建了文件酥艳,include的位置將替換為文件的內(nèi)容景殷;
.PHONY : all
include test.txt
all :
@echo "this is all"
test.txt :
@echo "creating $@..."
@echo "other : ; @echo ""this is test.txt""" > test.txt
3)如果include包含的文件存在仇祭,之后還會發(fā)生什么?
.PHONY : all
include test.txt
all :
@echo "this is all"
test.txt : b.txt
@echo "creating $@..."
output:
$ make all
creating test.txt...
this is all
當include的文件存在時梆暖,并且對應的規(guī)則及其規(guī)則的依賴(依賴的時間戳比目標文件的時間戳更新時)也存在時伞访,這個文件的規(guī)則命令將會被執(zhí)行。
3. 關于include的總結(jié)
- 當目標文件不存在時:以文件名查找規(guī)則轰驳,并執(zhí)行
- 當目標文件不存在時厚掷,且查找到的規(guī)則中創(chuàng)建了目標文件:將創(chuàng)建成功的目標文件中的內(nèi)容包含進當前makefile
-
當目標文件存在時,將目標文件包含進當前makefile中级解,以目標文件名查找是否有相應的規(guī)則:
1)如果有:比較規(guī)則的依賴關系冒黑,決定是否執(zhí)行規(guī)則的命令
2)如果沒有:無操作 -
當目標文件存在,且目標名對應的規(guī)則被執(zhí)行:
1)規(guī)則中的命令更新了目標文件:make重新包含目標文件勤哗,替換之前包含的內(nèi)容
2)目標文件未被更新:無操作
聲明:此文章為本人在學習狄泰軟件學院《十二月提升計劃》所做的筆記抡爹,參考書籍《專業(yè)嵌入式軟件開發(fā)》——李云,文章中包含狄泰軟件資料內(nèi)容和《專業(yè)嵌入式軟件開發(fā)》資料內(nèi)容芒划,一切版權歸狄泰軟件和《專業(yè)嵌入式軟件開發(fā)》所有豁延!