2017-05-08 150 views
1

根據Gnu Make Manual和GNU Makefile - Pattern rule with multiple targets with one dependency ignores all targets but the first,具有多個目標的模式規則表現出不同於正常規則。後者相當於多個規則,每個規則只有一個目標。因爲我正在設計一個像make這樣的工具,我想知道這種不同行爲背後的基本原理,爲什麼這兩種規則都不會使用相同的邏輯呢?GNU Makefile - 爲什麼具有多個目標的模式規則的行爲與正常規則有所不同?

編輯:

例如,我有一個Makefile:

%.md %.ps: %.tex 
    echo "rule 1" 

doc1.tar.gz: doc1.md doc1.ps 
    echo "rule 2" 

doc2.md doc2.ps: doc2.tex 
    echo "rule 3" 

doc2.tar.gz: doc2.md doc2.ps 
    echo "rule 4" 

make doc1.tar.gz給我:

echo "rule 1" 
rule 1 
echo "rule 2" 
rule 2 

但​​給我:

echo "rule 3" 
rule 3 
echo "rule 3" 
rule 3 
echo "rule 4" 
rule 4 

我的問題是:爲什麼規則1不能像規則3那樣運行兩次?如果這種模式規則運行多次,會出現什麼問題?

回答

1

想象一下,你有以下幾種:

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

%.o: %.xx 
    $(XX) [email protected] $< 

第一條規則告訴make如何在.c文件存在構築.o文件。下一個規則告訴它如何在.xx文件存在的情況下建立一個.o文件。因爲有多種方式來生成.o文件,make會嘗試找到一個匹配的規則(其中依賴關係都被考慮在內的規則)。

現在考慮:

foo.o : foo.dep 

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

在這種情況下,foo.o的是特定目標,你想使運行特定規則。假定makefile的作者提前知道它來自哪裏,因此作者可以編寫正確的規則。請注意,在這種情況下,存在額外的依賴關係foo.o : foo.dep。這告訴make,如果foo.d過期了,它應該重建foo.o.這種事情對於模式規則來說是沒有意義的,在這種模式下,可以有多個規則生成同一個文件(因爲那麼,額外的依賴關係適用於哪個規則?)。不知道這是否澄清事情。

順便說一句 - 爲什麼要重新發明輪子 - 爲什麼你會想要設計一個工具就像 make,而不僅僅是使用make?

+0

我需要在日常工作中做很多數據處理,這樣的任務經常涉及各種腳本語言中的許多代碼片段,例如python,ruby,R等等。如果有像make這樣的工具可以粘合所有代碼片段都放到一個文件中並自動解析依賴關係。 GNU Make主要用於C/C++項目,對於數據處理來說太複雜了,我發現[Drake](https://github.com/Factual/drake)非常適合我的情況。然而,Drake是用Clojure編寫的,即使有滴漏,啓動時間也非常緩慢,而且由於我對Clojure知之甚少,所以很難延長。 –

相關問題