Компиляция и установка программ из исходников Сравнение версий

Различия

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

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:programs_installation [2012/05/29 19:47]
[Немного теории сборки]
wiki:programs_installation [2014/03/13 17:39] (текущий)
[Ссылки] +ссылка
Строка 1: Строка 1:
-====== Компиляция и установка программ из исходников ======+====== Компиляция и установка программ из исходников====== 
 +Не редко необходимые пакеты можно найти только в виде исходных текстов,​ в данной статье описывается метод установки пакета из исходных текстов. 
 +======Распаковка====== 
 +Программы обычно распространяются в упакованных архивах,​ это файлы с расширениями <​code><​some_app_name>​.tar.gz ​ (иногда .tgz) 
 +<​some_app_name>​.tar.bz2 </​code>​Нужно понимать отличие между архиватором и упаковщиком.
  
-=====    Краткое описание руководства ​=====+Для архивации директорий и файлов используется программа **tar**; результатом её работы является файл с расширением **.tar**. 
 +Грубо говоря,​ это ​копия файловой системы - директорий и файлов ​с их атрибутами и правами доступа,​ помещённая в один файл.
  
-===== Необходимое программное обеспечение =====+Данный файл по размеру будет чуть больше,​ чем суммарный размер файлов,​ которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики - программы,​ которые позволяют уменьшить размер файла без потери данных. 
 + 
 +Программа **tar** умеет распаковывать,​ поэтому не нужно вызывать **gunzip**, а можно просто указать программе **tar**, что файл нужно cначала распаковать. 
 +Например,​ команда <code bash>tar -xvf <​some_app_name>​.tar.gz</​code>​сразу распакует и разархивирует. Отличие файлов с расширениями<​code><​some_app_name>​.tar.gz</​code>​и<​code><​some_app_name>​.tar.bz2</​code>​лишь в том, что использовались разные упаковщики,​ программа **tar** определяет метод сжатия автоматически и дополнительных опций в данном случае не требуется. 
 + 
 +После распаковки необходимо перейти в полученный каталог,​ все описываемые ниже команды выполняются в каталоге с исходными текстами пакета. 
 +<code bash>cd <​имя_пакета>​*</​code>​ 
 +======Сборка пакета====== 
 +Для сборки программ в GNU/Linux используется (в основном) программа **make**, которая запускает инструкции из **Makefile**,​ но поскольку дистрибутивов GNU/Linux много, и они все разные,​ то для того чтобы собрать программу,​ нужно для каждого дистрибутива отдельно прописывать пути,​где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать **Makefile**. Поэтому придумали конфигураторы,​ которые "​изучают"​ систему,​ и в соответствии с полученными знаниями создают **Makefile**. ​Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов =)...на этом они остановились :-) 
 + 
 +Для сборки нам нужны компиляторы:​ они прописаны в зависимостях пакета **build-essential**,​ так что достаточно установить его со всеми зависимостями. Ещё нужны **autoconf** и **automake**. 
 + 
 +Итак, чтобы собрать что-то из исходников,​ нужно сначала собрать конфигуратор;​ как собрать конфигуратор,​ описано в файле configure.in. 
 +Для сборки конфигуратора необходимо выполнить<​code bash>​./​bootstrap</​code>​ или <code bash>​./​autogen.sh</​code>​ Если таких скриптов в архиве не оказалось,​ то можно выполнить последовательно следующие команды:<​code bash>​aclocal 
 +autoheader 
 +automake --gnu --add-missing --copy --foreign 
 +autoconf -f -Wall</​code>​Все эти команды используют файл **configure.in**.  
 +После выполнения этих команд создастся файл **configure**. После этого необходимо запустить конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально- может не быть)  
 +<code bash>​./​configure</​code>​ 
 +Конфигуратор построит Makefile основываясь на полученных знаниях и файле **makefile.am**. Можно передать конфигуратору опции, предусмотренные в исходниках ​программы,​ которые позволяют включать/​отключать те или иные возможности программы,​ обычно узнать о них можно командой <code bash>​./​configure --help</​code>​Также есть набор стандартных опций, вроде <​file>​--prefix=</​file>​ , которая указывает,​ какой каталог использовать для установки. Для Ubuntu обычно <code bash>​--prefix=/​usr</​code>​или<​code bash>​--prefix=/​usr/​local</​code>​**БЕЗ** слеша в конце! 
 +Теперь можно запустить процесс сборки самой программы командой <code bash>​make</​code>​Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент,​ когда команды в [[doc:​консоль|консоли]] перестанут "​беспорядочно"​ выполняться и не будет слова **error**. Теперь всё скомпилировано и готово для установки. 
 +======Установка====== 
 +Усилия потраченные на ''​Правильную установку''​ в последствии с лихвой окупятся в случае удаления или обновления устанавливаемого программного обеспечения. 
 +=====Правильная установка(Вариант №1)===== 
 +Установка при помощи утилиты **checkinstall**. Для установки выполните 
 +<code bash>​sudo apt-get install checkinstall</​code>​ 
 +<note important>​Минус данного способа:​ **checkinstall** понимает не все исходники,​ поскольку автор программы может написать особые скрипты по установке и **checkinstall** их не поймёт.</​note>​ 
 +Для создания и установки deb-пакета необходимо выполнить 
 +<code bash>​sudo checkinstall</​code>​ 
 +=====Правильная установка(Вариант №2)===== 
 +Быстрое создание deb-пакета "​вручную"​. 
 +<note important>​Основное отличие от предыдущего способа заключается в том, что в данном случае вы создаете пакет вручную и отслеживаете все вносимые изменения. Так же этот способ подойдет вам, если исходники не поддерживают сборку пакета с **checkinstall**.</​note>​ 
 +  * Производим установку во временную директорию,​ где получаем весь набор устанавливаемых файлов:​ 
 +<code bash>​fakeroot 
 +make install DESTDIR=`pwd`/​tempinstall</​code>​ 
 +  * Создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/​conffiles список всех файлов,​ которые должны попасть в /etc: 
 +<code bash>сd tempinstall 
 +mkdir DEBIAN 
 +find etc | sed "​s/​^/​\//"​ > DEBIAN/​conffiles</​code>​ 
 +  * После чего создаём файл DEBIAN/​control следующего содержания:​ 
 +<​file>​Package:​ имя_пакета 
 +Version: 1.2.3 
 +Architecture:​ amd64/​i386/​armel/​all 
 +Maintainer: Можете вписать своё имя, можете дребедень,​ но если оставить пустым,​ то dpkg будет ругаться 
 +Depends: Тут можно вписать список пакетов через запятую. 
 +Priority: optional 
 +Description:​ Тоже надо что-нибудь вписать,​ чтобы не кидало предупреждения</​file>​ 
 +  * При необходимости там же можно создать скрипты preinst, postinst, prerm и postrm. 
 +  * Создаем deb-пакет,​ для чего выполняем:​ 
 +<code bash>​dpkg -b tempinstall</​code>​ 
 +  * Получаем на выходе tempinstall.deb,​ который и устанавливаем  
 +<code bash>​sudo dpkg -i tempinstall.deb</​code>​ 
 +=====Установка (вариант №3)===== 
 +Процедура создания deb-пакета подробно описана в данной [[wiki:​создание_deb_пакетов|статье]]. 
 +=====Неправильная установка===== 
 +<note warning>​Минус данного способа заключается в том, что если вы устанавливаете напрямую через make install, то нормально удалить или обновить пакет вы, скорее всего, не сможете. Более того, установка новой версии поверх старой,​ скорее всего, затрёт ваши изменения в конфигах. make install делает ровно то, что ему сказано — производит установку файлов в нужные места, игнорируя тот факт, что там что-то уже есть. После этого процесса совершенно никакой информации о том, что и куда ставилось,​ получить в удобоваримом виде невозможно. Иногда,​ конечно,​ Makefile поддерживает действие uninstall, но это встречается не так часто, да и не факт, что корректно работает. Кроме того, вам будет необходимо хранить для деинсталяции распакованное дерево исходников и правил сборки.</​note>​ 
 +Для установки необходимо выполнить 
 +<code bash>​sudo make install</​code>​ 
 +Для удаления пакета,​ установленного данным способом необходимо выполнить в корневой директории исходников программы (там где вы запускали make install). 
 +<code bash>​sudo make uninstall</​code>​  
 +======Ошибки====== 
 +Часто на этапе конфигурации конфигуратор сообщает,​ что нехватает той или иной библиотеки. Название библиотеки,​ которое он сообщает,​ не всегда соответствует названию пакета в Ubuntu. Из собственного опыта могу посоветовать поискать в [[wiki:​synaptic|Синаптике]] нужный пакет, исключив префикс lib, если нашлось несколько пакетов различающихся приставкой -dev в названии,​ то вам нужно установить именно -dev пакет (обычно он тянет за собой и не -dev пакет). 
 +Можно ещё поискать с помощью [[http://​packages.ubuntu.com/​]],​ введя имя библиотеки в поиск по содержимому пакетов,​ аналогично,​ если найдётся dev и не dev, нужны оба :-). Ну или просто поискать в [[http://​www.google.ru|Google]]. 
 +====== Необходимое программное обеспечение ======
  
 Пакеты с буквами mm в конце описания — это пакеты для C++ программ. Список для bmpx, но подойдёт почти для любой GTK2/Gnome программы. Так что если не получается собрать,​ то посмотрите на этот список и сверьте с тем что у вас установлено. Пакеты с буквами mm в конце описания — это пакеты для C++ программ. Список для bmpx, но подойдёт почти для любой GTK2/Gnome программы. Так что если не получается собрать,​ то посмотрите на этот список и сверьте с тем что у вас установлено.
Строка 26: Строка 94:
 ^MusicBrainz|libmusicbrainz4-dev|libmusicbrainz4c2a| ^MusicBrainz|libmusicbrainz4-dev|libmusicbrainz4c2a|
 ^GStreamer|libgstreamer0.10-dev,​libgstreamer-plugins-base0.10-dev|libgstreamer0.10-0,​libgstreamer-plugins-base0.10-0| ^GStreamer|libgstreamer0.10-dev,​libgstreamer-plugins-base0.10-dev|libgstreamer0.10-0,​libgstreamer-plugins-base0.10-0|
- 
-===== Вступление ===== 
-Программы обычно распространяются в упакованных архивах,​ это файлы с расширениями <​code><​some_app_name>​.tar.gz ​ (иногда .tgz) 
-<​some_app_name>​.tar.bz2 </​code>​Нужно понимать отличие между архиватором и упаковщиком. 
- 
-Для архивации директорий и файлов используется программа **tar**; результатом её работы является файл с расширением **.tar**. 
-Грубо говоря,​ это копия файловой системы - директорий и файлов с их атрибутами и правами доступа,​ помещённая в один файл. 
- 
-Данный файл по размеру будет чуть больше,​ чем суммарный размер файлов,​ которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики - программы,​ которые позволяют уменьшить размер файла без потери данных. 
- 
-Не многие упаковщики умеют работать с несколькими файлами,​ но зато с одним справляются на ура. Результатом работы упаковщика **gzip** будет файл с расширением **.gz**. Так, файл, заканчивающийся на **.tar.gz** - это результат работы двух программ. 
- 
-**tar.gz** аналогичен файлу с расширением **.zip**, только **.zip** не позволяет сохранить все атрибуты и права доступа. 
-Таким образом,​ чтобы распаковать файл **.tar.gz**,​ нужно воспользоваться двумя программами. **gunzip** распакует файл, например,​ с помощью команды <code bash>​gunzip -d <​some_app_name>​.tar.gz</​code>​в результате получим файл<​code><​some_app_name>​.tar</​code>​ 
-а команда <code bash>tar -x  <​some_app_name>​.tar</​code>​ разархивирует его. 
- 
-К счастью для нас, GNU-версия программы **tar** умеет распаковывать,​ поэтому не нужно вызывать **gunzip**, а можно просто указать программе **tar**, что файл нужно cначала распаковать. 
-Например,​ команда <code bash>tar -z -x <​some_app_name>​.tar.gz</​code>​сразу распакует и разархивирует. Отличие файлов с расширениями<​code><​some_app_name>​.tar.gz</​code>​и<​code><​some_app_name>​.tar.bz2</​code>​лишь в том, что использовались разные упаковщики,​ для второго файла использовалась команда **bzip2**. Для распаковки <​some_app_name>​.tar.bz2 ​ можно выполнить команду<​code bash>tar -j -x <​some_app_name>​.tar.bz2</​code>​ 
- 
-===== Немного теории сборки ===== 
-Для сборки программ в GNU/Linux используется (в основном) программа **make**, которая запускает инструкции из **Makefile**,​ но поскольку дистрибутивов GNU/Linux много, и они все разные,​ то для того чтобы собрать программу,​ нужно для каждого дистрибутива отдельно прописывать пути,​где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать **Makefile**. Поэтому придумали конфигураторы,​ которые "​изучают"​ систему,​ и в соответствии с полученными знаниями создают **Makefile**. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов =)...на этом они остановились :-) 
- 
-Для сборки нам нужны компиляторы:​ они прописаны в зависимостях пакета **build-essential**,​ так что достаточно установить его со всеми зависимостями. Ещё нужны **autoconf** и все automake которые найдёте :-). 
- 
-Итак, чтобы собрать что-то из исходников,​ нужно сначала собрать конфигуратор;​ как собрать конфигуратор,​ описано в файле configure.in. А собирается конфигуратор следующими командами<​code>​bootstrap</​code><​code>​autogen.sh</​code>​т.е. достаточно запустить этот скрипт. А если нет скриптов bootstrap или autogen.sh, то можно выполнить последовательно следующие команды:<​code bash>​aclocal 
-autoheader 
-automake --gnu --add-missing --copy --foreign 
-autoconf -f -Wall</​code>​Все эти команды используют файл **configure.in**. После выполнения этих команд создастся файл **configure**. Вот теперь если вы запустите конфигуратор командой <code bash>​./​configure</​code>​(находясь в папке с исходными кодами),​ он проанализирует вашу систему,​ и сообщит,​ чего хватает/​не хватает. Возможно покажет,​ какие опции будущей программы будут доступны и/или пути, куда будет установлена скомпилированная программа (после выполнения **make install**). Конфигуратор построит Makefile основываясь на полученных знаниях и файле **makefile.am**. Можно передать конфигуратору опции, предусмотренные в исходниках программы,​ которые позволяют включать/​отключать те или иные возможности программы,​ обычно узнать о них можно командой <code bash>​./​configure --help</​code>​Также есть набор стандартных опций, вроде --prefix= , которая указывает,​ какой каталог использовать для установки. Для Ubuntu обычно <code bash>​--prefix=/​usr</​code>​или<​code bash>​--prefix=/​usr/​local</​code>​**БЕЗ** слеша в конце! 
-Теперь можно запустить процесс сборки самой программы командой <code bash>​make</​code>​Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент,​ когда команды в [[doc:​консоль|консоли]] перестанут "​беспорядочно"​ выполняться и не будет слова **error**. Теперь всё скомпилировано и готово для установки. На данном этапе можно запустить<​code bash>​make install</​code>​но уже с привилегиями //root//, например,​ командой<​code bash>​sudo make install</​code>​или <code bash>​checkinstall</​code>​ для того, чтобы сгенерировать deb пакет. Но хочу предупредить - **checkinstall** не все исходники понимает,​ поскольку автор программы может написать особые скрипты по установке и checkinstall их не поймёт. 
- 
-Ничего страшного в том, что вы установите программу не пакетом,​ а командой **make install** нет, программу всегда можно удалить командой <code bash>​make uninstall</​code>​ выполнив её в корневой директории исходников программы (там где вы запускали make install). 
- 
-Ещё есть возможность установить пакет не в корень,​ а в другую директорию,​ из которой потом можно самому вручную собрать пакет, используя команду <code bash>​fakeroot</​code>​ 
-<note tip>​Часто на этапе конфигурации конфигуратор сообщает,​ что нехватает той или иной библиотеки. Название библиотеки,​ которое он сообщает,​ не всегда соответствует названию пакета в Ubuntu. Из собственного опыта могу посоветовать поискать в [[doc:​синаптик|Синаптике]] нужный пакет, исключив префикс lib, если нашлось несколько пакетов различающихся приставкой -dev в названии,​ то вам нужно установить именно -dev пакет (обычно он тянет за собой и не -dev пакет). 
-Можно ещё поискать с помощью [[http://​packages.ubuntu.com/​]],​ введя имя библиотеки в поиск по содержимому пакетов,​ аналогично,​ если найдётся dev и не dev, нужны оба :-). Ну или просто поискать в [[http://​www.google.ru|Google]].</​note>​ 
  
 ====== Ссылки ====== ====== Ссылки ======
  
-Обсуждение проблем с компиляцией и установкой программ в Ubuntu на форуме [[http://​forum.ubuntu.ru/​index.php?​board=13.0|forum.ubuntu.ru]]+  * Обсуждение проблем с компиляцией и установкой программ в Ubuntu на форуме [[http://​forum.ubuntu.ru/​index.php?​board=13.0|forum.ubuntu.ru]] 
 +  * Внесены изменения по мотивам [[http://​habrahabr.ru/​post/​130868/​|Хабрахабр]] 
 +  * [[http://​habrahabr.ru/​post/​78094/​|Подробной HowTo по сборке бинарных deb пакетов]]
  
-{{tag>​Howto установка компиляция программирование}}+{{tag>​Howto установка компиляция программирование ​исходники}}