Команды в правилах makefile просто передаются в оболочку, поэтому цитирование абсолютно имеет значение.Это правило будет работать:
libmylib.a: ...
$(AR) $(ARFLAGS) $@ $?
, но это не будет:
libmylib.a: ...
"$(AR) $(ARFLAGS) $@ $?"
Второе не будет работать, потому что у вас, вероятно, нет ни одной команды, скажем, скажем,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 make).С другой стороны, из-за взаимодействия кавычек и пробелов эти два правила будут давать немного разные результаты:
rule3:
@echo Compiler: $(CXX)
rule4:
echo "Compiler: $(CXX)"
rule3 будет делать то же самое, что и rule1, но rule4 будет печатать строку с кучейпробела посередине.