Skip to content

Instantly share code, notes, and snippets.

@vasalf vasalf/make.md Secret
Last active Sep 6, 2019

Embed
What would you like to do?
Кратко про make

Краткий мануал по 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, рабочая папка должна прийти в сосотояние, в котором как будто никто никогда ничего не собирал. То есть все артефакты сборки (объектные и исполняемые файлы, лишние папки) должны быть удалены этой командой.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.