Команды в правилах makefile просто передаются в оболочку, поэтому цитата абсолютно имеет значение. Это правило будет работать:
libmylib.a: ...
$(AR) $(ARFLAGS) [email protected] $?
, но это не будет:
libmylib.a: ...
"$(AR) $(ARFLAGS) [email protected] $?"
Второй не будет работать, потому что вы, вероятно, не имеют одну команду под названием, скажем, ar -r libx.a a.o b.o
даже если вы имеют команду ar
, которая знает, что делать с списком аргументов -r libx.a a.o b.o
.
Ваш второй пример:
@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"
немного отличается, потому что кавычки вокруг аргумента оболочки встроенной в echo
так что эти два правила:
rule1:
@echo Compiler: $(CXX)
rule2:
echo "Compiler: $(CXX)"
обычно производят то же самое вывода (если, конечно, у вас не было какой-то странной команды компилятора C++, которая имела бы, например, «>» в ее имени, и в этом случае желаемый результат был бы взломом вверх головой, чтобы кто-то назвал ваш компилятор C++ и это выходит за рамки возможностей даже GNU m ака). С другой стороны, эти два правила будут производить несколько иной выход из-за взаимодействия кавычек и пробелов:
rule3:
@echo Compiler: $(CXX)
rule4:
echo "Compiler: $(CXX)"
Rule3 будет делать то же самое, как Правиле1 но rule4 бы напечатать строку с кучей пробелов в середине.
Очень хороший ответ. Благодаря! – pic11