10.使用隱含規則

本系列文章均翻譯自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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章