Вы не удивитесь, когда я произнесу следующее заклинание, которое есть в гримуаре каждого пользователя Linux:

./configure 
make 
[sudo] make install 

Знакомо, правда? Я знаю, что мы все много набирали его и запомнили бы его как то заклинание, которое предполагается произносить всякий раз, когда мы хотим установить какое-то новое программное обеспечение.

Только недавно, когда я начал работать над Syscoin (альтернативой Биткойну), мне пришлось глубоко погрузиться в это волшебное заклинание и выяснить, как заставить определенные вещи работать.

Перво-наперво

«Make» и «make-файлы» входят в состав более широкого спектра инструментов C / C ++, известных как «автоинструменты».

Autotools = общее имя для autoconf + automake + libtool +….

Исследуя это впервые, я понял, что автоинструменты являются…

Это казалось довольно сложным, но при дальнейшем копании я понял, что большинство вещей, перечисленных здесь, автоматически генерируются во время процесса make, и нужно запрограммировать только несколько наборов файлов, а именно configure.ac & M Файлы akefile.am. Ниже приводится более упрощенный вариант процедуры:

Хотя меня все еще беспокоил вопрос ...

Почему используются Автоинструменты?

Как следует из названия, они изначально используются разработчиками программного обеспечения для распространения автоматически собираемого исходного кода для различных операционных систем.

Это можно лучше объяснить на примере:

Рассмотрим следующие файлы в каталоге: A.cpp, B.cpp, alpha.h и main.cpp, и они запрограммированы таким образом, что A.cpp и B.cpp имеют независимые коды C ++, alpha.h - файл заголовка. с объявлениями A.cpp и B.cpp, а main.cpp выполняет как A, так и B после импорта alpha.h. Кажется, довольно легко создать исполняемый файл из этих файлов, выполнив следующую команду в терминале:

g++ main.cpp A.cpp B.cpp -o Alphabets

Он компилирует файл main.cpp и создает исполняемый файл под названием «Alphabets». А теперь представьте, насколько сложно и утомительно было бы создать исполняемый файл из терминала, если бы было около 100 различных файлов cpp и заголовков (как обычно в реальных проектах), именно здесь в игру вступают автоинструменты.

Чтобы решить эту проблему, нам нужно всего лишь написать один файл под названием «Makefile» со всеми «правилами» и «рецептами» для компиляции. Это по своей сути уменьшает количество строк кода, которые мы должны использовать для выполнения только команды сборки / компиляции, а также сокращает время компиляции. Он делает это путем компиляции только файлов, которые были изменены в этом проекте, и не выполняет уже созданные файлы, звучит впечатляюще, да? ;-)

Как работает заклинание ..

Поскольку я не маг, я могу беззастенчиво нарушать «кодекс фокусника», который гласит, что «маг никогда не раскрывает свои секреты», и проводить вас через весь «процесс создания» на основе моих исследований. Процесс в основном состоит из следующих 3 этапов: настройка, сборка и установка программного обеспечения.

1. Настроить

Как следует из названия, сценарий configure отвечает за проверку особенностей системы, на которой создается пакет. Поскольку большинство программ Unix в основном написаны на C / C ++, он проверяет, есть ли в системе компилятор C, где его найти и соответствует ли он версии компилятора, необходимой для сборки программы.

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

Он также компилирует configure.ac и Makefile.am с помощью autoconf и automake соответственно и создает Makefile.in, который в дальнейшем создает специальный файл Makefile для конкретной системы (см. Статью Дэвида диаграмму выше).

2. Сборка

После того, как configure завершит свой проект, мы можем использовать make для сборки нашей системы, она запускает серию задач, определенных в Makefile, для сборки готовой программы из ее исходного кода.

Любой загружаемый вами пакет не поставляется с полным Makefile, вместо этого он поставляется с шаблоном под названием Makefile.am, и скрипты configure используют его для создания Makefile, адаптированный к вашей системе.

Если вы когда-нибудь открывали сценарий configure или Makefile.am, вы могли убедиться, что это тысячи строк плотного сценария оболочки. Иногда эти вспомогательные сценарии длиннее исходного кода устанавливаемой ими программы.

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

3. Установить

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

Команда make install делает это за нас, поскольку она копирует определенные двоичные файлы, документацию, библиотеки и т. Д. В их конечные места назначения, как это запрограммировано разработчиком.

Обычно это означает, что двоичный файл программы будет скопирован в каталог на вашем PATH, справочная страница программы будет скопирована в каталог на вашем MANPATH и любые другие файлы, которые он зависит от того, будет надежно храниться в соответствующем месте.

Правило установки часто записывается в Makefile, и путь, по которому установлено программное обеспечение, может изменяться в зависимости от параметров, переданных в сценарий настройки, или вещей, обнаруженных сценарием configure. о вашей системе, когда она была запущена.

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

Заключение

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

Ознакомьтесь с документацией Makefiles и autotools на веб-сайте GNU make, поскольку она содержит огромное количество программ, которые могут быть включены в процесс make, чтобы помочь вам еще больше.

Это отличное руководство, чтобы понять, как понять и даже написать свои собственные файлы Makefile: https://gist.github.com/Rishabh42/af302ce49b19583fb753da6c864ec670

Благодарим isaacs за то, что он написал такое подробное руководство!

С учетом сказанного, наслаждайтесь процессом «make» :)