четверг, 7 января 2016 г.

Сборка программы из исходного кода в Debian/Ubuntu

Бывают ситуации, когда вам нужна самая свежая версия программы, но её нет в репозитории вашего дистрибутива. Или эту программу вообще туда не добавляют по каким-то причинам. Вариантов получить эту программу тут несколько, один из них - собрать программу из исходного кода, непосредственно под ваш дистрибутив. Разумеется речь идёт о программах с открытым исходным кодом :)




Сборка (компиляция) программы - это превращение её исходного кода, написанного на каком-нибудь компилируемом языке программирования (например C++), который понятен программисту, в бинарный код (последовательность нулей и единиц), который понятен центральному процессору компьютера. Не все языки программирования являются компилируемыми. Например код на языке Python, можно запускать сразу, без перевода его в бинарный код (хотя и это возможно). Для сборки программы, желательно иметь достаточно мощный, и желательно многоядерный процессор. Ни в коем случае не компилируйте программы на ноутбуках! Это крайне негативно скажется на продолжительности их жизни (они не рассчитаны на такие нагрузки, если конечно у вас не игровой ноутбук).

В сборке программы из исходного кода нет ничего сложного. Главное помнить одно правило: в пакетном дистрибутиве ни в коем случае нельзя использовать метод make install. Иначе в будущем получите большую такую кучу проблем. Когда поймёте, что хотели удалить программу (поставленную таким образом), а пакетный менеджер о ней не знает. А сама программа состоит из нескольких сотен файлов, разбросанных по разным каталогам. Страшно? Поэтому в пакетных дистрибутивах, программу нужно собирать в, собственно, пакет. Тогда её можно будет без проблем удалить, в случае чего. Я написал это потому что многие руководства по компиляции программ в Linux, которые мне попадались, описывают именно make install. Удалить программу, установленную таким образом можно только в двух случаях:

  • если у вас остался архив с её кодом (тогда можно выполнить make uninstall);
  • если исходный код программы поддерживает это.

Не используйте make install!

Отмечу, что не каждую программу можно собрать одним и тем же способом. Поэтому всегда нужно читать инструкцию по сборке, которая есть в архиве с исходным кодом. Бывает что разработчик положил туда скрипт, который при запуске делает всё сам (собирает и устанавливает, но мы помним про make install), или для сборки может не подойти make, а нужна другая система сборки. Также для сборки программы, необходимо будет установить нужные для неё сборочные зависимости (это пакеты с префиксом -dev). Для того чтобы быстро собрать программу в пакет, дабы иметь возможность без проблем её установить или удалить, существует утилита, под названием checkinstall. Она позволит создать родной для системы пакет (deb или rpm), что позволит использовать штатный пакетный менеджер для её установки/удаления

Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути, где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake. Если программа написана на Qt, то обычно она собирается либо командой qmake (естественно она должна быть установлена), либо путём открытия файла проекта в какой-нибудь IDE (обычно Qt Creator) и сборки в ней.

Сперва нужно подготовить систему. Для этого установим необходимый набор инструментов:

sudo apt install build-essential gcc devscripts git fakeroot automake autoconf

Получить исходный код можно разными способами. Скачать из интернета (например с сайта разработчика), склонировать репозиторий с исходным кодом и так далее. В первом случае, в общем-то, всё ясно. Во втором: предположим, что программа лежит в git-репозитории (на GitHub, например). Мы можем как зайти в этот репозиторий и скачать оттуда архив с кодом



так и скопировать весь репозиторий себе (как это делают разработчики). Для примера возьмём программу mgba. Это эмулятор игровой консоли Nintendo GameBoy. Адрес репозитория здесь. Копируем его себе:

git clone https://github.com/mgba-emu/mgba.git

В домашнем каталоге у вас появится директория с его исходным кодом. На той же странице программы, есть инструкция по сборке.



Внимательно читаем. Открываем терминал и переходим в каталог с исходным кодом:

