天天看點

makefile學習9:僞目标

最早先的一個例子中,我們提到過一個“clean”的目标,這是一個“僞目标”:

clean:

rm *.o temp

正像我們前面例子中的“clean”一樣,即然我們生成了許多檔案編譯檔案,我們也應該提供一個清除它們的“目标”以備完整地重編譯而用。(以“make clean”來使用該目标)因為,我們并不生成“clean”這個檔案。“僞目标”并不是一個檔案,隻是一個标簽,由于“僞目标”不是檔案,是以make無法生成它的依賴關系和決定它是否要執行。我們隻有通過顯示地指明這個“目标”才能讓其生效。當然,“僞目标”的取名不能和檔案名重名,不然其就失去了“僞目标”的意義了。

當然,為了避免和檔案重名的這種情況,我們可以使用一個特殊的标記“.PHONY”來顯示地指明一個目标是“僞目标”,向make說明,不管是否有這個檔案,這個目标就是“僞目标”。

.PHONY : clean

隻要有這個聲明,不管是否有“clean”檔案,要運作“clean”這個目标,隻有“make clean”這樣。于是整個過程可以這樣寫:

.PHONY: clean

clean:

rm *.o temp

僞目标一般沒有依賴的檔案。但是,我們也可以為僞目标指定所依賴的檔案。僞目标同樣可以作為“預設目标”,隻要将其放在第一個。一個示例就是,如果你的 Makefile需要一口氣生成若幹個可執行檔案,但你隻想簡單地敲一個make完事,并且,所有的目标檔案都寫在一個Makefile中,那麼你可以使用“僞目标”這個特性:

all : prog1 prog2 prog3

.PHONY : all

prog1 : prog1.o utils.o

cc -o prog1 prog1.o utils.o

prog2 : prog2.o

cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o

cc -o prog3 prog3.o sort.o utils.o

我們知道,Makefile中的第一個目标會被作為其預設目标。我們聲明了一個“all”的僞目标,其依賴于其它三個目标。由于僞目标的特性是,總是被執行的,是以其依賴的那三個目标就總是不如“all”這個目标新。是以,其它三個目标的規則總是會被決議。也就達到了我們一口氣生成多個目标的目的。 “.PHONY : all”聲明了“all”這個目标為“僞目标”。

随便提一句,從上面的例子我們可以看出,目标也可以成為依賴。是以,僞目标同樣也可成為依賴。看下面的例子:

.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff

rm program

cleanobj :

rm *.o

cleandiff :

繼續閱讀