makefile入門(一)

1. Makefile的常用變量

Makefile 有三個非常有用的變量:$@,$^,$<。其意義爲:

$@:目標文件

$^:所有的依賴文件

$<:第一個依賴文件

eg:

  1. main: main.o mytool1.o mytool2.o   
  2. gcc -o $@ $^   
  3. main.o: main.c mytool1.h mytool2.h   
  4. gcc -c $<   
  5. mytool1.o: mytool1.c mytool1.h   
  6. gcc -c $<   
  7. mytool2.o: mytool2.c mytool2.h   
  8. gcc -c $<

2. Makefile 的缺省規則

..c.o:

gcc -c $<

這個規則表示所有的.o文件都是依賴於相應的.c文件的,例如mytool.o 依賴於mytool.c。

這樣上面那個Makefile還可以簡化爲:

#這是再一次簡化後的Makefile   
  1. main: main.o mytool1.o mytool2.o   
  2. gcc -o $@ $^   
  3. ..c.o:   
  4. gcc -c $<  

3 makefile 基本結構

makefile 中一般包含如下內容:* 需要由 make 工具創建的項目,通常是目標文件和可執行文件。通常使用“目標(target)”一詞來表示要創建的項目。* 要創建的項目依賴於哪些文件。* 創建每個項目時需要運行的命令。例如,假設你現在有一個 C++ 源文件 test.C,該源文件包含有自定義的頭文件 test.h,則目標文件 test.o 明確依賴於兩個源文件:test.C 和 test.h。另外,你可能只希望利用 g++ 命令來生成 test.o 目標文件。這時,就可以利用如下的 makefile 來定義 test.o 的創建規則:# This makefile just is a example.# The following lines indicate how test.o depends# test.C and test.h, and how to create test.otest.o: test.C test.h g++ -c -g test.C從上面的例子注意到,第一個字符爲 # 的行爲註釋行。第一個非註釋行指定 test.o 爲目標,並且依賴於 test.C 和 test.h 文件。隨後的行指定了如何從目標所依賴的文件建立目標。當 test.C 或 test.h 文件在編譯之後又被修改,則 make 工具可自動重新編譯 test.o,如果在前後兩次編譯之間,test.C 和 test.h 均沒有被修改,而且 test.o 還存在的話,就沒有必要重新編譯。這種依賴關係在多源文件的程序編譯中尤其重要。通過這種依賴關係的定義,make 工具可避免許多不必要的編譯工作。當然,利用 Shell 腳本也可以達到自動編譯的效果,但是,Shell 腳本將全部編譯任何源文件,包括哪些不必要重新編譯的源文件,而 make 工具則可根據目標上一次編譯的時間和目標所依賴的源文件的更新時間而自動判斷應當編譯哪個源文件。一個 makefile 文件中可定義多個目標,利用 make target 命令可指定要編譯的目標,如果不指定目標,則使用第一個目標。通常,makefile 中定義有 clean 目標,可用來清除編譯過程中的中間文件,例如:clean: rm -f *.o運行 make clean 時,將執行 rm -f *.o 命令,最終刪除所有編譯過程中產生的所有中間文件。4   makefile 變量GNU 的 make 工具除提供有建立目標的基本功能之外,還有許多便於表達依賴性關係以及建立目標的命令的特色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項同時編譯十幾個 C 源文件,而爲每個目標的編譯指定冗長的編譯選項的話,將是非常乏味的。但利用簡單的變量定義,可避免這種乏味的工作:# Define macros for name of compilerCC = gcc# Define a macr o for the CC flagsCCFLAGS = -D_DEBUG -g -m486# A rule for building a object filetest.o: test.c test.h $(CC) -c $(CCFLAGS) test.c在上面的例子中,CC 和 CCFLAGS 就是 make 的變量。GNU make 通常稱之爲變量,而其他 UNIX 的 make 工具稱之爲宏,實際是同一個東西。在 makefile 中引用變量的值時,只需變量名之前添加 $ 符號,如上面的 $(CC) 和 $(CCFLAGS)。5 GNU make 的主要預定義變量GNU make 有許多預定義的變量,這些變量具有特殊的含義,可在規則中使用。表 1-5 給出了一些主要的預定義變量,除這些變量外,GNU make 還將所有的環境變量作爲自己的預定義變量。 表 1-5 GNU make 的主要預定義變量預定義變量 含義$* 不包含擴展名的目標文件名稱。$+ 所有的依賴文件,以空格分開,並以出現的先後爲序,可能包含重複的依賴文件。$< 第一個依賴文件的名稱。$? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創建日期晚。$@ 目標的完整名稱。$^ 所有的依賴文件,以空格分開,不包含重複的依賴文件。$% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。例如,如果目標名稱 爲 mytarget.so(image.o),則 $@ 爲 mytarget.so,而 $% 爲 image.o。AR 歸檔維護程序的名稱,默認值爲 ar。ARFLAGS 歸檔維護程序的選項。AS 彙編程序的名稱,默認值爲 as。ASFLAGS 彙編程序的選項。CC C 編譯器的名稱,默認值爲 cc。CCFLAGS C 編譯器的選項。CPP C 預編譯器的名稱,默認值爲 $(CC) -E。CPPFLAGS C 預編譯的選項。CXX C++ 編譯器的名稱,默認值爲 g++。CXXFLAGS C++ 編譯器的選項。FC FORTRAN 編譯器的名稱,默認值爲 f77。FFLAGS FORTRAN 編譯器的選項。6   隱含規則GNU make 包含有一些內置的或隱含的規則,這些規則定義瞭如何從不同的依賴文件建立特定類型的目標。GNU make 支持兩種類型的隱含規則:* 後綴規則(Suffix Rule)。後綴規則是定義隱含規則的老風格方法。後綴規則定義了將一個具有某個後綴的文件(例如,.c 文件)轉換爲具有另外一種後綴的文件(例如,.o 文件)的方法。每個後綴規則以兩個成對出現的後綴名定義,例如,將 .c 文件轉換爲 .o 文件的後綴規則可定義爲:.c.o:$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<* 模式規則(pattern rules)。這種規則更加通用,因爲可以利用模式規則定義更加複雜的依賴性規則。模式規則看起來非常類似於正則規則,但在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴文件之間的關係,例如下面的模式規則定義瞭如何將任意一個 X.c 文件轉換爲 X.o 文件:%.c:%.o$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<

7   運行 make我們知道,直接在 make 命令的後面鍵入目標名可建立指定的目標,如果直接運行 make,則建立第一個目標。我們還知道可以用 make -f mymakefile 這樣的命令指定 make 使用特定的 makefile,而不是默認的 GNUmakefile、makefile 或 Makefile。但 GNU make 命令還有一些其他選項,表 1-6 給出了這些選項。 表 1-6 GNU make 命令的常用命令行選項命令行選項 含義-C DIR 在讀取 makefile 之前改變到指定的目錄 DIR。-f FILE 以指定的 FILE 文件作爲 makefile。-h 顯示所有的 make 選項。-i 忽略所有的命令執行錯誤。-I DIR 當包含其他 makefile 文件時,可利用該選項指定搜索目錄。-n 只打印要執行的命令,但不執行這些命令。-p 顯示 make 變量數據庫和隱含規則。-s 在執行命令時不顯示命令。-w 在處理 makefile 之前和之後,顯示工作目錄。-W FILE 假定文件 FILE 已經被修改。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章