Как собрать программу из исходников linux
Перейти к содержимому

Как собрать программу из исходников linux

  • автор:

Сборка приложений из исходного кода в Ubuntu

Вообще, в производных от Debian системах, в число которых входит и Ubuntu, не принято собирать приложения из исходных кодов. Этого, зачастую, можно избежать, потому как в репозиториях полно различных приложений, на все случаи жизни. По некоторым сведениям, их больше, чем во всех остальных распространённых дистрибутивах линукса.

  • ПриложенияУстановка/удаление…
  • СистемаАдмининстрированиеПрограмма управления пакетами Synaptic

Однако, бывают случаи, когда необходимое вам приложение отсутствует в репозитории, например потому, что оно ещё не стабильно, либо распространяется только в исходных кодах, либо его написал ваш сосед-программист, ну или по какой-то другой причине. Тогда придётся собирать его из исходников. Если вы обратитесь к любому руководству по сборке приложений, вы увидите три строки, известных (почти) любому пользователю линукса со стажем более полугода. А именно: Кратко о каждой из этих команд

./configure

Тогда нам на помощь придёт утилита под названием auto-apt. Она хранит информацию о заголовочных файлах, которые имеются в репозиториях и поможет вам найти, в каком пакете хранится тот или иной заголовочный файл.

Если ./configure вывела вам сообщение о недостаче заголовочного файла Xlib.h, воспользуйтесь командой Она ответит вам следующим: Это обозначает, что нужный вам файл содержится в пакете libx11-dev, относящемся к категории libdevel (пакеты для разработки) и после установки пакета (sudo apt-get install libx11-dev) будет лежать по адресу usr/include/X11/Xlib.h

Есть ещё более простой путь вызова ./configure, который сам предложит вам установить все необходимые пакеты Вам нужно будет только следить за процессом установки и изредка нажимать Y для установки необходимых пакетов.

Background

You might need to compile software depending on the language in which the program is written. Applications which require compiling are usually written in C and C++. If this is the case, you will need to install a compiler gcc which can be obtained by installing the build-essential package. Normally, you can do this by typing the following in a terminal:

and in order to run the configure and autogen.sh files that come with many programs:

Finally, you will need CheckInstall to safely insert your program in your system:

If the program is written in Java, you need a java run-time and compiler. You can install java by following the instructions on the Java page. Sometimes, a java based build tool ant is required. This package is available from the Ubuntu repositories.

If the program is written in an interpreted language like python or perl, you simply need the interpreter, which are installed by Ubuntu by default. You should be able to run the program directly, and in most cases you can install the additional python or perl programs required to run the package from the Ubuntu Repositories. Please see the note at the end of this article about interpreted languages.

Do you really need to compile?

If you are attempting to compile packages because you think the package is not available in the repository, please search for packages at the Ubuntu Package Search. Many authors also make their packages available as a Personal Package Archive (PPA), which can be added as an additional repository in your software sources. One place that many authors make their PPAs available is at Launchpad. You can also search by keyword for packages available to you from the command line (replace "<keyword>" with the actual term you are searching for of course!) by issuing following command:

Obtaining the Sources

Generally, the source packages will be available from the author’s website in an archived format. Common archive formats are tar.gz, tar.bz2 and zip. You can unarchive them using file-roller or by using the following commands:

Sometimes, you may also need to obtain cutting edge code using CVS. You will need to install the cvs utility by issuing a sudo apt-get install cvs. For example, to retrieve the NetworkManager sources, issue the following commands.

If you are installing from cvs, please see the note at the end of this article.

With many (though far from all) packages, it is possible to fetch current code from upstream using Bazaar (sudo apt-get install bzr) without having to look up the revision control location by hand. For example:

Three Stages to Compiling Packages

Most programs that need to be installed from source on Linux can be installed by using the ./configure; make; make install steps. The most difficult step is usually the ./configure step, after which the remaining steps should be easy to complete.

