Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
wiki:programs_installation [2012/05/29 20:06] |
wiki:programs_installation [2012/11/11 11:28] [Неправильная установка] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Компиляция и установка программ из исходников ====== | + | ====== Компиляция и установка программ из исходников====== |
- | + | Не редко необходимые пакеты можно найти только в виде исходных текстов, в данной статье описывается метод установки пакета из исходных текстов. | |
- | ======Работа с архивами====== | + | ======Распаковка====== |
Программы обычно распространяются в упакованных архивах, это файлы с расширениями <code><some_app_name>.tar.gz (иногда .tgz) | Программы обычно распространяются в упакованных архивах, это файлы с расширениями <code><some_app_name>.tar.gz (иногда .tgz) | ||
<some_app_name>.tar.bz2 </code>Нужно понимать отличие между архиватором и упаковщиком. | <some_app_name>.tar.bz2 </code>Нужно понимать отличие между архиватором и упаковщиком. | ||
Строка 10: | Строка 10: | ||
Данный файл по размеру будет чуть больше, чем суммарный размер файлов, которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики - программы, которые позволяют уменьшить размер файла без потери данных. | Данный файл по размеру будет чуть больше, чем суммарный размер файлов, которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики - программы, которые позволяют уменьшить размер файла без потери данных. | ||
- | Не многие упаковщики умеют работать с несколькими файлами, но зато с одним справляются на ура. Результатом работы упаковщика **gzip** будет файл с расширением **.gz**. Так, файл, заканчивающийся на **.tar.gz** - это результат работы двух программ. | + | Программа **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** определяет метод сжатия автоматически и дополнительных опций в данном случае не требуется. | |
- | **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> | + | |
+ | После распаковки необходимо перейти в полученный каталог, все описываемые ниже команды выполняются в каталоге с исходными текстами пакета. | ||
+ | <code bash>cd <имя_пакета>*</code> | ||
======Сборка пакета====== | ======Сборка пакета====== | ||
Для сборки программ в GNU/Linux используется (в основном) программа **make**, которая запускает инструкции из **Makefile**, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать **Makefile**. Поэтому придумали конфигураторы, которые "изучают" систему, и в соответствии с полученными знаниями создают **Makefile**. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов =)...на этом они остановились :-) | Для сборки программ в GNU/Linux используется (в основном) программа **make**, которая запускает инструкции из **Makefile**, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать **Makefile**. Поэтому придумали конфигураторы, которые "изучают" систему, и в соответствии с полученными знаниями создают **Makefile**. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов =)...на этом они остановились :-) | ||
- | Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета **build-essential**, так что достаточно установить его со всеми зависимостями. Ещё нужны **autoconf** и все automake которые найдёте :-). | + | Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета **build-essential**, так что достаточно установить его со всеми зависимостями. Ещё нужны **autoconf** и **automake**. |
- | Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор; как собрать конфигуратор, описано в файле configure.in. А собирается конфигуратор следующими командами<code>bootstrap</code><code>autogen.sh</code>т.е. достаточно запустить этот скрипт. А если нет скриптов bootstrap или autogen.sh, то можно выполнить последовательно следующие команды:<code bash>aclocal | + | Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор; как собрать конфигуратор, описано в файле configure.in. |
+ | Для сборки конфигуратора необходимо выполнить<code bash>./bootstrap</code> или <code bash>./autogen.sh</code> Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:<code bash>aclocal | ||
autoheader | autoheader | ||
automake --gnu --add-missing --copy --foreign | 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>**БЕЗ** слеша в конце! | + | 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**. Теперь всё скомпилировано и готово для установки. | Теперь можно запустить процесс сборки самой программы командой <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 important>Минус данного способа заключается в том, что если вы устанавливаете напрямую через make install, то нормально удалить или обновить пакет вы, скорее всего, не сможете. Более того, установка новой версии поверх старой, скорее всего, затрёт ваши изменения в конфигах. make install делает ровно то, что ему сказано — производит установку файлов в нужные места, игнорируя тот факт, что там что-то уже есть. После этого процесса совершенно никакой информации о том, что и куда ставилось, получить в удобоваримом виде невозможно. Иногда, конечно, Makefile поддерживает действие uninstall, но это встречается не так часто, да и не факт, что корректно работает. Кроме того, вам будет необходимо хранить для деинсталяции распакованное дерево исходников и правил сборки.</note> | + | <note warning>Минус данного способа заключается в том, что если вы устанавливаете напрямую через make install, то нормально удалить или обновить пакет вы, скорее всего, не сможете. Более того, установка новой версии поверх старой, скорее всего, затрёт ваши изменения в конфигах. make install делает ровно то, что ему сказано — производит установку файлов в нужные места, игнорируя тот факт, что там что-то уже есть. После этого процесса совершенно никакой информации о том, что и куда ставилось, получить в удобоваримом виде невозможно. Иногда, конечно, Makefile поддерживает действие uninstall, но это встречается не так часто, да и не факт, что корректно работает. Кроме того, вам будет необходимо хранить для деинсталяции распакованное дерево исходников и правил сборки.</note> |
Для установки необходимо выполнить | Для установки необходимо выполнить | ||
<code bash>sudo make install</code> | <code bash>sudo make install</code> | ||
Для удаления пакета, установленного данным способом необходимо выполнить в корневой директории исходников программы (там где вы запускали make install). | Для удаления пакета, установленного данным способом необходимо выполнить в корневой директории исходников программы (там где вы запускали make install). | ||
- | <code bash>make uninstall</code> | + | <code bash>sudo make uninstall</code> |
- | =====Правильная установка(checkinstall)===== | + | |
- | <note important>Данная утилита, будучи запущенной вместо make install задаст несколько вопросов, после чего сама соберёт и установит deb-пакет. При обновлении никаких проблем с вычисткой старого хлама у вас не будет. | + | |
- | Минус данного способа: **checkinstall** понимает не все исходники, поскольку автор программы может написать особые скрипты по установке и **checkinstall** их не поймёт.</note> | + | |
- | Для создания и установки deb-пакета необходимо выполнить | + | |
- | <code bash>checkinstall</code> | + | |
- | =====Правильная установка(создание deb-пакета)===== | + | |
- | Ещё есть возможность установить пакет не в корень, а в другую директорию, из которой потом можно самому вручную собрать пакет, используя команду <code bash>fakeroot</code> | + | |
======Ошибки====== | ======Ошибки====== | ||
Часто на этапе конфигурации конфигуратор сообщает, что нехватает той или иной библиотеки. Название библиотеки, которое он сообщает, не всегда соответствует названию пакета в Ubuntu. Из собственного опыта могу посоветовать поискать в [[wiki:synaptic|Синаптике]] нужный пакет, исключив префикс lib, если нашлось несколько пакетов различающихся приставкой -dev в названии, то вам нужно установить именно -dev пакет (обычно он тянет за собой и не -dev пакет). | Часто на этапе конфигурации конфигуратор сообщает, что нехватает той или иной библиотеки. Название библиотеки, которое он сообщает, не всегда соответствует названию пакета в Ubuntu. Из собственного опыта могу посоветовать поискать в [[wiki:synaptic|Синаптике]] нужный пакет, исключив префикс lib, если нашлось несколько пакетов различающихся приставкой -dev в названии, то вам нужно установить именно -dev пакет (обычно он тянет за собой и не -dev пакет). | ||
Строка 72: | Строка 97: | ||
====== Ссылки ====== | ====== Ссылки ====== | ||
- | Обсуждение проблем с компиляцией и установкой программ в 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/|Хабрахабр]] | ||
- | {{tag>Howto установка компиляция программирование}} | + | {{tag>Howto установка компиляция программирование исходники}} |