2014-05-08 38 views
4

我讀一個大的Makefile,其中一部分我不明白:理解的Makefile語法和變量

$(IREJECTION): $(IREJECTION:%$(MACH64).o=%.cpp) 
     $(CPP) $(CPPDLIBOPTS) -c $(@:%$(MACH64).o=%.cpp) -o [email protected] 

在這個腳本(注意,我刪除了不必要的變量,以避免冗長),什麼是以下平均

  • $(IREJECTION:%$(MACH64).o=%.cpp)(在第一行)
  • $(@:%$(MACH64).o=%.cpp)? (在第二行)

另外,這是什麼形式A: B是什麼意思?如:

$(IREJECTION): $(IREJECTION:%$(MACH64).o=%.cpp) #on the first line 
<---- A ----> <------------ B ---------------> #first instance of A: B 
       <--- A ----> <-------- B ------> #second instance of A: B 

正如你看到的,有形式A:B —的兩個實例,第二個是內部B本身。我也在這裏看到類似的東西:

$(@:%$(MACH64).o=%.cpp) #on the second line 
<A> <---------B-------> 

請幫我理解這一點。

+0

這些substitituoin /重寫規則:http://www.gnu.org/software/make/manual/make.html#Substitution-Refs。基本上'$(var:%。foo =%。bar)'意思是用'.bar'替換'var'的所有元素的'.foo'擴展名# – Anycorn

+1

@Anycorn:我認爲你的意思是:**替換**'。 '**'.foo'的'var' **所有元素的'bar'擴展? – Nawaz

+0

我明白了爲什麼它會混淆,但不是,它是這種形式 – Anycorn

回答

4

我覺得你有一個相當複雜的例子。它有很多東西。

規則/配方

A: B 
    <command> 
  • A - 目標
  • B - 依賴性
  • <command> - 要執行的命令,以建立A( 「配方」)

target: dependency是稱爲「規則」。 因此,總而言之,上面的例子是'規則'與適當的'食譜'。

(使A,其取決於B,需要執行<command>

make比較的BA修改日期。如果B是較新的,那麼它執行<command>


變量

$(IREJECTION)make的變量(應當在文件中之前的某處定義的,像IREJECTION:=somefile.o

make執行$(IREJECTION)被替換爲變量的實際值。



變量替換

從下面鏈接:

$(var:a=b) < ..>取變量var的值,替換每個 'A' 在與字'的端部b',並替換結果字符串。

和:

例如:

foo := a.o b.o c.o 
bar := $(foo:%.o=%.c) 

bara.c b.c c.c

在你的情況$(IREJECTION:%$(MACH64).o=%.cpp),它有一個名爲IREJECTION變量,試圖找到$(MACH64).o(其中還引用變量MACH64)在單詞的結尾,並與.cpp更換。



自動可變

[email protected]被稱爲自動變量。 它是對「目標」的引用。



Futher閱讀

http://www.gnu.org/software/make/manual/make.html

+0

+1。很好的答案。 – Nawaz

+0

實際上,目標/依賴項部分是_Rule_,shell命令是_Recipe_。一個目標可以出現在多個規則中,但最多隻有一個規則可以有一個配方。 – bobbogo

+0

@bobbogo我會更新,謝謝。 – industryworker3595112

2

A: B意味着你添加一個依賴於B的make target A.這意味着當B被改變時,它必須在A完成之前運行。 您可以通過調用make A來使用目標A.

1

我會走一步看TEP:

可以說你有一些目標文件irejection.mach64.o和源文件irejection.cpp

從通常編寫的源代碼生成對象像

irejection.mach64.o : irejection.cpp # means target : dependencies 
    $(CC) irejection.cpp -o [email protected] # [email protected] is a special variable - the target (output) 

規則不便現在讓我們說$(MACH64).mach64$(IREJECTION)irejection$(MACH64).o,即irejection.mach64.o

$(IREJECTION:%$(MACH64).o=%.cpp)將擴大到irejection.cpp

$(@:%$(MACH64).o=%.cpp)將擴大到相同的,因爲[email protected]$(IREJECTION)

本質上,給定目標文件的目標一個架構擴展,將文件名重寫爲其源文件副本。

似乎一直纏繞在我身上。清潔的方法是水木清華這樣的:

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

%是 「通配符」,$<是第一依賴,[email protected]是輸出

見:http://www.gnu.org/software/make/manual/make.html#Automatic-Variables

http://www.gnu.org/software/make/manual/make.html#Pattern-Rules

+0

現在我明白*替換* thingy。這是相反的方向,這有點奇怪,因爲在替換之後,生成的'cpp'文件可能不是要編譯的實際文件(在磁盤上)。無論如何,爲了這個工作,對象文件應該有與源文件完全相同的*前綴*。 – Nawaz

+0

@Nawaz替換thingy更多的是'轉換foo到bar'而不是bar是foo'。更一般地說一些常見的根需要存在的模式規則工作 – Anycorn

+1

@Nawaz順便說一句,編寫規則命令時,總是總是總是使用TAB,否則會得到奇怪的錯誤。 – Anycorn