Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: Научного журнала «Студенческий» № 41(211)

Рубрика журнала: Информационные технологии

Скачать книгу(-и): скачать журнал часть 1, скачать журнал часть 2, скачать журнал часть 3, скачать журнал часть 4, скачать журнал часть 5, скачать журнал часть 6, скачать журнал часть 7

Библиографическое описание:
Зверева М.А. СТРУКТУРА ФАЙЛА MAKEFILE В РЕАЛИЗАЦИИ GNU MAKE // Студенческий: электрон. научн. журн. 2022. № 41(211). URL: https://sibac.info/journal/student/211/274505 (дата обращения: 14.05.2024).

СТРУКТУРА ФАЙЛА MAKEFILE В РЕАЛИЗАЦИИ GNU MAKE

Зверева Мария Анатольевна

студент, кафедра математического обеспечения и стандартизации информационных технологий, МИРЭА – Российский технологический университет,

РФ, г. Москва

THE STRUCTURE OF THE MAKEFILE IN THE GNU MAKE IMPLEMENTATION

 

Maria Zvereva

student, Department of Mathematical Support and Standardization of Information Technologies, MIREA – Russian Technological University,

Russia, Moscow

 

АННОТАЦИЯ

В данной статье рассмотрены основные варианты использования утилиты make, приведен список реализаций оригинального make’а, разобрана структура makefile’а.

ABSTRACT

This article discusses the main options for using the make utility, provides a list of implementations of the original make, and analyzes the makefile structure.

 

Ключевые слова: утилита make, GNU Make, makefile, автоматизация процесса сборки, структура make-файла.

Keywords: the make utility, GNU Make, makefile, automating the assembly process, the structure of the makefile.

 

Make - утилита, автоматизирующая процесс преобразования файлов из одной формы в другую на Unix подобных устройствах, то есть устройствах, имеющих модульный дизайн, в котором каждая задача выполняется отдельной утилитой, взаимодействие осуществляется через единую файловую систему, а для работы с утилитами используется командная оболочка.

Изначально утилита make предназначалась для автоматизации сборки исполняемых программ и библиотек из исходного кода, в настоящее время она повсеместно используется для сборки ПО из исходников.

Оригинальный make был создан в апреле 1976 года Стюартом Фельдманом в Bell Labs (крупный исследовательский центр в области телекоммуникаций, электронных и компьютерных систем).

Основная задача утилиты: по заданной спецификации (цель-зависимости-команда), находить отсутствующие или устаревшие цели и собирать их. Но сборка программ не единственный процесс, в котором мы прибегаем к рассматриваемой утилите. Вот список примеров использования:

  • make install (установка зависимостей)
  • make test (запуск тестов)
  • make start (запуск проекта)
  • make deploy (развертывание)
  • make docs (генерация документации)
  • make dump_restore (развертывание дампа)

На сегодняшний день существует огромное количество реализаций оригинального make’а со своими расширениями. Вот список некоторых из них:

  • GNU Make (стандартная реализация make для Linux и macOC)
  • nmake (инструмент командной строки, разработанный компанией Microsoft, обычно является частью Visual Studio)
  • BSD Make (Berkeley Software Distribution или Berkeley Standard Distribution - операционная система, основанная на Research Unix)
  • Kati (это замена Google GNU Make, которая использовалась в сборках OC Android)
  • Mk (разработан на замену оригинального make’а в Research Unix, начиная с операционной системы Plan 9 от Bell Labs)

Рассмотрим подробнее самую распространенную на сегодняшний день реализацию make’а – GNU Make, которая широко используется по всему миру.

Использование make’а в GNU Make можно представить в виде некой структуры: make [-f makefilename] [target], где makefilename – имя make-файла. В случае, когда имя не указано, файл ищется по цепочке GNUmakefile -> makefile -> Makefile. Target – цель в make-файле, которую необходимо «достичь».

Makefile состоит из правил (явных и неявных), определений переменных, директив и комментариев.

Для начала рассмотрим простейший make-файл:

all:

g++ -std=c++14 main.cpp –o hello

где all – это цель, зависимостей нет, выполняемая команда собирает из исходника main.cpp при помощи компилятора g++ программу hello.

Теперь перейдем к рассмотрению явных правил, а именно, к их структуре:

targets: prerequisites

commands

где targets – это цели (их может быть несколько), prerequisites – зависимости (другие цели), commands – выполняемые команды, отделяемые от начала строки одним Tab’ом (\t), при этом пробелы игнорируются.

Target – это желаемый результат, способ достижения которого описан в правиле. Целью может быть имя файла, цель может быть абстрактной (phony targets), в таком случае ее имя не должно совпадать с каким-либо из файлов/директорий в каталоге. Если цель не задана в параметрах вызова make, то в качестве цели по умолчанию (default goal) используется первая цель в файле.

