Из приведенного описания следует, что цель, не имеющая пререквизитов, не устаревает только в том случае, если она соответствует файлу в файловой системе. Следовательно, цель, соответствующая несуществующему файлу, всегда будет устаревшей и может использоваться для безусловного выполнения командного сценария. Такие цели называются
Пометив цель атрибутом .PHONY, как в примерах 1.14 и 1.15, можно сказать
И наоборот, пререквизит, соответствующий существующему файлу, никогда не устаревает при условии, что этот файл не указан в качестве цели одного из правил.
Теперь давайте посмотрим на то, что происходит при выполнении make-файла из примера 1.14. Фиктивная цель all
всегда устаревшая: единственная ее цель — сказать make собрать all
, но в более сложных примерах цель all
может иметь несколько пререквизитов, правило с целью hello
говорит hello
будет устаревшей. Однако пререквизит не устарел, так как файл hello.cpp
не является целью одного из правил. Следовательно, all
обновляется, так что all
— исполняя пустой командный сценарий — и выходит.
При вызове make с аргументом командной строки, соответствующим цели, make пытается собрать эту цель. Следовательно, выполнение make install
приводит к выполнению следующих команд:
mkdir -p binaries
cp -p hello binarie
s
Первая команда создает, если она не существует, директорию make clean
вызывает команду
rm -f hello
которая удаляет
При использовании Windows команды mkdir
, cp
и rm
, используемые целями install
и clean
, указывают на инструменты GNU, поставляющиеся в составе Cygwin или MSYS
После того как вы поймете, как
GNU
# Указываем целевой файл и директорию установки
OUTPUTFILE=hello
INSTALLDIR=binaries
# Цель по умолчанию
.PHONY all
all: $(OUTPUTFILE)
# Собрать hello из hello.cpp
$(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
# Цель по умолчанию