configure

  • It checks that your computer fulfils all the necessary requirements to build the package
  • It can help you change the default paths it looks for its requirements
  • It is used to enable/disable various options in the compiled program
  • It can change the path that the program will be installed in

You can look at the various options that your specific configure script provides you with by executing:

For example, by default the configure script installs to /usr/local. If you want to change the path, you would execute the configure script as shown below:

If you are really compiling from scratch, always read through the README and INSTALL files. You will see which pieces of software it needs, usually these are libraries and they usually have a different name in these files than in the packaging system. Then proceed to look for the package using apt-cache tool. Another trick to use if you are compiling a package already in the repositories is to install the build dependencies of the package using the command below:

This will ensure that you have all the dependencies of the package are installed, and hopefully the configure script will not complain about your system having old version of the dependencies installed, in which case you will have to compile the dependencies also.

Troubleshooting the configure

If no configure file exists at all, you might want to check for the existence of a configure.ac file (although you should, first of all, read the INSTALL and README files very carefully!). If configure.ac exists, chances are that the developer has forgot to create the final configure. To create it yourself, you need the autoconf package:

After it is installed, you can type

and, if you’re lucky, a working configure will be created.

Compiling the Package

Hopefully, the configure stage should have been completed by now and the actual compiling can begin. This can be done simply be calling:

Now if all goes well you should have a working copy of the program in the sources directory. You should try it out by running it:

If the program fails at this stage, this is probably a bug in the program. You should contact the author, and notify the author of the errors.

Installing the Package

If everything works well and you want to install the program just type:

This creates a .deb file using CheckInstall which makes removing the package at a later stage very easy.

However, if for some reason you do not want to use CheckInstall, this is the legacy way of installing (not recommended):

Notes

Interpreted Languages

  • Perl modules are usually referenced as foo::bar (for example xml::parser). However, the package is called libfoo-bar-perl (libxml-parser-perl). Searching via apt-cache can help if this naming is a bit different, for example:
  • Python modules are named python-module, so the python mysql module would be python-mysqldb. The mapping is less consistent here and apt-cache will help a lot. Doing a search like
    usually helps in getting the required python module.

Comments

For a newbie, you may consider CompilingEasyHowTo more user-friendly.

  • I was so prudent to change the page to reflect that. I hope everyone can agree.
  • Is this guide for developers or users?

CompilingSoftware (последним исправлял пользователь 162 2014-08-19 16:26:23)

The material on this wiki is available under a free license, see Copyright / License for details
You can contribute to this wiki, see Wiki Guide for details

Собираем программы из исходников(.tar.gz)

Сборку программы можно сравнить с выпечкой пирога. Чаще всего, вначале надо взять все необходимые ингридиенты (исходники),потом смешать их в нужном порядке (подготовить исходники к сборке, ./configure), а затем залить в форму и поставить в печь (запустить сборку, make). Спустя некоторое время из печи можно вынимать готовый к употреблению пирог (устанавливать готовую программу, make install).

Следует отметить, что в данном случае для выпечки необходима кухня и печь. Также и для сборки программы необходимы инструменты разработчика. Обычно это включает в себя как минимум компилятор и сопутствующие ему программы, как например утилита make. Это и есть «печь». Потребуется и место, где можно всем этим заняться — командная строка (терминал) («кухня»). Если у вас есть и кухня, и печь, то можете начинать готовить.

Итак, все свободные программы доступны в виде исходного кода. Это полуфабрикат программы. Из него легко можно собрать саму программу, а можно и использовать для создания какой-нибудь новой программы. По-английски исходный код называется source code.

Шаг 1: берём исходники

Необходимо скачать и распаковать архив с исходным кодом программы. Например, можно скачать программу hello-2.1.1. Обычно исходники следует брать с сайта разработчиков программы.

Распаковать архив можно так:
tar zxvf hello-2.1.1.tar.gz

