1. 程式人生 > >makefile調用所有子目錄makefile

makefile調用所有子目錄makefile

code pre find cut 數組 循環 結果 指令 class

在網上找了很多,沒有一個能拿過來直接用的

makefile調用所有子目錄makefile

頂層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試試看

makefile調用所有子目錄makefile