2013-05-02 113 views
5

我試圖使用makefile,我的問題是我有一個目錄,src目錄和Makefile。我也使用tmp目錄,我還必須創建。 它有它的目標文件。爲了提高性能,我在調試時儘量不要刪除這些內容。 如果我爲tmp創建一個規則來創建它,它總是會重建所有的C文件。 那麼如何做到這一點?如何根據需要創建目錄?

+1

可能使用[使用make文件創建目錄]的副本(http://stackoverflow.com/questions/1950926/create-directories-using-make-file) – SimplyKnownAsG 2016-12-14 22:49:09

回答

8

有很多方法。這取決於您使用的是什麼版本的make以及您正在使用的操作系統。

你絕不能做的一件事就是使用一個目錄作爲一個簡單的先決條件。文件系統用於更新目錄上修改時間的規則與make不一致。

對於簡單make一個POSIX系統上,你可以在規則中預先創建的目錄,進行編譯:

obj/foo.o: foo.c 
     @ mdkir -p obj 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

如果你有GNU讓你有兩個選擇。最簡單的一個是簡單地迫使時之前什麼都發生在讀取makefile文件被創建的目錄,加入這樣一行:

_dummy := $(shell mkdir -p obj) 

的是方便,快捷,可靠。它唯一的缺點是即使不需要,該目錄也會始終創建。儘管如此,我通常這樣做。

最奇特的方式,如果你有一個新的,足夠的GNU製作,是使用訂單僅先決條件:

obj/foo.o: foo.c | obj 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

obj: 
     mkdir -p [email protected] 

這迫使obj目標到obj/foo.o目標之前將建成在確定obj/foo.o是否過期時,會忽略obj上的時間戳。

+0

有沒有辦法做到這一點沒有GNU make extensions? (這個問題被標記爲'Makefile',而不是'GNUmakefile')。 – jww 2018-02-05 10:50:21

+0

不,在編寫符合POSIX標準的makefile時,沒有辦法將目錄用作先決條件(因此它的行爲如所期望的那樣)。你可以做的唯一的事情就是在你試圖使用一個可能不存在的目錄之前,重寫所有你的規則添加到一個明確的'mkdir -p'中,而不是使用先決條件或者制定規則來構建目錄。 – MadScientist 2018-02-05 13:26:00

相關問題