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つに「折りたたむ」ことは明らかです。と単一の空白。
または、私は何か間違ったことをしましたか?.
実際、すべては 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:ソースコード を読んだ後、興味深いものは次のとおりです。
function.c +146
:関数patsubst_expand_pat
misc.c +337
:関数find_next_token
misc.c +325
:関数next_token
これが動作です:
pattern
に%
がない場合、これは単純な置換(スペースを保持)です。text
を単語で分割し、すべてのスペースを削除します( isblank 関数を使用)。