gnu make學習

1.makefile的簡介

   自動化編譯鏈接生成目標程序

2.makefile的規則

   2.1

TARGET... :PREREQUISITES...

      COMMAND

      ...

      ... 

command:規則的命令行。是規則所要執行的動作(shell命令或者是在shell下執行的程序)。它限定了make執行這條規則時所需要的動作。

一個規則可以有多個命令行,每一條命令佔一行。注意:每一個命令行必須以[Tab]字符開始,[Tab]字符告訴make此行是一個命令行


當在shell提示符下輸入“make”命令以後。make讀取當前目錄下的Makefile文件,並將Makefile文件中的第一個目標作爲其執行的“終極目標”,開始處理第一個規則(終極目標所在的規則)。


例如: 

    

#sample Makefile

edit : main.o kbd.ocommand.o display.o \

   insert.osearch.o files.o utils.o

        cc -o  edit main.o kbd.o command.o display.o \

        insert.osearch.o files.o utils.o

main.o : main.cdefs.h

        cc -c  main.c

kbd.o : kbd.c defs.hcommand.h

        cc -c  kbd.c

command.o :command.c defs.h command.h

        cc -c  command.c

display.o :display.c defs.h buffer.h

         cc -c  display.c

insert.o : insert.cdefs.h buffer.h

         cc -cinsert.c

search.o : search.cdefs.h buffer.h

         cc -c search.c

files.o : files.cdefs.h buffer.h command.h

          cc -cfiles.c

utils.o : utils.cdefs.h

          cc -cutils.c

clean :

          rm editmain.o kbd.o command.o display.o \

           insert.osearch.o files.o utils.o 


 注意事項:書寫時,可以將一個較長行使用反斜線(\)來分解爲多行,這樣可以使我們的Makefile書寫清晰、容易閱讀理解。但需要注意:反斜線之後不能有空格(這也是大家最容易犯的錯誤,錯誤比較隱蔽)。

   

    2.2.指定變量

   

objects = main.okbd.o command.o display.o \

insert.o search.ofiles.o utils.o

“objects”作爲一個變量,它代表所有的.o文件的列表。在定義了此變量後,我們就可以在需要使用這些.o文件列表的地方使用“$(objects)”來表示它,而不需要羅列所有的.o文件列表


  2.3 清除工作目錄過程文件

clean :

rm edit $(objects)

在實際應用時,我們把這個規則寫成如下稍微複雜一些的樣子。以防止出現始料未及的情況。

 


200491118GNU make中文手冊

        

.PHONY : clean

clean :

-rm edit $(objects)

這兩個實現有兩點不同: 1. 通過“.PHONY”特殊目標將“clean”目標聲明爲僞目標。避免當磁盤上存在一個名爲“clean”文件時,目標“clean”所在規則的命令無法執行。 在rm前加 ‘-’,避免rm執行時的錯誤。


          1.當前目錄下存在一個源文件foo.c的,我們可以使用make foo.o來使用make的隱含規則自動生成foo.o。當執行make foo.o時。我們可以看到其執行的命令爲:

      cc –c –o foo.o foo.c

            foo.o將會被創建或者更新。

  2.如果當前目錄下沒有foo.c文件時,就是make.o文件目標的隱含規則中依賴文件不存在。如果使用命令make foo.o時,將回到到如下提示:

make: *** No rule to make target ‘foo.o’. Stop.

          3. 如果直接使用命令make時,得到的提示信息如下:

make: *** No targetsspecified and no makefile found. Stop


3 makefile的規則

  

我們來看一個規則的例子:

foo.o : foo.c defs.h# module for twiddling the frobs

cc -c -g foo.c 


4.函數wildcard

   作用:使通配符有效,就需要使用函數“wildcard”,它的用法是:$(wildcardPATTERN...) 

 例如:

#sample Makefile

objects :=$(patsubst %.c,%.o,$(wildcard *.c))   #定義變量

foo : $(objects)  #引用變量

        cc -o foo $(objects)  #command
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章