Функция "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: после прочтения исходный код, интересные вещи:

так вот поведение:

  1. , если не % на pattern, это простая подстановка (которая сохраняет пробелы).
  2. иначе он разделит text словами и избавиться от всех пробелов (используя isblank