makefile代碼
SUBDIRS = $(shell find . * -type d | grep -v "\.")
.PHONY:all clean
all:
@for subdir in $(SUBDIRS); do $(MAKE) -C $$subdir; done
clean:
@for subdir in $(SUBDIRS); do $(MAKE) -C $$subdir clean; done
說明:
1. 使用shell find方法調出當前目錄所有子目錄
$(shell find . * -type d | grep -v "\.")
備註:
-type表示類型,d是directory文件夾
*是所有內容,在makefile裏給*加上“”會報錯
如果沒有用grep去除多級目錄,則會產生以下效果
find . * -type d
.
./02
./03
./001
001
02
03
使用grep -v去除所有.開頭的項目,.需要以轉義字符寫為\.,否則自動匹配正則表達式,會剔除所有內容
2. 使用隱式數組獲取上述所有結果
SUBDIRS = $(shell find . * -type d | grep -v "\.")
不是subdirs本身是隱式數組,是這種方法,可以讓subdirs變量變成一個數組變量,把線性的find結果直接當數組在for裏面用,也就是說subdirs本身其實是
dir1\rdir2\rdir3
這麽個隱式數組
3. 使用for循環遍歷所有目錄
all:
@for subdir in $(SUBDIRS); do $(MAKE) -C $$subdir; done
備註:
如果是復制過去的,考慮8個空格和tab的問題,MAKEFILE中使用tab開頭以執行動作
註意$(MAKE) -C $$subdir是比較有用的自動推導的方法
如果是想make就$(MAKE) -C $$subdir,如果想clean就加上clean(同理如果有別的目標也可以指令,但是這樣會對所有子makefile生效,子makefile如果找不到目標就exit:1)
兩個偽目標 all clean對應子makefile中的默認make和clean,保持整齊。
makefile使用c語言的規則,空格和換行表示一段結束
也就是說,dir1 dir2 dir3能夠被for subdir in xxx識別為三個元素,
dir1
dir2
dir3也能被識別為三個元素(我上面寫的subdir=$(shell find 。。。)就是用的回車方法,因為在bash裏執行的結果是換行
但是,如果subdir = "dir1 dir2 dir3",就表示只有一個文件夾了
因為字符串連成一片了,如果想拆開可以使用cut 指令,具體方法可以man cut試試看
REF
https://www.itread01.com/content/1506933611.html
沒有留言:
張貼留言