2012-06-05 57 views
0

我覺得這是一個相當普遍的問題,但我無法在任何地方的特定情況下找到答案。我有一個目標,像這樣:Makefile的目標是永遠不會滿足

initfs.tar: $(INITFS_FILES) 
    rm -f ./initfs.tar 
    cd initfs_root 
    tar --format ustar --exclude-vcs -cf ../initfs.tar ./ 

INITFS_FILES定義:

INITFS_FILES:=$(shell find ./initfs_root/ -not -path '*/.*/*' -not -name '.*' -type f) 

每次我打電話make initfs.tar,這一目標運行。 initfs_root目錄中沒有任何文件被觸及(並且使用該find命令找到所有文件)。確實創建了initfs.tar。

有沒有人有任何想法,爲什麼會發生這種情況?對我來說,根據我在互聯網上遇到的所有其他帖子以及我目前的專業知識,我沒有任何意義(儘管顯然,我的專業知識在Makefile區域缺乏;)

+0

「INITFS_FILES」變量的內容是什麼? – sarnold

+0

我不假設'INITFS_FILES'列表中的任何文件在未來會以某種方式進行瘋狂的最後修改時間? –

+0

@sarnold它擁有「binary-file test.txt」 – Caleb1994

回答

5

make中的每個命令都在每個命令行的新子shell中執行。這意味着命令

cd initfs_root 
tar --format ustar --exclude-vcs -cf ../initfs.tar ./ 

在兩個不同的子殼中執行。因此,tar命令不會以initfs_root目錄作爲其工作目錄執行。

可以由兩個組合成一個命令行避免這種情況:

cd initfs_root; tar --format ustar --exclude-vcs -cf ../initfs.tar ./ 

順便說一句,要小心,如果你想tar任何文件在他們的路徑或名稱空間。這些將在變量$INITFS_FILES中分成多個名稱,並且您的機制將會中斷。

+0

+1。好地方! –

+0

@Reinier修復它!我剛剛處於initfs驅動程序的測試階段,因此我沒有對initfs_root進行任何重大更改。由於沒有真正的變化,我從未注意到它沒有被更新。 此外,我沒有在文件名中包含空格,除非我絕對必須(它本質上從不,哈哈),但這是一個很好的觀點。 – Caleb1994

相關問題