Краткий мануал по make
NB: Это пересказ того, что было на паре, а на паре был очень краткий ликбез. Для полноты ощущений знаний рекомендуется пройти какой-нибудь более полный ликбез. Например, много таких мануалов висят на вики у Артура Гулецкого.
Синопсис
all: hello
hello: hello.o file.o
gcc hello.o file.o -o hello
hello.o: hello.c file.h
gcc -c hello.c -o hello.o
file.o: file.c file.h
gcc -c file.c -o file.o
clean:
rm -f file.o hello.o hello
Что происходит
На нашем уровне понимания, пока у нас в Makefile
есть три вида сущностей:
- Цели. Цели — это то, что стоит перед двоеточием. Цель — это что-то, что мы будем пытаться собрать.
Например, целью может быть файл (например, hello
или file.o
). Но это необязательно.
- Зависимости. Зависимости — это то, что после двоеточия. Зависимость означает, что перед сборкой какой-то цели надо собрать цель-зависимость.
Например, чтобы собрать hello
, нужно сначала собрать объектные файлы hello.o
и file.o
.
Зависимость может быть также файлом, для которого мы не назначили рецепта сборки (не цель). В таком случае цель будет пересобираться, если файл изменился с момента предыдущей сборки.
Например, если мы меняем hello.c
и пересобираем наш проект, будет пересобран hello.o
, но не file.o
. Если поменяем file.h
, пересоберутся оба объектных файла.
- Рецепты. Рецепты — это то, что идёт после цели. Несколько (возможно, 0) строчек, рассказывающих, какие команды нужно выполнить, чтобы собрать цель.
NB: Перед каждой командой нужно ставить символ табуляции. Четыре (два, восемь?) пробелов — не вариант, работать не будет.
Как собрать
Просто набрать make
— сработает.
Когда вы набираете make
, make
найдёт в текущей папке файл с названием Makefile
и соберёт первую цель оттуда.
Кроме того, цель можно явно указать.
make all
— собрать цельall
make file.o
— собрать объектный файлfile.o
make file.o hello.o
— собратьfile.o
, потомhello.o
make clean all
— пересобрать всё с нуля
Конвенции
Это общие правила написания Makefile'ов. Их нужно соблюдать. За несоблюдение в домашке снимаются баллы.
- Файл называется
Makefile
, с большой буквы. Есть ещё несколько имён, которые подойдут, но в основном используется именно такое имя файла. - Первой целью является цель
all
. Она собирает всё, что нужно для работы вашего приложения. Но тесты (если у вас они есть) она, например, не прогоняет. - Существует цель
clean
. Если набратьmake clean
, рабочая папка должна прийти в сосотояние, в котором как будто никто никогда ничего не собирал. То есть все артефакты сборки (объектные и исполняемые файлы, лишние папки) должны быть удалены этой командой.