2010-10-04 57 views
4

是否可以在Makefile規則中將目錄指定爲依賴項?實際上,我在一個目錄中有一個Makefile,而另一個目錄包含所有的源文件。作爲make規則中的依賴項的目錄

. 
. 
|_ Makefile 
|_ src 
    |_a.c 
    |_a.h 

現在我想,只要我做的src目錄,即在任一交流轉換器或A.H的任何改變,在我的Makefile特定規則獲得呼籲發出make命令。像

Makefile 
. 
. 
. 
build: src 
    <commands> 

clean: 
    <commands> 
+0

...'.c'和'.h'文件的正常規則不應該處理這個嗎? – 2010-10-04 10:35:21

+0

僅當文件被添加或刪除時,目錄時間戳纔會更改。當目錄中的文件內容更改時,目錄時間戳不會更新。 – 2015-05-01 10:44:22

回答

3

東西可能有一個目錄的依賴,在這個意義上,如果它不存在,它會重建。甚至可以安排一個規則,當目錄中的任何內容發生變化時執行,但這很棘手。 而在這種情況下,它幾乎肯定是矯枉過正。

如果你的目的是普通的,通常的方法就足夠了:

OBJ_FILES = foo.o bar.o baz.o 
# There are ways to be more succinct, but for now we'll keep it simple. 

build: $(OBJ_FILES) 
    <commands...> 

%.o: src/%.c src/%.h 
    <commands for building something.o> 

clean: # This should not require prerequisites 
    <commands...> 
+0

一般來說,正如你的答案已經明確表示的那樣:*目錄作爲依賴項*的要求並沒有很好的規定。有時(但很少),只要目錄本身具有更新修改時間,有時當目錄中的任何現有文件發生更改時,有時(甚至很少),有時在某些類型的任何文件發生更改時,有時候也希望重新生成某些類型被添加,刪除或重命名,有時候你想遞歸地包含子目錄的內容。 – reinierpost 2010-10-06 10:07:14

2

雖然可能有一個目錄的依賴,有幾件事情需要注意的。考慮一下:

directory: 
     @mkdir -p directory 

directory/file : directory 
     commands-to-make-the-file 

這會做你的想法。但是,只要file早於directory,它就會執行commands-to-make-the-file,這可能不是您想要的。

您需要考慮directory的時間戳得到更新的場景。每當將文件添加到目錄中或從目錄中刪除文件時都會發生這種情況,但是在修改現有文件時不會發生這種情況

因此,更新目錄的一些不相關的操作將導致文件變得過時,可能是不必要的,這將觸發命令重新生成它。

+0

這正是我的問題。有沒有解決方法?我真正需要的是:如果'directory'不存在,在構建'file'之前創建它。我可以在'make-the-file'命令前面加上'mkdir -p directory',但是當'file'過期時,這與定位'directory'是一樣的......完全按照我的需要工作,但是醜陋=( – matheuscscp 2016-03-16 20:06:17

+0

@matheuscscp Makefile文檔確切地說明了這種情況:https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html – 2018-01-25 15:30:43

相關問題