2013-10-14 77 views
4

我想知道,如果訂單唯一的先決條件失去了它的訂單隻有優先級,如果它是假目標。考慮以下內容:如果先決條件是虛假目標,那麼僅限訂單的先決條件的行爲是什麼?

%.make: unpack_chroot 
    schroot $(CHROOT) make $* 

%.copy: | unpack_chroot 
    rsync -a input/$*/ $(CHROOT)/input/$*/ 

unpack_chroot: input/chroot.tar.gz 
    mkdir -p $(CHROOT) 
    tar -C $(CHROOT) -zxf $< 

.PHONY: unpack_chroot 

所有%.make和%.copy目標是.PHONY。其中一些目標取決於將文件複製到chroot中,而另一些則不會。那些確實與明確的相關性定義:

a.make: a.copy 
c.make: c.copy 

但是,如果unpack_chroot是不是命令,唯一的先決條件,並解壓縮的先決條件,另一個處理的一部分使目標在相同品牌的過程,當%.copy運行時,unpack_chroot將被視爲最新,並且不會重新生成%.copy;至少這是我所見過的。目前,unpack_chroot不是假的並被創建。我想弄虛作假,但要澄清這種行爲。

+0

你寫:_if'unpack_chroot'是不是命令,唯一的先決條件,並解壓縮爲先決條件,另一個處理的一部分使目標[...使]不會重拍'%.copy'_。這當然不是真的。如果正常的先決條件被重建,那麼所有依賴它的目標都將被重建。然而,取決於這樣的虛擬目標通常不是一個好主意,因爲每一次新的make調用都會重新運行目標。同時聲明規則'.PHONY'將強制所有依賴它的目標始終重建。 – MadScientist

+0

對不起,我的壞。已經更新了這個問題。如果前提條件是由另一個make過程構建的。然而,在說,我創建了一個小型獨立測試來檢查make的調試輸出。在這種情況下,make做的是正確的事情,並且不需要訂單唯一的先決條件。我不知道爲什麼它在實際的makefile中是必需的,因爲依賴性處理應該是相同的。我將需要爲實時生成生成調試,並查看實際正在執行的操作,這需要訂單唯一的先決條件。 – Craig

+0

我打算回答這個問題,因爲我不認爲這與我的想法有關。 – Craig

回答

-2

根據這封電子郵件(http://kolpackov.net/pipermail/notes/2004-January/000001.html),似乎正常和訂單唯一的先決條件之間的唯一區別是後者不會包含在自動生成變量中,如$ ^。

從一些測試,我跑似乎這是唯一的區別。在所有其他方面,它們與普通先決條件相同。

+1

不,只有訂單的先決條件不會導致目標被重建,如果目標比訂單唯一的先決條件早。 – John