Makefile 自動變量&字符替換


一、自動變量:

$*:

不包括后綴名的當前依賴文件的名稱這個變量表示目標模式中"%"及其之前的部分。如果目標是"dir/a.foo.b",並且目標的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。這個變量對於構造有關聯的文件名是比較有較。如果目標中沒有模式的定義,那么"$*"也就不能被推導出,但是,如果目標文件的后綴是make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值就是"foo"。

$+       

所有的依賴文件,以空格分開,並以出現的先后為序,可能包含重復的依賴文件

 $<        

第一個依賴文件的名稱,如果依賴目標是以模式(即“%” )定義的,那么“$<”將是符合模式的一系列的文件集。注意,其是一個一個取出來的。

$?       

所有時間戳比目標文件晚的依賴文件,並以空格分開

 $@       

目標文件的完整名稱(目標集合)在模式規則中,如果有多個目標,那么“$@”就是匹配於目標中模式定義的集合。注意其目標是一個一個取出來的。

 $^      

 所有不重復的目標依賴文件,以空格分開(區分$+)

 -:       

告訴make命令忽略所有的錯誤

@:     

 告訴make在執行命令前不要將命令顯示在標准輸出上

二、makefile 中的字符替換

1、字符替換

 

使用指定字符串替換變量中的后綴字符(串)格式:$(var:a=b)或${var:a=b} 注意:替換表達式中不能有空格
例如:

  src := acc bcc ccc
  obj := $(src:cc=o)

最后obj = ao bo co

 

2、模式字符串替換

使用%保留變量值中的指定字符串,其他部分替換為新字符
格式:$(var:a%b=x%y)或${var:a%b=x%y} 注意:替換表達式中不能有空格
例如:

  src := a123b.c a234b.c ajkhb.c
  obj := $(src:a%b.c=x%y)

最后 x123y.c x234y.c xjkhy.c

3、規則中的模式替換

    targets:target-pattern:prereq-pattern
        command1
        command2

作用:通過target-pattern(目標模式)從targets中匹配子目標,再通過prereq-pattern從子目標生成依賴,進而構成完整規則。
例:

  objs := func.o main.o
  $(objs): %.o : %.c
    gcc -o $@ -c $^

分析:
上述第二行,通過%.o匹配objs中的func.o,通過func.c生成依賴,再匹配main.o生成main.c依賴。
上述第二行會被make程序解析成

   func.o: func.c
  gcc -o $@ -c $^
  main.o: main.c
  gcc -o $@ -c $^

4、Makefile一般編寫規則

  1. 先定義一個目標文件名變量
  2. 然后就是 目標文件的保存目錄編寫
  3. 然后是源文件的變量定義包括C文件和匯編文件
  4. 再然后定義交叉編譯工具鏈,編譯選項(選項 include目錄 連接腳本 )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM