rm -f hello.exe
Команды и списки целей или пререквизитов могут занимать несколько строк текста make-файла, для чего используется символ продолжения строки \, как и в исходных файлах С++.
Чтобы собрать исполняемый файл, установите переменные среды, необходимые для инструментов командной строки, перейдите в директорию, содержащую makefile , и введите make . Чтобы скопировать исполняемый файл в поддиректорию binaries , введите make install . Чтобы удалить из директории make-файла исполняемый файл и промежуточный объектный файл, введите make clean .
Если вы установили среду Cygwin, описанную в рецепте 1.1, можете выполнить make-файл из примера 1.15 непосредственно из оболочки Windows cmd.exe .
Также этот make-файл можно выполнить из оболочки Cygwin, как описано далее. В cmd.exe запустите vcvars32.bat , устанавливающий переменные среды Visual С++. Затем запустите cygwin.bat, запускающий оболочку Cygwin. Если директория установки Cygwin добавлена в PATH, то оболочку Cygwin можно запустить из cmd.exe , просто введя cygwin. Наконец, перейдите в директорию, содержащую make-файл, и введите make.
Аналогично можно выполнить make-файл из оболочки MSYS: в cmd.exe запустите vcvars32.bat , затем запустите msys.bat, запускающий оболочку MSYS.
Если ваш инструментарий предоставляет сценарий для установки переменных среды, запуск make-файла из Cygwin или MSYS несколько более трудоемок, чем его запуск из cmd.exe. Однако для некоторых make-файлов это обязательное условие, так как они не будут работать из-под cmd.exe .
Обсуждение
В нескольких последующих рецептах вы увидите, что GNU make является достаточно мощным инструментом для сборки сложных проектов. Но что же она делает? Вот как она работает. При вызове make без аргументов она просматривает текущую директорию в поисках файла с именем GNUmakefile , makefile или Makefile и пытается собрать первую содержащуюся в нем цель, которая называется целью по умолчанию ( default target ). Если цель по умолчанию не устарела, что означает, что она существует, все ее пререквизиты существуют и ни один из них не был изменен с момента ее сборки, то работа make закончена. В противном случае она пытается сгенерировать цель по умолчанию из ее пререквизитов, выполнив соответствующий командный сценарий. Аналогично определению устаревания этот процесс рекурсивен: для каждого устаревшего пререквизита make ищет правило, содержащее этот пререквизит в качестве цели, и начинает весь процесс заново. Так продолжается до тех пор, пока цель по умолчанию не будет обновлена или пока не возникнет ошибка.
Из приведенного описания следует, что цель, не имеющая пререквизитов, не устаревает только в том случае, если она соответствует файлу в файловой системе. Следовательно, цель, соответствующая несуществующему файлу, всегда будет устаревшей и может использоваться для безусловного выполнения командного сценария. Такие цели называются phony targets ( фиктивными ).
Пометив цель атрибутом .PHONY, как в примерах 1.14 и 1.15, можно сказать make, что цель не соответствует файлу, и, таким образом, она всегда должна собираться заново.
И наоборот, пререквизит, соответствующий существующему файлу, никогда не устаревает при условии, что этот файл не указан в качестве цели одного из правил.
Теперь давайте посмотрим на то, что происходит при выполнении make-файла из примера 1.14. Фиктивная цель allвсегда устаревшая: единственная ее цель — сказать make собрать hello.exe . В таком простом make-файле нет необходимости в цели all, но в более сложных примерах цель allможет иметь несколько пререквизитов, правило с целью helloговорит make собрать, если требуется, hello с помощью g++ . Если предположить, что текущая директория не содержит ничего, кроме файлов makefile и hello.cpp , цель helloбудет устаревшей. Однако пререквизит не устарел, так как файл hello.cpp существует и так как hello.cppне является целью одного из правил. Следовательно, make для компиляции и компоновки hello.cpp вызывает g++ , генерируя тем самым файл hello . Пререквизит цели allобновляется, так что make собирает цель all — исполняя пустой командный сценарий — и выходит.
Читать дальше