$(OUTPUTFILE): hello cpp
g++ -o hello hello.cpp
#Скопировать hello в поддиректорию binaries
.PHONY: install
install:
mkdir -p $(INSTALLDIR)
cd -p $(OUTPUTFILE) $(INSTALLDIR)
# Удалить hello
.PHONY: clean
clean:
rm -f $(OUTPUTFILE)
Здесь я ввел две переменные make — OUTPUTFILE и INSTALLDIR. Как вы можете видеть, значения переменным make присваиваются с помощью оператора присвоения =, и они вычисляются с помощью заключения их в круглые скобки с префиксом в виде знака доллара.
Также установить значение переменной make можно в командной строке с помощью записи
Также GNU make поддерживает $@, представляющая имя файла цели, переменная $<, представляющая имя файла первого пререквизита, и переменная $^,представляющая последовательность пререквизитов, разделенных пробелами. Используя эти переменные, мы можем еще сильнее упростить make-файл из примера 1.16, как показано в примере 1.17.
# Указываем целевой файл и директорию установки
OUTPUTFILE=hellо
INSTALLDIR=binaries
# Цель по умолчанию
.PHONY all
all: $(OUTPUTFILE)
# Собрать hello из hello.cpp
$(OUTPUTFILE) hello.cpp
g++ -o $@ $<
# Цели Install и clean как в примере 1 16
В командном сценарии g++ -o $@ $< переменная $@ раскрывается как hello, а переменная $< раскрывается как hello.cpp. Следовательно, make-файл из примера 1.17 эквивалентен файлу из примера 1.16, но содержит меньше дублирующегося кода.
make-файл в примере 1.17 может быть еще проще. На самом деле командный сценарий, связанный с целью hello, избыточен, что демонстрируется выполнением make-файла из примера 1.18.
# Указываем целевой файл и директорию установки
OUTPUTFILE=hello
INSTALLDIR=binaries
# Цель по умолчанию
.PHONY: all
all: $(OUTPUTFILE)
# Говорим make пересобрать hello тогда, когда изменяется hello.cpp
$(OUTPUTFILE): hello.cpp
# Цели Install и clean как в примере 1.16
Откуда make знает, как собирать исполняемый файл
%: %.cpp
# исполняемые команды (встроенные):
$(LINK.cpp) $(LOADLIBS) $(LDLIBS) -о $@
Правила, первые строки которых имеют вид %, известны как % действует как