web-dev-qa-db-ja.com

Makefileの関数「patsubst」

From docs

$(patsubst PATTERN,REPLACEMENT,TEXT)

PATTERNに一致する空白で区切られたテキストをTEXTで検索し、REPLACEMENTで置き換えます。ここで、PATTERNには、ワイルドカードとして機能する%を含めることができ、Word内の任意の数の文字と一致します。
...
単語間の空白は単一のスペース文字に折りたたまれます。先頭と末尾の空白は破棄されます。



Makefileを指定すると、次のようになります:

# The pattern for patsubst, does NOT contain '%'
foo := $(patsubst  x,y,x    x    x)
# The pattern for patsubst, does contain '%'
bar := $(patsubst x%,y,x    x    x)


# The variable 'foo', is a result from a patsubst-pattern, that did NOT contain a '%'
# The variable 'bar', is a result from a patsubst-pattern, that did contain a '%'
all ::
    @echo 'foo is: "$(foo)"'
    @echo 'bar is: "$(bar)"'



実行すると、次のようになります:

foo is: "y    y    y"
bar is: "y y y"



したがって、Make、may、またはmaynotすべての空白を1つに「折りたたむ」ことは明らかです。と単一の空白。

または、私は何か間違ったことをしましたか?.

16
Ji Cha

実際、すべては doc で説明されています:

TEXTで空白で区切られた単語を検索します...

単語を区切るために1つ以上のスペースが必要であることを意味します。

... PATTERNに一致する...

これは、パターン(一部のスペースを含めることができる)に一致する単語のみを選択することを意味します。

...そしてそれらをREPLACEMENTに置き換えます。

選択したパターンが置き換えによって置き換えられることを意味します。


写真は千の言葉の価値があります。

PATTERN = Xの場合:

           +----  SEPARATORS  ----+
           |                      |
   +-------+-------+     +--------+------+
   |               |     |               | 
X  space space space  X  space space space  x
|                     |                     |
+---------------------+---------------------+
                      |
                   PATTERNS

PATTERN = X%の場合:

                 +----  SEPARATORS  ---+
                 |                     |
               +-+-+                 +-+-+
               |   |                 |   | 
X  space space space  X  space space space  x
|            |        |            |        |
+------+-----+        +------+-----+        |
       |                     |              |
       +---  PATTERNS  ------+--------------+

興味深いもの:

パターンで%文字を使用すると、次のように、置換でそれを再利用できます。

$(patsubst x%,y%,xa xb xc)
# Will be "ya yb yc"

ただし、%変数にスペース文字がある場合、makeはそれらを置換で削除します。

$(patsubst x%,y%,xa   xb   xc)
# Will also be "ya yb yc"

EDIT:ソースコード を読んだ後、興味深いものは次のとおりです。

これが動作です:

  1. pattern%がない場合、これは単純な置換(スペースを保持)です。
  2. それ以外の場合は、textを単語で分割し、すべてのスペースを削除します( isblank 関数を使用)。
  3. 最後に、それは交換を行います
17
jml