конечный пробел в переменной Makefile - PullRequest
2 голосов
/ 02 февраля 2012

Makefile:

#there is a whitespace after "/my/path/to"
FOO = "/my/path/to"
BAR = "dir"

INCLUDE_DIRS = $(FOO)/$(BAR) "/another/path"

INCLUDES = $(foreach dir,$(INCLUDE_DIRS),-I$(dir))

all:
     @echo $(INCLUDES)

С Gnu make я ожидаю, что мои $ (ВКЛЮЧАЕТ) будут:

-I/my/path/to/dir -I/another/path

Однако, если строка

FOO = "/my/path/to"

заканчивается пробелом (что является распространенной «ошибкой»), переменная FOO будет содержать пробел, а результирующий INCLUDES будет содержать три каталога (два первых, разделенных первым):

-I/my/path/to -I/dir -I/another/path

Единственное решение, которое я нашел, это использовать функцию полосы:

FOO = $(strip "/my/path/to" )

Но нет ли более естественного синтаксиса или какого-либо способа избежать этой ловушки?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Прежде всего, обратите внимание, что, вероятно, не должно быть двойных кавычек вокруг путей.В вашем примере я предполагаю, что значение $(FOO)/$(BAR) будет "/my/path/to"/"dir" вместо ожидаемого /my/path/to/dir.

Отвечая на ваш вопрос, вообще говоря, нет.Объединение двух значений сохраняет пробелы, поэтому, если вы хотите написать $(FOO)/$(BAR), вы должны гарантировать, что и $(FOO), и $(BAR) являются отдельными словами без начальных или конечных пробелов.Функция strip достаточно хороша для удаления последней (если есть).

Однако вы можете рассматривать одну из этих переменных как список и писать что-то вроде $(FOO:%=%/$(BAR)), и это будет работать нормально.Но лично я предпочел бы проверить значение FOO (либо исправить его, либо с ошибкой, если оно плохое), а затем использовать его как обычно, например:

FOO = /my/path/to # <- a space!
BAR = dir

...

ifneq ($(word 2,[$(FOO)]),)
  $(error There is a whitespace inside the value of 'FOO')
endif
0 голосов
/ 03 февраля 2012

На основе решения Эльдара Абусалимова, вот функция, которую можно использовать в цикле для проверить несколько каталогов на наличие пробелов:

FOO = /my/path
BAR = to # <- a space!
BAZ = dir

# $(call assert-no-whitespace,DIRECTORY)
define assert-no-whitespace
  $(if $(word 2,[$($1)]),$(error There is a whitesapce inside variable '$(1)', please correct it),)
endef

CHECK_FOR_WHITESPACE = \
  FOO \
  BAR 

$(foreach dir,$(CHECK_FOR_WHITESPACE),$(call assert-no-whitespace,$(dir)))

all:
  @echo $(FOO)/$(BAR)/$(BAZ)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...