GNU делает цитирование - PullRequest
       5

GNU делает цитирование

4 голосов
/ 20 апреля 2011

Имеет ли какое-либо значение цитирование?

libmylib.a: ...
    $(AR) $(ARFLAGS) $@ $?
# vs
libmylib.a: ...
    "$(AR) $(ARFLAGS) $@ $?"


@echo Compiler: $(CXX)
# vs
@echo "Compiler: $(CXX)"

Спасибо! * * 1004

1 Ответ

7 голосов
/ 20 апреля 2011

Команды в правилах 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 будет печатать строку с кучейпробела посередине.

...