makefile學習筆記2



1.makefile書寫規則:

               規則包括兩個部分:依賴關係生成目標的方法

makefile中第一條規則中的目標將被確立爲最終目標,其他的目標都是被這個目標所連帶出來的,如果第一條規則中的目標有很多個,那麼,第一個目標灰成爲最終目標。

 

 main.o:main.c main.h

cc -g main.c    //說明如何生成main.o這個文件

 

上面例子說明:main.o依賴於main.c main.h生產的目標。main.cmain.h是目標所依賴的源文件。

 

文件的依賴關係發生條件1.main.o文件不存在

 2.main.cmian.h文件的日期要比main.o的文件日期要新。

 

規則告訴make兩件事,文件的依賴關係和如何成成目標文件

 

 

=========================================================================================================================

 

2.在規則中使用通配符:

           make支持三個通配符:*“?”[...]

 

擴展知識:

          wildcard:擴展通配符通配符(wildcard)用來指定一組符合條件的文件名

          notdir:去除路徑

          patsubst:替換通配符

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------

例子:

         test目錄下,建立a.cb.c兩個文件,在sud目錄下,建立sa.csb.c兩個文件。建立一個簡單的Makefile

src = $(wildcard *.c ./sub/*.c) #將./下和./sub目錄下的所有的.c文件,全部展開

dir = $(notdir $(src))  #將./和./sub目錄下的.c文件去掉路徑名。

obj = $(patsubst %.c,%.o,$(dir))#將./和./sub目錄下的全部.c文件替換成.o文件

all:

@echo "src的打印結果是:$(src)"

@echo "dir的打印結果是:$(dir)"

@echo "obj的打印結果是:$(obj)"

@echo "××××××××打印完畢××××××××××"

 

打印結果:

src的打印結果是:a.cb.c ./sub/sa.c ./sub/sb.c 

dir的打印結果是:a.cb.c sa.c sb.c  

obj的打印結果是:a.ob.o sa.o sb.o

××××××××打印完畢××××××××××

 

用函數wildcard得到當前目錄下的所有c語言源程序文件名的方法 SRC=$(wildcard *.c)

如果還要要獲得子目錄sub下的文件,則可寫成:SRC=$(wild *c) $(wildcard ./sub/*.c )

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

正常情況下make會先打印每一條命令語句,然後再執行,這叫回聲。在語句前面加上"@",關閉回聲。就像上面幾句echo語句前加了@,所以沒有打印語句。

 

==========================================================================================================================

 

3.模式匹配符

      

         Make命令允許對文件名進行類似於正則運算的匹配。主要用到的匹配符“%”。

 

---------------------------------------------------------------------------------------------------------------------------------------------------

 

 例如:如果當前目錄下的有main.c foo.c兩個文件,現在要將他們編譯爲對應的對象文件。

       

    %.o : %.c

 

相當於:

       main.o : main.c

       foo.o : foo.c

 

------------------------------------------------------------------------------------------------------------------------------------------------------

 

 使用匹配符%,可以將大量同類型的文件,只用一條規則就完成構建

 

 

==========================================================================================================================

 

4.變量和賦值符

         Makefile一共提供了四個賦值運算符:=:=?=+=

        

              =  :在執行時擴展,允許遞歸擴展

           :=  :在定義時擴展

            ?= :只有在該變量爲空時才設置值

            += :將值追加到變量的尾端

 

       Makefile允許使用等號自定義變量。在調用時要用 $()括起來。在調用shell變量時美元符號前,再加一個美元符號,這是因爲Make命令會對美元符號轉義。

     例如:

      

a= hello world
test:
	@echo $(a)
	@echo $$HOME


      輸出結果:

        hello world

       /home/ubuntu

==========================================================================================================================

                          

5.內置變量

        Make命令提供一系列內置變量。$(CC)指向當前使用的編譯器,$(MAKE)指向當前使用的make工具   

===========================================================================================

 

6.自動變量

       1.$@ :指當前目標,Make命令當前構建的那個目標。

         例如:

a.txt b.txt:
	touch $@
                  

 運行結果:

                   在當前目錄下創建了a.txt 和b.txt兩個文件。

所以上面的相當於:

                  

a.txt:
	touch a.txt
b.txt:
	touch b.txt

          2.$< :指代第一個前置條件

            例如:a: b c  那麼$<指代a

            

            3.$^ : 指代所有的前置條件         

             例如:a: b c  那麼$<指代a b

            

            4.$? :指代比目標更新的所有前置條件,之間以空格分隔.

            例如:a: b c  如果b的時間比a的時間新。那麼$?指代b

           

           5.$* :指代匹配符%匹配的部分

           例如:%匹配a.txt中的a,那麼$*指代a

            

            6.$(@D)$(@F) : $(@D):指向$@的目錄

                                              $(@F):指向$@的文件名

             例如:$@指代 test/a.c    則:$(@D)指代test  $(@F)指代a.c

 

             7.$(>D)$(>F) :$(>D):指向$>的目錄

                                            $(>F):指向$>的文件名


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章