cd ~/mgba

И собираем программу:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo checkinstall -D


Будут запрошены кое-какие данные (имя пакета, версия и так далее. Желательно заполнить все поля). После сборки, в директории выше (то есть в mgba), появится deb-пакет с программой. Теперь его можно просто установить двойным кликом или командой sudo dpkg -i имяпакета.deb . Если во время сборки у вас начали появляться сообщения об ошибках - внимательно их читайте. Возможно не хватает каких-либо сборочных зависимостей.

Возьмём немного другой пример, в котором используется конфигуратор. В таком случае, в директории с исходным кодом, располагаются скрипты: autogen.sh, configure и подобные. Autogen.sh генерирует скрипт configure, с помощью которого уже можно сконфигурировать программу перед сборкой (да да, конфигуратор конфигуратора). Как всегда не забываем читать инструкцию по сборке той или иной программы. Предположим, что в архиве есть скрипт autogen.sh . Выполним его:

./autogen.sh

После выполнения, должен появиться файл configure. Чтобы посмотреть с какими параметрами можно собрать программу, введите:

./configure --help

Просмотрите все доступные параметры. Обычно, это могут быть поддержки различных плагинов, сборка с альтернативным интерфейсом, даже сборка под другую процессорную архитектуру. Допустим программа использует интерфейс, написанный на GTK+ 2, но имеет альтернативный на GTK+ 3. Тогда конфигурация программы будет выглядеть так:

./configure --with-gtk3

или

./configure --enable-gtk3

Всё подробно будет описано в инструкции. Есть некоторый набор стандартный опций (после ввода ./configure --help, они пишутся вначале), таких как указание пути для установки:

--prefix=/usr

После запуска configure и успешного конфигурирования кода, можно запустить сборку:

make

А далее уже:

sudo checkinstall

Вот и всё. Как видите, здесь нет ничего сложного. Хотя, не стану скрывать, бывает так, что разработчик не озаботился качественной инструкцией по сборке. Но такое бывает редко. Хочу также обратить ваше внимание на следующее: прибегайте к сборке программы из исходников только в крайнем случае. Если вы используете Ubuntu LTS, то посмотрите (при помощи гугла), нет ли необходимой вам программы (или свежей версии)  в более свежем выпуске Ubuntu. Или возможно есть PPA-репозиторий, где всегда есть свежие версии этой программы. В Debian с этим сложнее, но зачастую можно взять более свежую версию программы из ветки testing или даже unstable, и она нормально установится и будет работать. И только убедившись, что больше вариантов нет - прибегайте к компиляции. В следующий раз я напишу о профессиональном способе сборки deb-пакетов, каким пользуюсь я (и другие разработчики, собирающие пакеты для Debian-based систем). Если что-то упустил - пишите в комментариях.

Ссылки:

Ещё мануал по сборке программ
Небольшое wiki-руководство
Сборка программ в ALT Linux
Сборка программ в ROSA Linux
Установка программ из исходного кода в Arch Linux
Сборка программ в Fedora 

2 комментария:

  1. Здравствуйте. Может глупый вопрос задам, но всё же. А если собрать deb пакет в Ubuntu, а поставить в Debian? Такое допустимо? Или не стоит таким заниматься?

    ОтветитьУдалить
    Ответы
    1. Допустимо, но только установится он в Debian в двух случаях: если в пакете не указаны специфичные для Убунты зависимости, которых нет в репозиториях Debian; если пакет собран в версии Убунты, которая не новее версии Debian. То есть если вы собираете пакет в Ubuntu 16.04, то он не установится в Debian 8, так как потребует более свежие версии зависимостей. Именно поэтому разработчики проприетарных программ, которые распространяют свой софт в deb и rpm пакетах, собирают их в Debian 7 (и старше) и в CentOS 6 соответственно. Чем младше версия системы, в которой собирается пакет - тем более широкий спектр версий дистрибутива он охватит.

      Удалить