Это не что-то особенное для GNU Make; скорее, make
- это , определенный POSIX для работы таким образом :
string1 = [string2]
Макрос с именем string1 определяется как имеющий значение string2 , где string2 определяется как все символы, если они есть, после <equals-sign>
, вплоть до символа комментария (#
) или без экранирования <newline>
. Любые символы <blank>
непосредственно перед или после <equals-sign>
должны игнорироваться.
Это может быть истолковано как функция, позволяющая четко создавать переменные с конечным пробелом:
FOO = stuff # this macro has two trailing spaces
BAR = something else# and this one has none
хотя, вероятно, обычно было бы яснее реорганизовать места, которые вы используете $(FOO)
, чем зависеть от того, что у него есть неясные пробелы.
Вероятно, лучший способ справиться с этим - просто избежать этого: имейте в виду, что вы не ставите комментарии к строкам определения переменных (за исключением очень редких случаев, когда намеренный пробел является явным). Вместо того чтобы писать это:
A = a # list of apples
B = b # list of bananas
C = c # list of carrots
напишите это:
# list of apples
A = a
# list of bananas
B = b
# list of carrots
C = c
Это, как правило, стиль в проектах GNU (см., Например, внизу этой страницы ), хотя я не помню, документировано ли это где-либо.
Кстати, при изучении пробелов вы, вероятно, хотите заключить в кавычки свои переменные в вашей команде echo
more:
rule:
@echo 'RESULT="$(RESULT)"'
В вашей версии echo RESULT=\"$(RESULT)\"
, $(RESULT)
не заключено в кавычки из оболочки, поэтому вкладки и несколько пробелов вводятся в заблуждение как отдельные пробелы.