Полное оффициальное руководство можно найти на сайте 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