Чарующая магия configure, make и make install
Это небольшая заметка для начинающих линуксоидов, о том что же означают эти три замечательные команды и для чего одни нужны. Начнём, как говорится, с начала. Большинство программ перед использованием надо скомпилировать, то есть преобразовать из текста понятного человеку в набор единиц и нулей, понятных компьютеру. Процесс условно разделён на три этапа: конфигурирование (configure), сборка (make) и установка (make install). Подробности под катом 🙂
./configure
Данная команда выполняет поиск необходимых для компиляции библиотек и заголовочных файлов (это для программ частично или полностью написанных на C/C++ и подобных языков), а так же настройку особых параметров или подключение специальных библиотек, в случае если ./configure обнаружит всё что ему нужно, он создаст Makefiles — файл, необходимый для сборки программы
Выполнить настройку параметров конфигуратора можно при помощи ключей и аргументов этих самых ключей, например:
./configure —prefix=/opt/my_program
При помощи ключа —prefix= Вы можете указать директорию, которая в дальнейшем будет выступать как префикс для вашей программы (то есть корневая директория). Это связанно с тем что в мире Linux и не только, существует специальная Иерархия Файловой Системы (HFS) в соответствии с которой любая программа, чтобы работать без ошибок, должна быть собрана и установлена.
В файловой системе есть три основных префикса, относительно которых большинство программ конфигурируется, а именно:
- / — корневая директория операционной системы, так называемый ROOT
- /usr — директория, в которой находятся приложения пользовательского окружения
- /usr/local — дополнительная директория для пользовательских программ, собираемых вручную, специально для того чтобы операционная система не превратилась в свалку
Если открыть любую из этих директорий, то можно увидеть очень схожую структуру, как минимум там будут папки: bin, etc, include, libs, sbin.
Если запустить ./configure без ключей, то префиксом по умолчанию (директория, в которую будет установлена собираемая программа) будет /usr/local, помните это если не можете запустить свою программу, возможно у Вас не прописан путь в PATH.
Кроме ключа —prefix в конфигураторе, как правило, имеется ещё множество других ключей, посмотреть их все можно если выполнить:
./configure —help
make
Самая важная и простая команда/программа, выполняет запуск процедуры компиляции приложения из исходного кода. Для своей работы данная программа использует специальные файлы Makefiles, в которых подробно описан процесс сборки приложения со всеми параметрами, которые мы указали конфигуратору. Результатом успешного выполнения команды make будет собранная программа в текущей директории.
make install
Данная команда выполняет непосредственную установку приложения в указанную, на этапе конфигурирования, директорию, после выполнения команды make install вы можете запустить свежеустановленную программу.
Послесловие
Чтобы не писать три команды по очереди можно написать их в одну строку:
./configure && make && make install
&& — это оператор И пришедший из языка C/C++, однако, с точки зрения оболочки он означает то, что следующую команду нужно выполнить только в случае успешного выполнения предыдущей команды, это очень удобно если один из этапов завершается с ошибкой.
На самом деле make install так же может выполнить сборку, потому как задача install зависит от задачи all (то есть непосредственно сборки приложения), это означает что этап make можно пропустить и выполнить всего две команды, если записать их в одну строку получится:
./configure && make install
Удачи Вам! И спасибо за то что дочитали!
Configure Make Install
Сначала Вам скорее всего нужно скачать архив с программой, которую Вы хотите установить.
Например, команда для скачивания python3.7:
И перейти в только что распакованную директорию
В этой директории скорее всего будет находиться скрипт configure
Configure
configure — это не команда linux а скрипт, который обычно лежит в папке к configure
Означает, что означает что префикс установки /usr ,
Бинари уходят в usr/bin
libraries в usr/lib
Проверяется наличие всего необходимого
Создается файл MakeFile
—prefix=PREFIX — папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
—bindir=DIR — папка для размещения исполняемых файлов, должна находится в PREFIX;
—libdir=DIR — папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
—includedir=DIR — папка для размещения man страниц;
—disable-возможность — отключить указанную возможность;
—enable-возможность — включить возможность;
—with-библиотека — подобно enable активирует указанную библиотеку или заголовочный файл;
—without-библиотека — подобное disable отключает использование библиотеки.
Make
.cpp файлы компилируются в .o файлы
один .h файл может использоваться несколькими .cpp файлами
makefile нужны для того чтобы печатать меньше названий файлов и опций вручную.
С их помощью можно делать build только тех файлов, которые изменились.
Make это инструмент, который вызывает компиллятор. Можно указать тот компиллятор который нужен именно Вам.
С помощью инструкций в makefile можно указать какие именно файлы нужно заново компилировать.
В директории находятся три .cpp файла, два .h файла и три .o файла, оставшиеся от прошлой компиляции.
- Example.cpp , Example.o
- Second.cpp , Second.h , Second.o
- Third.cpp , Third.h , Third.o
Все они нужны для проекта и не могут быть объединены в один файл.
Известно, что Example.cpp включает в себя файл Second.h и других зависимостей не имеет.
Мы хотим, чтобы при изменении самого Example.cpp либо его зависимости Second.h начиналась новая компиляция Example.cpp а затем новый Example.o линковался со старыми Second.o и Third.o
Для этого напишем Makefile aomake
all: simple simple: Example.o Second.o Third.o g++ Example.o Second.o Third.o — Simple Example.o: Example.cpp Second.h g++ -c Example.cpp
Отступы нужно ставить табуляцией
Смотрим на последние две строки:
Если Second.h или Example.cpp (в который включен Second.h) изменились нужно компилировать файл Example.cpp после чего получается object файл Example.o и, как видно из первых двух строк — после обновления Example.o все object файлы линкуются.
Выигрыш в этой ситуации заключается в том, что нам не нужно было перекомпилировать Second.cpp и Third.cpp мы просто перелинковали уже существующие Second.o Third.o с новым Example.o
Чтобы запустить этот файл нужно к команде make добавить опцию f и название файла
У файла Second.cpp две зависимости: Second.h и Third.h
У файла Third.cpp только одна зависимость: Third.h
Учтём эти зависимости в нашем aomake
all: simple simple: Example.o Second.o Third.o g++ Example.o Second.o Third.o — Simple Second.o: Second.cpp Second.h Third.h g++ -c Second.cpp Third.o: Third.cpp Third.h g++ -c Third.cpp Example.o: Example.cpp Second.h g++ -c Example.cpp
Ещё одной полезной опцией является j
-j — jobs Определяет число работ — jobs (commands) которые запускаются одновременно.
Если указано больше чем одна -j опция, то применяться будет последняя.
Если -j опция дана без аргументов make не будет ограничивать количество работ запускаемых одновременно. То есть запуститься сможет неограниченное количество работ одновременно.
Более подробную информацию по Makefile вы можете найти в статье «makefile tutorial»
Install
Make — это не единственный способ устанавливать программы под linux. Более того, за сорок с лишним лет существования утилиты make вышло много её версий.
Прежде чем ставить что-то по-старинке с make install — советую изучить checkinstall
⌨️ Введение в команду “./configure”: Компиляция исходного кода на Linux
Команда ./configure – это распространенный способ конфигурирования и подготовки исходного кода программного обеспечения к компиляции в системах Linux.
Эта команда обычно выполняется перед командой make, которая собственно и компилирует программное обеспечение.
Понимание опций, доступных в команде ./configure, может дать вам больше контроля над процессом компиляции и помочь вам настроить сборку под ваши конкретные нужды.
Когда вы запускаете скрипт ./configure, он выполняет несколько задач по подготовке исходного кода к компиляции.
Некоторые из основных задач, которые он выполняет, включают в себя:
- Проверка наличия зависимостей: Скрипт проверяет, установлены ли в системе необходимые зависимости, такие как библиотеки и инструменты. Если какие-либо зависимости отсутствуют, сценарий обычно сообщает об этом и останавливает процесс конфигурирования.
- Настройка параметров конфигурации: Скрипт позволяет задать различные параметры конфигурации, такие как расположение библиотек, тип установки и функции, которые должны быть включены в скомпилированное программное обеспечение.
- Создание make-файлов: После установки зависимостей и параметров конфигурации скрипт создает make-файлы, которые используются командой make для компиляции программного обеспечения. Make-файлы содержат информацию о том, как скомпилировать программу, например, расположение исходных файлов, опции, которые нужно передать компилятору, и зависимости.
- Выполнение некоторых базовых тестов: Скрипт также выполняет некоторые базовые тесты системы, чтобы убедиться, что система совместима с устанавливаемым программным обеспечением. Сюда входят тесты архитектуры системы, операционной системы и других специфических для системы деталей.
Запуск скрипта ./configure
В Linux системные пакеты могут быть установлены с помощью менеджера пакетов, а также могут быть скомпилированы из исходного кода.
Большинство исходных текстов содержат скрипт ./configure, который подготавливает исходный текст и систему перед началом компиляции.
После успешного завершения ./configure вы увидите Make-файлы, созданные в вашей системе, которые будут использоваться `make` для компиляции исходного кода и установки на вашу машину.
Вы можете увидеть файл, созданный скриптом ./configure, с помощью команды ls.
Общие параметры для ./configure
Самое основное использование команды ./configure – просто запустить ее без каких-либо опций.
Это позволит проверить наличие зависимостей и настроить сборку на использование параметров по умолчанию.
Опция –prefix позволяет указать каталог, в который будет установлено программное обеспечение.
По умолчанию программа обычно устанавливается в /usr/local/, но при желании вы можете указать другой каталог.
Например, чтобы установить программное обеспечение в /usr/local/mysoftware/, выполните следующую команду:
./configure --prefix=/usr/local/mysoftware/
Опции –with-package и –without-package позволяют указать внешние зависимости, от которых зависит программное обеспечение.
Эти опции можно использовать для указания местоположения определенных библиотек, например –with-ssl=/usr/local/ssl.
Опцию –enable-debug можно использовать для включения отладочной информации во время компиляции.
Это может быть полезно для устранения неполадок и отладки программ.
Опцию –help можно использовать для просмотра списка всех доступных опций для команды ./configure.
Кроме того, вы можете использовать переменные окружения CFLAGS и LDFLAGS для передачи флагов компилятору и компоновщику.
Например, чтобы включить дополнительные флаги оптимизации при компиляции, вы можете выполнить следующую команду:
CFLAGS="-O3" LDFLAGS="-O3" ./configure
Заключение
В заключение следует отметить, что команда ./configure является важным шагом в процессе компиляции программного обеспечения в системах Linux.
Понимание опций, доступных с помощью этой команды, может дать вам больше контроля над процессом компиляции и помочь вам настроить сборку под ваши конкретные нужды.
Важно всегда проверять наличие опций в документации к программному обеспечению, прежде чем использовать их.
Также важно отметить, что представленные выше опции являются лишь примерами, и каждый пакет программного обеспечения может иметь различные опции.
Всегда рекомендуется проверять документацию к программному обеспечению для получения наиболее точной и актуальной информации о доступных опциях для команды ./configure.