Полное оффициальное руководство можно найти на сайте gnu.org.

GNU Make это одна из самых простых утилит сборки. Она часто используется для сборки ПО написанного на языке Си, но может работать с любым другим языком программирования, для которого установлен компилятор.

1 Прмер сборки простейшего проекта

Предположим, что мы написали простейшую программу "wc", которая считывет из стандартного потока ввода текст, пока пользователь не нажмет Ctrl+D, и подсчитывает (соответственно) количество строк, слов и символов.

#include <stdio.h>

#define IN 1
#define OUT 0
int main (int argc, char *argv[]){
  int c, nl, nw, nc, state;
  state = OUT;
  nl = nw = nc = 0;
  while ((c = getchar()) != EOF){
    ++nc;
    if (c == '\n')
      ++nl;
    if (c == ' ' || c == '\n' || c == '\t')
      state = OUT;
    else if (state == OUT) {
      state = IN;
      ++nw;
    }
  }
  printf("%d %d %d\n", nl, nw, nc);
}

Чтобы создать из этого исходного кода исполняемый файл и запустить эту программу, нам нужно скомпилировать ее с помощью компилятора для языка Си. По умолчанию в GNU/Linux для этого используется gcc. Предположим, что наша программа wc содержится в файле wc.c. Тогда чтобы скомпилировать ее, нужно выполнить следующую команду, находясь в той директории, где хранится этот файл.

gcc wc.c -o wc

Первый аргумент для компилятора обозначает имя файла, кторый подается на вход, аргумент для флага "-o" обозначает имя файла, который будет создан в процессе компиляции.

Если мы планируем вермя от времени дорабатывать эту программу и, следовательно, относительно часто выполнять компиляцию, то разумно создать в той же директории файл, содержащий инструкции сборки для make. Этот файл должен иметь имя Makefile. Так как наша программа проста и состоит всего из одного файла, содержащего исходный код, Makefile тоже будет очень простым:

wc: wc.c
	gcc wc.c -o wc

Здесь "wc" это имя для правила сборки, а "wc.c" после двоеточия обозначает зависимость этого правила. В этом контексте это значит, что для сборки по правилу "wc" нужно, чтобы в текущей директории существовал файл wc.c. На следущей строке после отступа располагается команда, которая выполняется для сборки программы. Теперь, нашу программу wc можно скомпилировать просто вызывав make из директории в которой находится исходный код программы. Так как в этом Makefile'е всего одно правило сборки, то при вызове make выполнится именно оно.

2 Сборка более сложных проектов

Как правило, исходные тексты сложных программ разбивают на несколько файлов. Предположим, что программа, написанная на C содержится в файле program.c. Кроме того, имеется еще и файл function.c, в котором определена функция, используемая нашей программой. Таким образом, для сборки работоспособной программы необходимо cкомпилировать оба файла в нужной последовательности, а затем собрать их в один исполняемый файл. Make самостоятельно определяет эту последовательность, исходя из зависимостей, указанных для каждого правила. Так, если правило program зависит от правил program.o и function.o, они выполнятся перед выполнением правила program.

Makefile в таком случае будет иметь следующий вид (символ "#" в make является началом однострочного комметария):

# Правило для сборки исполняемого файла program.
# Имеет зависимости program.o function.o.
# Таких файлов в директории из которой выполняется сборка нет,
# однако далее определены правила сборки, в результате выполнения
# которых создаются эти файлы.
program: program.o function.o
	# следующая команда "связывает" 2 двоичных файла в один исполняемый
	gcc program.o function.o -o program

# Правило для сборки program.o
# Имеет зависимость program.c, которая предполагает наличие файла
# program.c в директории из которой выполняется сборка.
program.o: program.c
	gcc program.c -o program.o

# Правило для сборки function.o
# Имеет зависимость function.c, которая предполагает наличие файла
# function.c
function.o: function.c
	gcc function.c -o function.o

Created: 2021-11-06 Сб 18:52

Validate