Makefile 定義規則


一個Makefile目標規則的一般語法

    target [target...] : [dependent ....]
    [ command ...]

方括號中的項是可選的,省略號是指一個或多個。注意標籤,每個命令前需要。

下面給出一個簡單的例子,定義了一個規則使您的目標從 hello 其他三個檔案。

hello: main.o factorial.o hello.o
	$(CC) main.o factorial.o hello.o -o hello

註:在這個例子中,你必須放棄規則,使所有物件從原始檔的檔案

語意是相當簡單的。當"make target"發現目標規則適用,如有眷屬的新目標,使執行的命令一次一個(後巨集替換)。如果有任何依賴進行,即先發生(讓您擁有一個遞迴)。

如果有任何命令返回一個失敗狀態,MAKE將終止。這就是為什麼看到規則,如:

clean:
        -rm *.o *~ core paper

 

Make忽略一個破折號開頭的命令列返回的狀態。例如。如果沒有核心檔案,誰在乎呢?

Make 會 echo 巨集字串替換的命令後,告訴發生了什麼事,因為它發生。有時可能想要把它們關掉。例如:

install:
        @echo You must be root to install

大家所期望的Makefile的 某些目標。應該總是先瀏覽,但它的合理預期的目標(或只是做),安裝,清潔,會發現。

  • make all - 編譯一切,讓你可以在本地測試,之前安裝的東西。

  • make install - 應安裝在正確的地方的東西。但看出來的東西都安裝在正確的地方為系統。

  • make clean - 應該清理的東西。擺脫的可執行檔案,任何臨時檔案,目標檔案等。



Makefile的隱含規則

該命令應該在所有情況下,我們建立一個可執行x的的原始碼x.cpp的作為一個隱含的規則,這可以說:

.cpp:
        $(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]

這種隱含的規則說,如何make c,  x.c- 執行x.c 呼叫輸出x。規則是隱式的,因為沒有特定的目標提到。它可用於在所有的情況下。

另一種常見的隱含規則的構造 .o(物件)檔案和 .cpp (原始檔)。 

.o.cpp:
        $(CC) $(CFLAGS) -c $<

alternatively

.o.cpp:
        $(CC) $(CFLAGS) -c $*.cpp