Строка Makefile с пробелами - PullRequest
0 голосов
/ 02 июня 2019
var := 'C:/some/path here' labas
all:
    @echo $(words $(var))

Возвращает 3.Как заставить его вернуть 2?Или make не работает так, как я думаю ??

1 Ответ

2 голосов
/ 02 июня 2019

Make определенно не работает так, как вы думаете, если вы думаете, что make заинтересован в кавычках любого типа :).Make игнорирует (то есть обрабатывает как обычные символы, как и любые другие) как одинарные, так и двойные кавычки практически в любой ситуации, и все заставляют функции работать в простых разделителях пробелов без учета кавычек.

В общем,не практично использовать make с любой системой, для которой требуются пробелы в именах целей.Это просто не работает: слишком много make основано на пробеле как символе-разделителе, и нет общего, общего способа избежать пробела, который работает везде.

В вашем конкретном случае вы можете подшутитькак это:

E :=
S := $E $E

path := C:/some/path here
xpath := $(subst $S,^,$(path))

var := $(xpath) labas
all:
        @echo $(words $(var))
        @echo $(subst ^,$S,$(var))

По сути, это создает переменную $S, которая содержит пробел, а затем заменяет все пробелы в переменной path каким-либо другим непробельным символом (здесь я выбрал ^ но вы можете выбрать то, что вам нравится, просто обратите внимание, что это должен быть символ, который гарантированно не появится в пути).

Теперь этот путь не содержит пробелов, поэтому вы можете использовать его с makeфункции.

Это имеет существенные недостатки: здесь видна не только сложность, но и обратите внимание, что эти пути не могут использоваться в именах целей, так как они на самом деле не существуют на диске.

В общем, выпросто не следует использовать пути, содержащие пробелы, с make.Если вы должны использовать пути, содержащие пробелы, то, скорее всего, make не подходит вам.

...