Существуют общепринятые стандартные цели, рассмотрим некоторые из них:

  • all – для сборки нескольких программ
  • clear (clean) – очистка от файлов, созданных make’ом
  • install – установка программы
  • uninstall – удаление программы

 Dependency (Prerequisites) – это другие файлы или абстрактные цели, от которых зависит текущая цель. Если цели и зависимости не существует или время модификации зависимости позднее цели, то выполняется поиск и выполнение соответствующей цели, что позволяет выполнять инкрементальную компиляцию, т.е. не компилировать повторно файлы, в которых не было изменений, что ускоряет время сборки.

Сommands (команды) – инструкция для выполнения действий компьютером, которые отделяются табуляцией, при необходимости переносятся на новую строку с помощью знака «\», выполняются в случае, когда изменились зависимости, т.е. когда файлы, от которых зависит цель имеют более позднее время модификации, чем файл-цель. Также существуют некие «приставки» к командам:

  • «@» – указывает не выводить команду в терминал
  • «-» – указывает игнорировать ошибки при их возникновении

Как говорилось ранее, правила также могут быть неявными, что значительно упрощает make-файл. Неявные правила (implicit rule) – это способность утилиты самой «догадываться» об использовании нужных команд для преобразований файлов в нужные расширения.

Перейдем к рассмотрению переменных в makefile’е, которые, как правило, используются для сокращения кода, пишутся в верхнем регистре и с большой буквы. При объявлении переменных рекомендуется использовать только буквы, цифры и подчеркивание. Переменные разделяют на две разновидности: рекурсивно вычисляемые «=» – вычисляются каждый раз, упрощенно вычисляемые «:=» – вычисляются один раз при присваивании. Кроме того, существуют автоматические переменные и специальная переменная VPATH.

Переменная VPATH – определяет список путей списка. Например: VPATH = src headers. Данное выражение указывает искать файлы, которые не найдены в текущем каталоге сперва в каталоге src, если там не найдено, то в каталоге headers.

Автоматические переменные – это переменные, которые имеют значения, вычисляемые заново для каждого выполняемого правила, на основе цели и предварительных условий правила.

Список часто используемых автоматических переменных:

  • $@ – имя цели
  • $< – имя первой зависимости
  • $? – имена всех зависимостей, которые новее цели
  • $^ – имена всех зависимостей

Директива — специальная команда, указывающая компилятору на особенности обработки кода при компиляции. В GNU Make используются условные директивы, также директива включения и переопределения.

Условные директивы – конструкции, которые можно свести либо к истине, либо ко лжи. Примеры условных директив:

  • Ifeq (arg1, arg2) – строки, следующие за Ifneq, выполняются, если два аргумента совпадают, в противном случае – игнорируются
  • Ifneq (arg1, arg2) – строки, следующие за Ifneq, выполняются, если два аргумента не совпадают, в противном случае – игнорируются
  • Ifdef variable-name – если содержащийся аргумент является истинным, то условие также становится истинным
  • Ifndef variable-name – если содержащийся аргумент является ложным, то условие становится истинным
  • else – указывает на выполнение следующих строк, если предыдущие не выполнились
  • endif – завершает условие

Include – директива включения, которая позволяет приостанавливать чтение текущего make-файла и читать один или несколько make-файлов перед продолжением.

Override – директива, предназначенная для установки переменной в makefile, даже если она была установлена с помощью аргумента command.

В данной статье была рассмотрена утилита make, варианты ее использования, а также основные составляющие make-файла в реализации GNU Make.

 

Список литературы:

  1. Makefile – Директивы [Электронный ресурс]. – Режим доступа: https://inlnk.ru/oe0ZJN. Последнее обновление – 19 июня 2018 г. – Дата обращения: 14.12.2022.
  2. Руководство по GNU Make, Глава 2 – Введение в Makefile, пункт 2.3 Как make обрабатывает Makefile GNU Make [Электронный ресурс]. – Режим доступа:  https://goo.su/sm259n. – Дата обращения: 12.12.2022.
  3. Руководство по GNU Make, Глава 3 – Написание файлов Makefile, пункт 3.1 Что содержат файлы Makefile [Электронный ресурс]. – Режим доступа: https://goo.su/Y1E6. – Дата обращения: 13.12.2022.
  4. Руководство по GNU Make, Глава 4 – Правила написания, пункт 4.2 Синтаксис правил [Электронный ресурс]. – Режим доступа: https://goo.su/TDlnm0. – Дата обращения: 13.12.2022.

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.