Функция "patsubst" в файле Makefile
С docs:
$(patsubst PATTERN,REPLACEMENT,TEXT)
Находит разделенные пробелами слова в тексте, которые соответствуют шаблону и заменяет их заменой. Здесь шаблон может содержать%
который действует как подстановочный знак, соответствующий любому количеству любых символов одним словом.
...
Пробелы между словами сложенный в одно пространство письмена; начальные и конечные пробелы удаляются.
теперь, учитывая 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"
Итак, очевидно, что делают, могут или могут не "сложить" все пробелы в один и один пробел.
или я сделал что-то неправильно.
1 ответов
на самом деле все объясняется в doc:
находит в тексте слова, разделенные пробелами ...
означает, что одно или несколько пробелов должны разделять слова.
... это совпадение ...
означает, что он выбирает только слова, которые соответствуют шаблону (который может включать некоторые пробелы).
... и заменяет их ЗАМЕНА.
означает, что выбранные шаблоны будут заменены заменой.
картина стоит тысячи слов.
на 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"
но когда у вас есть пробела в %
переменная, делает обнажит их в замене.
$(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