Skip to content

Home Программирование Базовый синтаксис Makefile
Базовый синтаксис Makefile

Итак, чтобы работать с make, необходимо создать Makefile. В make-файлах могут присутствовать следующие конструкции:

  • Комментарии. В make-файлах допустимы однострочные комментарии, которые начинаются символом # (решетка) и заканчиваются символом новой строки.
  • Объявления констант. Константы в make-файлах служат для подстановки. Они во многом схожи с константами препроцессора языка С.
  • Целевые связки. Эти элементы несут основную нагрузку в make-файле. При помощи целевых связок задаются зависимости между различными частями программы, а также определяются действия, которые будут выполняться при сборке программы. В любом make-файле должна быть хотя бы одна целевая связка.

Для правильного составления make-файла необходимо определить основную цель сборки проекта. Затем следует выявить промежуточные цели, если таковые существуют. Вернемся к примеру формирование бинарного файла printup. Чтобы его получить, требуются файлы print__up.o и main.o. Это промежуточные цели. В make-файлах за каждую цель отвечает своя целевая связка.

После определения целей нужно выявить зависимости. В нашем примере основная цель (файл printup) может быть достигнута только при наличии файлов print_up.o и main.o. А файл print_up.o может быть получен только при наличии исходного файла print_up.c  и заголовочного файла print_up.h. Аналогичным образом, файл main.o может быть получен только при наличии файлов main.c  и print_up.h

Итак, мы знаем, что в Makefile обязательны только целевые связки. Каждая целевая связка состоит из следующих компонентов:

  • Имя цели. Если целью является файл, то указывается его имя. После имени цели следует двоеточие.
  • Список зависимостей. Здесь просто перечисляются через пробел имена файлов или имена промежуточных целей. Если цель ни от чего не зависит, то этот список будет пустым.
  • Инструкции. Это команды, которые должны выполняться для достижения цели. Например, в целевой связке print_up.o инструкцией будет являться команда компиляции файла print_up.c. Каждая инструкция пишется на новой строке и начинается с символа табуляции. Обратите внимание, что некоторые текстовые редакторы (например, mcedit) по умолчанию заменяют табуляцию группой пробелов. В этом случае для редактирования Makefile следует воспользоваться другим редактором или настроить существующий. Иногда целевая связка не подразумевает выполнение каких-либо команд, а призвана только установить зависимости. В таком случае список инструкций оставляют пустым.

Теперь проверим систему в действии, организовав автосборку проекта printup из предыдущей главы. Сначала создаем Makefile.

Файл Makefile_1

# Makefile for printup 
printup: print_up.o main.о
gcc -o printup print_up.o main.о
print_up.o: print_up.c print_up.h gcc -c print_up.c
main.о: main.с
gcc -c main.с
clean:
rm -f *,o
rm -f printup

Далее вызываем утилиту make с указанием цели, которую нужно достичь. В нашем случае это будет выглядеть так:

$ make printup
gcc -с print_up.c
gcc -c main.с
gcc -о printup print_up.o main.о

Итак, проект собран. Осталось только во всем разобраться. Первая строка в Makefile — это комментарий. Затем следуют целевые связки. Первая связка Отвечает за создание исполняемого файла printup и формируется следующим образом:

  1. Сначала записывается имя цели (printup).
  2. После двоеточия перечисляются зависимости (print_up.o и main.o).
  3. На следующей строке после знака табуляции пишется правило для получения бинарника printup.

Аналогичным образом оформляются остальные целевые связки. Последняя (clean) требует особого рассмотрения:

  1. Сначала указывается имя цели (clean).
  2. После двоеточия следует пустой список зависимостей. Это значит, что данная связка не требует наличия каких-либо файлов и не предполагает предварительного выполнения промежуточных целей.
  3. На следующих двух строках прописаны инструкции, удаляющие объектные файлы и бинарник.

Эта цель очищает проект от всех файлов, автоматически созданных при сборке. Итак, чтобы очистить проект, достаточно набрать следующую команду:

$ make clean
rm -f *.o
rm -f printup

Очистка проекта обычно выполняется в следующих случаях:

  • при подготовке исходного кода к отправке конечному пользователю или другому программисту, когда нужно избавить проект от лишних файлов;
  • при изменении или добавлении в проект заголовочных файлов;
  • при изменении make-файла.

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

$ make
gcc -с print_up.c
gcc -с main.с
gcc -о printup print_up.o main.о

Иногда требуется вписать в make-файл нечто длинное, например, инструкцию, не умещающуюся в одной строке. В таком случае строки условно соединяются символом \ (обратная косая черта):

gcc -Wall -pedantic -g -о my_very_long_output_file one.о two.о \ three.о four.о five.о

Автосборщик при обработке make-файла будет интерпретировать такую конструкцию как единую строку.

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top