(Не забывайте, что в большинстве случае нажатие клавиши Tab позволяет дополнить имя файла, введя лишь несколько первых символов). При этом содержимое архива будет распаковано в тот же каталог, в котором находится архив.

Перейдите в каталог с исходным кодом:
cd hello-2.1.1

Шаг 2: configure (месим тесто)

Прочитайте файлы INSTALL и README, если они есть в архиве исходного кода. В них может содержаться важная информация о том, как устанавливать и использовать программу.

В большинстве случае для подготовки исходников к сборке потребуется выполнить только одну команду:
hello-2.1.1$ ./configure

Она проверит наличие всех необходимых условий (библиотек и других программ) в Вашей системе, и приготовит исходный код к их использованию. Обратите внимание на символы «./» в начале команды. Они указывают, что необходимо выполнить команду configure из текущего каталога, то есть команду configure поставляемую вместе с исходным текстом программы, которую мы собираем.

На этом же этапе можно указать и куда именно надо ставить программу. Хотя в большинстве случаев рекомендуется ставить «самосборные» программы в каталог /usr/local, иногда это невозможно. Так, если у пользователя нет прав администратора, например на общественном компьютере, то установить программу можно только в свой домашний каталог. Чтобы установить программу в домашний каталог нужно указать дополнительный параметр команде configure:
hello-2.1.1$ ./configure —prefix=$HOME

Внимательно читайте что пишется на экране при подготовке исходников. Если всё нормально, то закончится она должна чем-нибудь вроде
config.status: creating Makefile
config.status: creating contrib/Makefile
config.status: creating doc/Makefile
config.status: creating intl/Makefile

Если же появляются какие-то сообщения об ошибках, значит чего-то на вашей «кухне» для приготовления этой программы видимо не хватает. Чаще всего какой-нибудь библиотеки. Какой — подскажет вывод программы configure

Шаг 3: make (в печь!)

Если предыдущая стадия закончилась нормально, то теперь можно ставить наш полуфабрикат в печь. То есть запускать процесс сборки программы. Обычно он происходит автоматически и управляется командой make:
hello-2.1.1$ make

Для больших программ этот процесс может занимать довольно много времени. Однако наша программа-пример hello должна собраться быстро.

Если сборка закончилась сообщением вроде этого:

make: *** [all] Ошибка 2

то значит, что-то пошло не так, и сборка не получилась. Однако чаще всего сборка заканчивается без ошибок.

Шаг 4: make install (кушать подано!)

Собственно всё. Пирог можно подавать к столу, а собранную программу устанавливать в систему. Делается это так:

hello-2.1.1$ make install

Если на шаге подготовки исходников Вы выбрали вариант установки в домашний каталог (как я), то не забудьте добавить подкаталог

/bin в переменную PATH:

Можете запускать собранную программу:

Она пишет на экран «Здравствуй, мир!«. Всё ОК.

Надеюсь, что эти инструкции будут понятны даже совсем начинающим пользователям линукс. Мне в своё время не хватало таких инструкций 🙂

P.S. Хочу, однако, заметить, что сборка из исходников несёт с собой целый ряд неудобств. Первое и наиболее существенное из них — удалять такую программу гораздо хлопотнее. В случае с hello это можно сделать с помощью команды

hello-2.1.1$ make uninstall

в каталоге с её исходным кодом, но не всегда этот каталог сохраняется в целостности, да и не все авторы программ должным образом готовят исходные тексты к make uninstall

Поэтому лучше пользоваться готовыми пакетами, поставляемые с Вашим дистрибутивом. Так, чтобы установить программу hello в Debian GNU/Linux достаточно всего одной команды:

Блог начинающего линуксоида.

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

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

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

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

Отмечу, что не каждую программу можно собрать одним и тем же способом. Поэтому всегда нужно читать инструкцию по сборке, которая есть в архиве с исходным кодом. Бывает что разработчик положил туда скрипт, который при запуске делает всё сам (собирает и устанавливает, но мы помним про 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

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

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

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

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 . Выполним его:

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *