2017-03-16 46 views
2

我有這種特殊情況。我將解釋我需要做什麼Makefile目標與衝突模式

我有一堆.c文件,我需要從他們那裏得到.s文件。

我的編譯順序如下

filename.c -> filename.ll -> filename_reg.ll -> filename_reg.s

現在最明顯的問題是,無論是第二和第三階段有衝突的模式,即對於filename.ll模式也filename_reg.ll

匹配

所以我在%.ll模式之前編寫了%_reg.ll模式。所以它會首先匹配。

但是,它無法找到它後面定義的%.ll模式。

任何解決此問題的方法?

+0

假設'filename_reg.s'是一個彙編文件,什麼是中間文件?他們的目的是什麼?你不能直接從C源文件生成彙編文件(大多數編譯器可以這麼做)? –

+0

我正在使用非標準編譯器(LLVM/CLANG的一個分支),它必須分階段完成。 –

+0

因此,中間'.ll'文件有其他用途嗎?因爲除非你從Clang的分支中刪除'-S'選項,否則我沒有看到它們的目的。你能否向我保證,'.ll'文件是其他*所需的文件,而不僅僅是創建彙編文件的步驟?如果沒有,那麼解決方案是使用'-S'選項並且不關心中間文件。 –

回答

2

擴大我的評論 - 你所描述的應該工作。 make總會匹配最短杆規則,所以它不會不管的.ll文件這兩個模式規則的順序如果我有:

%_reg.s: %_reg.ll 
    @echo "$^ -> [email protected]" && cp $^ [email protected] 

%_reg.ll: %.ll 
    @echo "$^ -> [email protected]" && cp $^ [email protected] 

%.ll: %.c 
    @echo "$^ -> [email protected]" && cp $^ [email protected] 

我跑make filename.s,我得到:

~/sandbox/tst6> make filename_reg.s 
filename.c -> filename.ll 
filename.ll -> filename_reg.ll 
filename_reg.ll -> filename_reg.s 
rm filename.ll filename_reg.ll 
+0

感謝您澄清這一點。雖然我通過將reg和ll文件放在不同的文件夾中解決了這個問題。但是這個解決方案更清潔。 –

+1

請注意,在GNU make 3.82中實現了「最短幹比賽」算法。在此之前,make會使用第一個匹配模式,而不考慮詞幹長度。如果你想要可移植的話,可以訂購你的模式,這樣最短的詞幹也是第一種模式,它可以用於GNU make的新版本和更新版本。 – MadScientist

+0

@MadScientist,但在第一個匹配的情況下,它找不到'.ll'的規則,因爲它符合'_reg.ll'的規則。 –