Linux как собрать программу из исходников
Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT, которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное
но зато позволит сохранить систему в чистоте. Удалить программы, установленные командой make install, можно только командой
но не все исходники это поддерживают, а что ещё чаще - исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).
APT не знает ничего о программах, установленных вручную. Соответственно, могут быть конфликты, или просто непонятные ошибки.
Очень часто исходники по умолчанию «рассчитаны» на определённый дистрибутив, или, наоборот, рассчитаны только на установку из исходников, при этом выполняются разного рода «удобные» настройки в конфигурационных файлах. Так, например, очень любят прописывать mime-типы. Но проблема в том, что переводы разные бывают и в Nautilus может выскочить ошибка
и документ не будет открываться. Таких «недочётов» может быть очень много. А теперь, если представить что это удалить нельзя, поскольку пользователь не запоминал что и куда поставилось, наступает паника и как результат - переустановка.
Использовать программу checkinstall . Она собирает всё в один пакет. К сожалению, она позволяет решить только вопрос с удалением программы. И даже если APT будет знать, что программа установлена, он в лучшем случае сообщит, что есть конфликт файлов,
Чаще всего такие случаи очень корректно разрешаются путём удаления конфликтного пакета. Но на разбор ситуации уйдёт некоторое время.
Cобрать нормальный пакет, как это делают мантейнеры. В котором будет корректная версия, зависимости и расположение файлов будет соответствовать политике дистрибутива. Вижу вам всё ещё интересно . Это радует.
Возможны следующие случаи сборки пакетов:
исходники или бинарные файлы берутся:
доступная версия программы по каким-либо причинам не устраивает (не устраивает код или данные программы, параметры конфигурации или управляющая информация пакета);
Первым делом смотрю, нет ли deb-пакета той же версии, но допустим под Debian. Если есть делаю так: есть нужная версия пакета в репозитории debian или в будущем релизе Ununtu
Если нет той же версии, но есть предыдущей. Тут можно сказать как повезёт, если изменения в исходниках не коснулись положения файлов, то скорее всего дебианизация от старого пакета подойдёт, нужно лишь сменить версию. Теперь вариант в репозитории есть пакет предыдущей версии.
Ну и самый страшный случай - нигде никаких deb-пакетов нет, только tar.gz и rpm. Ни в коем случае не использовать rpm! Делаем по первому варианту.
Что необходимо
Полное Руководство начинающего разработчика Debian доступно тут.
К сожалению, на русском, информация немного устарела, свежая инструкция доступна на английском. Но принципы не изменились, поэтому если интересны детали лучше прочитать руководство от и до.
Нам понадобятся как минимум программы, устанавливаемые командой
Можно так же autobook - это документация по утилитам GNU Autoconf , Automake , и Libtool . Ну и конечно то, что требуют сами исходные коды для корректной сборки.
Создание ключа шифрования
Этот шаг не обязателен, его можно пропустить.
Чтобы создать ключ, зайдите в Приложения → Стандартные → Пароли и ключи шифрования. В открывшемся окне, в меню Ключ → Новый ключ, выбираем ключ pgp. Заполняем поля Полное имя и Электронный адрес.
В мире свободного программного обеспечения, для предотвращения «краж» или «подделок», принято подписывать свои «ценные» вещи электронным ключом, открытая часть которого хранится на общедоступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи.
Поэтому отнеситесь к созданию ключа очень ответственно.
Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие-нибудь личные данные, но если вас не разыскивает интерпол - думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник В общем, решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете.
Хотя последняя версия программы seahorse имеет демон, который автоматически запускается в сеансе GNOME, и умеет «запоминать пароль» на время сеанса, но пока не все программы умеют с ней работать.
Итак, вы создали ключ - теперь его можно будет использовать при создании пакетов.
Для этого, в файл ~/.bashrc, или в другой стартовый скрипт, вашего любимого шелла (для zsh ~/.zshrc), нужно вписать переменные
На основании e-mail будет искаться ключ в pgp, при подписи пакета.
Нужно завершить сеанс и зайти заново, чтобы изменения вступили в силу.
Помните, что если вы бэкпортируете пакет, дебианизированный не вами, обязательно нужно изменить версию командой
для того, чтобы в изменения вписался ваш e-mail. А для того, чтобы ваш открытый ключ попал на сервер, необходимо в настройках «seahorse → Пароли и ключи шифрования», настроить соединение с сервером публичных ключей.
Для этого, в меню Правка→Параметры на закладке Публикация ключей необходимо поставить галку Публиковать ключи….
Теперь можно выбрать ключ и в меню по правой кнопке выбрать Синхронизировать и опубликовать ключи.
Дебианизация недоступна
Итак, у нас есть только gcoolprog-0.5.3.tar.gz.
Обычно я выполняю следующие действия:
Предварительно подготавливаю рабочую директорию
Получаем файл gcoolprog-0.5.3.tar.gz. Распакуем его перейдем в полученный каталог:
Ниже будем считать директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3 корневой директорией исходников.
Далее выполняем «черновую» сборку. Т.е. сконфигурируем и соберем приложение, без его установки:
Если команда выполнилась успешно, то осталось только дебианизировать.
Дебианизация
Ничего страшного в этом нет, как я уже говорил есть скрипты, которые сильно упрощают этот процесс.
Вообще смысл всей этой процедуры - создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами).
Для этого, в корне исходных текстов, выполним
На что мы должны получить следующий диалог
Тут мы указываем сформировать пакет, для одиночного бинарного файла.
Но мы с вами молодцы и всё у нас прошло без ошибок - появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение .ex) с примерами на все случаи жизни.
Будем считать, что программа у нас простая – обычно ни один из этих файлов не нужен.
Первым делом, нужно добавить описание программы в файле debian/control
без этого мы получим пустой пакет.
Иногда debian/rules содержит лишь:
Что приемлемо с использованием debhelper.
Этих настроек будет достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share.
Сборка пакета
Теперь, соберём пакет:
В директории выше, т.е. в ~/src/gcoolprog/0.5.3, мы получим файлы
Вот теперь мы можем установить пакет
Дебианизация берётся из репозитория Ubuntu, из PPA или из Debian
Дебианизация берётся из другой версии программы
Как я уже сказал, возможно нам повезёт и достаточно будет только сменить версию. Но не будем гадать.
Ниже я не буду комментировать то, что описано в предыдущем решении.
Предварительно подготовим рабочую директорию
получаем файл gcoolprog-0.5.3.tar.bz2
теперь распаковываем его
копируем каталог gcoolprog-0.5.1/debian в директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3
дальше нам нужно изменить версию командой
этой командой изменяется файл debian/changelog например увидим
но поскольку у нас версия 0.5.3, то нужно изменить значения на
сохраните изменения. Теперь можно выполнить команду сборки в пакет.
Дебианизация берётся из текущей версии программы
Дебианизация берётся не из репозитория текущего выпуска Ubuntu
Предварительно подготовим рабочую директорию
теперь скачиваем три файла
или тоже самое, но одной командой
из пакета devscripts
затем распакуем командой
получим каталог gcoolprog-0.5.3.Перейдём в него и сменим версию:
теперь можно собирать пакет
Дебианизация берётся из репозитория текущего выпуска Ubuntu
В случае, когда для нужной версии программы имеется пакет в репозитории текущего выпуска Ubuntu, но он по каким-либо причинам не устраивает и в его исходники нужно внести изменения (например, применить какой-нибудь патч) и пересобрать, основываясь на уже имеющейся в пакете дебианизации, можно поступить следующим образом.
Для сборки понадобятся следующие пакеты: build-essential devscripts fakeroot. Потребуются также пакеты для разработки, мы их установим в дальнейшем.
apt-get source скачивает исходники из репозитория Ubuntu в текущую директорию. Многие пакеты в репозитории имеют общие друг с другом исходники, поэтому кроме исходников выбранного пакета могут скачаться и исходники других пакетов (общие для нескольких пакетов исходники).
Далее вносим изменения в исходники и собираем из них обратно пакеты.
Устанавливаем необходимые для сборки пакеты для разработки:
Ниже идёт пример как можно поступить в случае, если доступен только deb-пакет и нет его дебианизированных исходников.
Предположим, что работаем в каталоге ~/tmp. Создадим подкаталог ~/tmp/someprog, чтобы распаковать файлы какого-нибудь пакета, нужно выполнить
Для того, чтобы извлечь контрольную информацию, выполним
ну а теперь, чтобы всё это собрать обратно в пакет, нужно выполнить
В каталоге ~/tmp/someprog/DEBIAN содержатся файлы, описывающие, что это за пакет, от чего он зависит, и контрольные суммы файлов, находящихся в нём. Для того, чтобы собрать свой пакет, нужно поместить файлы в каталоге ~/tmp/someprog так, как будто это корневой каталог.То есть, если нужно, чтобы файл установился в /usr/bin,нужно его поместить в каталог ~/tmp/someprog/usr/bin, ну и, соответственно, если что-то должно лежать в /etc, то в ~/tmp/someprog/etc и т.д.
Затем в ~/tmp/someprog создать каталог DEBIAN, обязательно большими буквами, и в нём файл ~/tmp/someprog/DEBIAN/control, в этом файле описывается название пакета, его зависимости и описание, формат очень простой. Например:
Ну а теперь собрать:
Этой информации достаточно, чтобы собрать/пересобрать простенький пакет. На самом деле можно ещё запускать скрипты при установке пакета, при его удалении и много чего ещё, что нужно нормальному maintainer'у.
Хороший цикл статей Цикл статей по сборке RPM и DEB пакетов , правда автор предвзято относится к сборке deb-пакетов, но если на это не обращать внимания, вполне приличный обзор.
Все программы для компьютера представляют собой набор команд процессора, которые состоят из определенного набора бит. Этих команд несколько сотен и с помощью них выполняются все действия на вашем компьютере. Но писать программы непосредственно с помощью этих команд сложно. Поэтому были придуманы различные языки программирования, которые проще для восприятия человеку.
Для подготовки программы к выполнению, специальная программа собирает ее из исходного кода на языке программирования в машинный код - команды процессора. Этот процесс называется компиляция. Linux - это свободное программное обеспечение, а поэтому исходные коды программ доступны всем желающим. Если программы нет в репозитории или вы хотите сделать что-то нестандартное, то вы можете выполнить компиляцию программы.
В этой статье мы рассмотрим, как выполняется компиляция программ Linux, как происходит процесс компиляции, а также рассмотрим насколько гибко вы сможете все настроить.
Подготовка системы
Мы будем компилировать программы, написанные на Си или С++, так как это наиболее используемый язык для программ, которые требуют компиляции. Мы уже немного рассматривали эту тему в статье установка из tar.gz в Linux, но та статья ориентирована больше на новичков, которым нужно не столько разобраться, сколько получить готовую программу.
В этой же статье тема рассмотрена более детально. Как вы понимаете, для превращения исходного кода в команды процессора нужно специальное программное обеспечение. Мы будем использовать компилятор GCC. Для установки его и всех необходимых инструментов в Ubuntu выполните:
sudo apt install build-essential manpages-dev git automake autoconf
Затем вы можете проверить правильность установки и версию компилятора:
Но перед тем как переходить к самой компиляции программ рассмотрим более подробно составляющие этого процесса.
Как выполняется компиляция?
Компиляция программы Linux - это довольно сложный процесс. Все еще сложнее, потому что код программы содержится не в одном файле и даже не во всех файлах ее исходников. Каждая программа использует множество системных библиотек, которые содержат стандартные функции. К тому же один и тот же код должен работать в различных системах, содержащих различные версии библиотек.
На первом этапе, еще до того как начнется непосредственно компиляция, специальный инструмент должен проверить совместима ли ваша система с программой, а также есть ли все необходимые библиотеки. Если чего-либо нет, то будет выдана ошибка и вам придется устранить проблему.
Дальше идет синтаксический анализ и преобразование исходного кода в объектный код, без этого этапа можно было бы и обойтись, но это необходимо, чтобы компилятор мог выполнить различные оптимизации, сделать размер конечной программы меньше, а команды процессора эффективнее.
Затем все объектные файлы собираются в одну программу, связываются с системными библиотеками. После завершения этого этапа программу остается только установить в файловую систему и все. Вот такие основные фазы компиляции программы, а теперь перейдем ближе к практике.
Компиляция программ Linux
Первое что нам понадобиться - это исходники самой программы. В этом примере мы будем собирать самую последнюю версию vim. Это вполне нейтральная программа, достаточно простая и нужная всем, поэтому она отлично подойдет для примера.
Получение исходников
Первое что нам понадобиться, это исходные коды программы, которые можно взять на GitHub. Вы можете найти исходники для большинства программ Linux на GitHub. Кроме того, там же есть инструкции по сборке:
Давайте загрузим сами исходники нашей программы с помощью утилиты git:
Также, можно было скачать архив на сайте, и затем распаковать его в нужную папку, но так будет удобнее. Утилита создаст папку с именем программы, нам нужно сделать ее рабочей:
Настройка configure
Дальше нам нужно запустить скрипт, который проверит нашу программу на совместимость с системой и настроит параметры компиляции. Он называется configure и поставляется разработчиками программы вместе с исходниками. Весь процесс компиляции описан в файле Makefile, его будет создавать эта утилита.
Если configure нет в папке с исходниками, вы можете попытаться выполнить такие скрипты чтобы его создать:
Также для создания этого скрипта можно воспользоваться утилитой automake:
aclocal
autoheader
automake --gnu --add-missing --copy --foreign
autoconf -f -Wall
Утилита automake и другие из ее набора генерируют необходимые файлы на основе файла Mackefile.am. Этот файл обязательно есть в большинстве проектов.
После того как вы получили configure мы можем переходить к настройке. Одним из огромных плюсов ручной сборки программ есть то, что вы можете сами выбрать с какими опциями собирать программу, где она будет размещена и какие дополнительные возможности стоит включить. Все это настраивается с помощью configure. Полный набор опций можно посмотреть, выполнив:
Рассмотрим наиболее часто используемые, стандартные для всех программ опции:
- --prefix=PREFIX - папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
- --bindir=DIR - папка для размещения исполняемых файлов, должна находится в PREFIX;
- --libdir=DIR - папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
- --includedir=DIR - папка для размещения man страниц;
- --disable-возможность - отключить указанную возможность;
- --enable-возможность - включить возможность;
- --with-библиотека - подобно enable активирует указанную библиотеку или заголовочный файл;
- --without-библиотека - подобное disable отключает использование библиотеки.
Вы можете выполнить configure без опций, чтобы использовать значения по умолчанию, но также можете вручную указать нужные пути. В нашем случае ./configure есть, и мы можем его использовать:
В таком случае нам необходимо установить требуемую библиотеку. Например, программа предлагает ncurses, поэтому ставим:
sudo apt install libncurces-dev
Приставка lib всегда добавляется перед библиотеками, а -dev - означает, что нам нужна библиотека со всеми заголовочными файлами. После удовлетворения всех зависимостей настройка пройдет успешно.
Сборка программы
Когда настройка будет завершена и Makefile будет готов, вы сможете перейти непосредственно к сборке программы. На этом этапе выполняется непосредственно преобразование исходного кода в машинный. Утилита make на основе Makefile сделает все необходимые действия:
Дальше осталось установить саму программу, если вы использовали опцию prefix, чтобы не устанавливать программу в основную файловую систему, то можно применить стандартную опцию make:
После этого программа будет установлена в указанную вами папку, и вы сможете ее использовать. Но более правильный путь - создавать пакет для установки программы, это делается с помощью утилиты checkinstall, она позволяет создавать как deb, так и rpm пакеты, поэтому может использоваться не только в Ubuntu. Вместо make install выполните:
Затем просто установите получившийся пакет с помощью dpkg:
sudo dpkg install vim.deb
После этого сборка программы полностью завершена и установлена, так что вы можете переходить к полноценному использованию.
Если вы устанавливали программу с помощью make install, то удалить ее можно выполнив в той же папке обратную команду:
sudo make uninstall
Команда удалит все файлы, которые были скопированы в файловую систему.
Выводы
В этой статье мы рассмотрели, как выполняется компиляция программы Linux. Этот процесс может быть сложным для новичков, но в целом, все возможно, если потратить на решение задачи несколько часов. Если у вас остались вопросы, спрашивайте в комментариях!
На завершение видео о том, что такое компилятор и интерпретатор:
Все действия в операционной системе выполняются с помощью программ, поэтому многим новичкам интересно не только использовать чужие программы, а писать свои. Многие хотят внести свой вклад в кодовую базу OpenSource.
Это обзорная статья про программирование под Linux. Мы рассмотрим какие языки используются чаще всего, рассмотрим основные понятия, а также возможности, разберем как написать простейшую программу на одном из самых популярных языков программирования, как ее вручную собрать и запустить.
1. На чем пишут программы?
Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.
Мы не будем рассматривать основы Си в этой статье. Си - сложный язык и вам понадобится прочитать как минимум одну книгу и много практиковаться чтобы его освоить. Мы рассмотрим как писать программы на Си в Linux, как их собирать и запускать.
2. Библиотеки
Естественно, что если вам необходимо вывести строку или изображение на экран, то вы не будете напрямую обращаться к видеокарте. Вы просто вызовете несколько функций, которые уже реализованы в системе и передадите им данные, которые нужно вывести на экран. Такие функции размещаются в библиотеках. Фактически, библиотеки - это наборы функций, которые используются другими программами. В них находится такой же код, как и в других программах, разница лишь в том, там необязательно присутствие функции инициализации.
Библиотеки делятся на два типа:
- Статические - они связываются с программой на этапе компиляции, они связываются и после этого все функции библиотеки доступны в программе как родные. Такие библиотеки имеют расширение .a;
- Динамические - такие библиотеки встречаются намного чаще, они загружены в оперативную память, и связываются с программной динамически. Когда программе нужна какая-либо библиотека, она просто вызывает ее по известному адресу в оперативной памяти. Это позволяет экономить память. Расширение этих библиотек - .so, которое походит от Shared Object.
Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же системное программирование linux, в основном, это Си или С++.
3. Процесс сборки программы
Перед тем как мы перейдем к практике и создадим свою первую программу, нужно разобрать как происходит процесс сборки, из каких этапов он состоит.
Каждая серьезная программа состоит из множества файлов, это файлы исходников с расширением .c и заголовочные файлы с расширением .h. Такие заголовочные файлы содержат функции, которые импортируются в программу из библиотек или других файлов .с. Перед тем. как компилятор сможет собрать программу и подготовить ее к работе, ему нужно проверить действительно ли все функции реализованы, доступны ли все статические библиотеки и собрать ее в один файл. Поэтому, первым делом выполняется препроцессор, который собирает исходный файл, выполняются такие инструкции, как include для включения кода заголовочных файлов.
На следующем этапе к работе приступает компилятор, он выполняет все необходимые действия над кодом, разбирает синтаксические конструкции языка, переменные и преобразовывает все это в промежуточный код, а затем в код машинных команд, который мы можем потом посмотреть на языке ассемблера. Программа на этом этапе называется объектный модуль и она еще не готова к выполнению.
Далее к работе приступает компоновщик. Его задача связать объектный модуль со статическими библиотеками и другими объектными модулями. Для каждого исходного файла создается отдельный объектный модуль. Только теперь программа может быть запущена.
А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.
4. Как собрать программу
Для сборки программ в Linux используется два типа компиляторов, это Gcc и Clang. Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:
sudo apt install gcc
Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:
$ gcc опции исходный_файл_1.с -o готовый_файл
С помощью опций мы говорим утилите что нужно сделать, какие библиотеки использовать, затем просто указываем исходные файлы программы. Давайте рассмотрим опции, которые будем сегодня использовать:
- -o - записать результат в файл для вывода;
- -c - создать объектный файл;
- -x - указать тип файла;
- -l - загрузить статическую библиотеку.
Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:
int main() printf("losst.ru\n");
printf("Корень: %f\n", sqrt(9));
return 0;
>
Я специально добавил функцию корня чтобы показать как работать с библиотеками. Сначала нужно собрать объектный файл. Перейдите в папку с исходниками и выполните:
gcc -c program.c -o program.o
Это этап компиляции, если в программе нет ошибок, то он пройдет успешно. Если исходных файлов несколько, то такая команда выполняется для каждого из них. Далее выполняем линковку:
gcc -lm program.o -o program
Обратите внимание на опцию -l, с помощью нее мы указываем какие библиотеки нужно подключить, например, здесь мы подключаем библиотеку математических функций, иначе компоновщик просто не найдет где есть та или иная функция. Только после этого можно запустить программу на выполнение:
Конечно, все эти действия могут быть выполнены и с помощью различных графических сред, но выполняя все вручную, вы можете лучше понять как все работает. С помощью команды ldd вы можете посмотреть какие библиотеки использует наша программа:
Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.
5. Автоматизация сборки
Когда мы рассматриваем программирование под Linux невозможно не отметить систему автоматизации сборки программ. Дело в том, что когда исходных файлов программы много, вы не будете вручную вводить команды для их компиляции. Можно записать их один раз, а затем использовать везде. Для этого существует утилита make и файлы Makefile. Этот файл состоит из целей и имеет такой синтаксис:
цель: зависимости
команда
В качестве зависимости цели может быть файл или другая цель, основная цель - all, а команда выполняет необходимые действия по сборке. Например, для нашей программы Makefile может выглядеть вот так:
program: program.o
gcc -lm program.o -o program
program.o: program.c
gcc -c program.c -o program.o
Затем вам достаточно выполнить команду make для запуска компиляции, только не забудьте удалить предыдущие временные файлы и собранную программу:
Программа снова готова и вы можете ее запустить.
Выводы
Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!
Курс программирования на Си под Linux:
Не редко необходимые пакеты можно найти только в виде исходных текстов, в данной статье описывается метод установки пакета из исходных текстов.
Программы обычно распространяются в упакованных архивах, это файлы с расширениями
Нужно понимать отличие между архиватором и упаковщиком.
Для архивации директорий и файлов используется программа tar; результатом её работы является файл с расширением .tar. Грубо говоря, это копия файловой системы - директорий и файлов с их атрибутами и правами доступа, помещённая в один файл.
Данный файл по размеру будет чуть больше, чем суммарный размер файлов, которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики - программы, которые позволяют уменьшить размер файла без потери данных.
Программа tar умеет распаковывать, поэтому не нужно вызывать gunzip, а можно просто указать программе tar, что файл нужно cначала распаковать. Например, команда
сразу распакует и разархивирует. Отличие файлов с расширениями
лишь в том, что использовались разные упаковщики, программа tar определяет метод сжатия автоматически и дополнительных опций в данном случае не требуется.
После распаковки необходимо перейти в полученный каталог, все описываемые ниже команды выполняются в каталоге с исходными текстами пакета.
Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов …на этом они остановились
Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake.
Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор; как собрать конфигуратор, описано в файле configure.in. Для сборки конфигуратора необходимо выполнить
Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:
Все эти команды используют файл configure.in. После выполнения этих команд создастся файл configure. После этого необходимо запустить конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально- может не быть)
Конфигуратор построит Makefile основываясь на полученных знаниях и файле makefile.am. Можно передать конфигуратору опции, предусмотренные в исходниках программы, которые позволяют включать/отключать те или иные возможности программы, обычно узнать о них можно командой
Также есть набор стандартных опций, вроде
, которая указывает, какой каталог использовать для установки. Для Ubuntu обычно
БЕЗ слеша в конце! Теперь можно запустить процесс сборки самой программы командой
Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент, когда команды в консоли перестанут «беспорядочно» выполняться и не будет слова error. Теперь всё скомпилировано и готово для установки.
Усилия потраченные на Правильную установку в последствии с лихвой окупятся в случае удаления или обновления устанавливаемого программного обеспечения.
Правильная установка(Вариант №1)
Установка при помощи утилиты checkinstall. Для установки выполните
Минус данного способа: checkinstall понимает не все исходники, поскольку автор программы может написать особые скрипты по установке и checkinstall их не поймёт.
Для создания и установки deb-пакета необходимо выполнить
Правильная установка(Вариант №2)
Быстрое создание deb-пакета «вручную».
Основное отличие от предыдущего способа заключается в том, что в данном случае вы создаете пакет вручную и отслеживаете все вносимые изменения. Так же этот способ подойдет вам, если исходники не поддерживают сборку пакета с checkinstall.
Создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/conffiles список всех файлов, которые должны попасть в /etc:
Установка (вариант №3)
Процедура создания deb-пакета подробно описана в данной статье.
Неправильная установка
Минус данного способа заключается в том, что если вы устанавливаете напрямую через make install, то нормально удалить или обновить пакет вы, скорее всего, не сможете. Более того, установка новой версии поверх старой, скорее всего, затрёт ваши изменения в конфигах. make install делает ровно то, что ему сказано — производит установку файлов в нужные места, игнорируя тот факт, что там что-то уже есть. После этого процесса совершенно никакой информации о том, что и куда ставилось, получить в удобоваримом виде невозможно. Иногда, конечно, Makefile поддерживает действие uninstall, но это встречается не так часто, да и не факт, что корректно работает. Кроме того, вам будет необходимо хранить для деинсталяции распакованное дерево исходников и правил сборки.
Для установки необходимо выполнить
Для удаления пакета, установленного данным способом необходимо выполнить в корневой директории исходников программы (там где вы запускали make install).
Пакеты с буквами mm в конце описания — это пакеты для C++ программ. Список для bmpx, но подойдёт почти для любой GTK2/Gnome программы. Так что если не получается собрать, то посмотрите на этот список и сверьте с тем что у вас установлено.
Не для всех программ уже есть готовые пакеты для вашего дистрибутива, также новые версии программ могут распространяться только в форме tar.gz архива или просто исходников.
У многих новых пользователей Ubuntu возникает вопрос, как же устанавливать программы или игры в формате tar.gz. Ведь менеджером пакетов они не открываются, а двойным кликом открывается архив. Дело в том, это на самом деле еще не программа, это действительно архив. Архив исходных кодов программы, и если говорить простыми словами, то это набор текстовых файлов с инструкциями на определенном языке программирования.
Чтобы все это превратилось в готовую к установке и выполнению программу нужно выполнить сборку (компиляцию). Но не бойтесь всех этих новых терминов, на самом деле все намного проще чем кажется, вам не нужно будет ничего ни писать, ни исправлять, достаточно только ввести несколько команд в терминале. В этой инструкции будет рассмотрена установка tar.gz в Ubuntu.
Подготовка системы
Готовить почти нечего, компилятор GCC уже предустановлен в системе, и уже можно переходить к сборке. Но мы хотим не просто установить программу, а так чтобы ею потом можно было управлять с помощью пакетного менеджера, например, при удалении полностью стереть все ее файлы, не оставляя мусора в системе. Поэтому придется установить дополнительные утилиты для создания и сборки пакетов Ubuntu.
Наберите следующую команду для установки этих инструментов:
sudo apt install checkinstall build-essential autoconf automake
Установка из tar gz в Ubuntu
Я предполагаю, что архив с исходниками у вас уже есть, теперь можно переходить к сборке программы и установке tar.gz Ubuntu. Неважно в какой папке будет находиться архив, главное, чтобы вы знали где. Первой командой, которую мы выполним будет переход в папку с архивом:
Дальше извлечем исходники из архива с программой:
tar -xvf имя_архива.tar.gz
И переходим в папку с только что полученными исходными файлами:
Обычно программы в Linux состоят из большого количества файлов, и при их сборке нужны различные параметры и опции, поэтому вместо того, чтобы запускать компилятор для каждого из файлов вручную, в Linux используется утилита make. Она на основе файла Makefile подбирает правильные команды компиляции для каждого файла и собирает всю программу.
Программы часто используют внешние библиотеки, а в разных дистрибутивах путь к файлам библиотек разный, поэтому перед тем, как запускать make нужно выполнить скрипт configure для проверки зависимостей. Этот скрипт можно создать на основе файла configure.in. Но это необязательно, во многих программах скрипт конфигурации не предусмотрен и программа не требует проверки зависимостей перед сборкой, тогда файла configure.in просто нет в папке с исходниками. Если так, то просто пропустите следующие инструкции и переходите к сборке.
Скрипт configure можно создать несколькими способами, сначала попытаемся выполнить следующие скрипты:
Если же этих скриптов не оказалось в исходниках, просто последовательно выполните следующие команды:
aclocal
autoheader
automake --gnu --add-missing --copy --foreign
autoconf -f -Wall
Если скрипт обнаружит что какой-то библиотеки нет (File имя_файла_библиотеки.so not found), скомпилировать пакет не получится, берем название библиотеки и ищем в Google как называется ее пакет в Ubuntu, а затем устанавливаем его через apt-get. Обычно это libимя_библиотеки или libимя_библиотеки-dev.
Например, нам не хватало libfuse.so. С помощью поисковой системы мы узнали, что эта библиотека есть в пакете libfuse. Теперь просто ее установим:
sudo apt install libfuse
Затем опять выполняете configure, чтобы посмотреть нет ли других неразрешенных зависимостей. И повторяете все до тех пор, пока не увидите слово Sucessful или Complete в конце вывода скрипта.
И только теперь установка tar.gz в Ubuntu может быть продолжена и программа собрана. Команда make скомпилирует программу из исходников, а скрипт checkinstall соберет deb пакет:
Самое сложное уже позади, на этом этапе ошибки почти никогда не возникают.
И только теперь мы получили программу, которую можно устанавливать с помощью центра приложений или в терминале. Установка с помощью dpkg будет выглядеть вот так:
dpkg -i имя_программы.deb
Точно так же ее можно установить любым доступным способом. Теперь это самый обычный пакет. Вы можете не только установить программу из tar.gz, но и скинуть готовый пакет своим друзьям.
Выводы
Вот и все. Теперь вы знаете как установить программу из tar.gz. Ну или точнее, что tar.gz это только текстовые файлы, и чтобы получить из них программу придется немного потрудиться. Вы можете собирать себе самые новые версии программ, которые хотите или даже выгружать собранные пакеты в интернет. Установка tar.gz Ubuntu, это не так уж сложно, как кажется. Если у вас остались вопросы, спрашивайте в комментариях!
Читайте также: