10.使用隱含規則

ignorantshr發表於2019-01-06

本系列文章均翻譯自make官方文件:make Manual,github同步專案:question

10.5 匹配規則與自動變數

10.5.1 匹配規則介紹

%字元匹配任何非空字串。%匹配到的字串叫做stem(詞幹)。

prerequisites中的*%代表了目標中%匹配的同樣的stem*。

%.o : %.c ; recipe…

要求xxx.c必須存在或者可以建立。

10.5.4 模式是如何匹配的

模式不包括/時,檔名中的目錄名會被先移除,匹配完檔名的部分之後,再把目錄部分加上來。例:
e%t匹配檔案src/eatstem就是src/a

note:已經存在或被引用的prerequisites的優先順序總是比需要被其它隱含規則建立的prerequisites高。

多個匹配規則滿足時:

  • make會選擇stem最短的那個規則。
  • 如果stem等長,選擇第一個發現的規則。

10.5.5 匹配任何檔案的模式規則

模式規則的目標只是一個%的時候,它會匹配任何一個檔名,稱作match-anything規則。

每次定義這種規則的時候,必須選擇下面的一項進行約束:

  1. 使用::標記規則為terminal,只有prerequisites已經存在的時候才能應用規則。
  2. 非終端規則。non-terminal match-anything rule不能應用於指定了檔案型別的檔名。???

10.5.3 自動變數

自動變數只在recipe中生效。但是,make的二次擴充套件特性(see Secondary Expansion)允許在prerequisites中使用自動變數的值。

  • $@ - 目標檔名。目標是歸檔成員時,代表的是歸檔檔名。在有多個生成目標的匹配規則情況下,代表了任何引起recipe執行的目標檔案。
  • % - 目標是歸檔成員時,代表目標成員名。否則為空。例如:如果目標是foo.a(bar.o),那麼*@代表foo.a,$%*代表bar.o。
  • $< - 第一個prerequisites的名字。如果目標從隱含規則執行recipe,這會成為第一個prerequisitesee Implicit Rules.
  • $? - 所有的比目標新的prerequisites的名字,空格分隔。對於是歸檔成員的prerequisites,只有命名的成員被使用。???
  • $^ - 所有的prerequisites,空格分隔。歸檔成員的規則同上。如果prerequisites中有重複多次的prerequisite,那麼該變數只會包含一個重複的prerequisite。此變數不包括order-only prerequisites(指只有目標不存在的時候才會參與目標的生成的prerequisites,與常規的用|分隔)。
  • ++ - 與`^`類似,不過它包含重複的prerequisite
  • $| - 所有的order-only prerequisites,空格分隔。
  • $* - 隱含規則匹配的詞幹。以後再看!!!
  • (@D)/(@D) - 目標檔名的目錄部分(去掉`/`)。例:@=‘dir/foo.a’,$(@D)=‘dir’。如果目標沒有/,此值為.
  • (@F)(@F) - 目標檔名的檔案部分。與`(notdir $@)`相等。

以下變數都是類似的:

  • $(*D)
  • $(*F)
  • $(%D)
  • $(%F)
  • $(<D)
  • $(<F)
  • $(^D)
  • $(^F)
  • $(+D)
  • $(+F)
  • $(?D)
  • $(?F)

相關文章