В этом разделе вы узнаете как компилировать и устанавливать программы из исходных текстов (source) [Прим.пер.: в рускоязычной Linux-среде для обозначения исходных текстов программ часто используются жаргонные слова исходники и сырцы]. Вы научитесь распаковывать типичные архивы с исходными текстами и настраивать файлы Makefile.
Для чего может понадобиться устанавливать программу из исходных текстов? Среди распространенных причин:
- Вам требуется программа, не входящая в ваш дистрибутив.
- Вам нужна программа, которая доступна только в виде исходных текстов.
- Вам нужна некая функция программы, которая может быть включена только после перекомпиляции программы из исходных текстов.
- Вы хотите узнать о том как программа работает или принять участие в ее разработке.
Все они являются весьма вескими причинами для установки программы из исходных текстов.
Загрузка и распаковка
Вне зависимости от вашей мотивации cборки из исходных текстов, прежде чем перейти непосредственно к самой сборке вам потребуется заполучить исходные тексты. Вы можете найти пакет на сайте, разработанном для размещения проектов, вроде сайта SourceForge.net от Open Source Technology Group, или на сайте посвященному только этому проекту.
В этом разделе мы в основном будем рассматривать пакеты распространяемые в виде так называемых сжатых tar-файлов (tarball). Команда tar
(от Tape ARchive — ленточный архив) используется для создания архивов с файлами из древа каталогов. Несмотря на название, tar-файлы могут располагаться на любом носителе. Хранение их на диске позволяет выполнять такие операции, как например удаление части архива, что невозможно сделать на ленте. Команда tar сама по себе не сжимает данные, она просто соединяет их в один файл в специальноми формате, позволяющем сохранить как сами файлы, так и все права доступа, запреты и структуру каталогов. Команда tar может быть использована совместно с программой сжатия, обычно gzip
или bzip2
для создания сжатого архива, который экономит дисковое пространство, а также уменьшает время передачи файла. Вот этот получившийся архив и называют tarball.
Помимо простых архивов исходные тексты отдельных программ могут быть упакованы для вашего дистрибутива в пакеты с исходными текстами (source package), такие как RPM с исходными текстами (или SRPM). Мы обсудим управление пакетами в этом учебнике позднее. А сейчас просто не забудьте поискать пакет с исходными текстами для вашего дистрибутива, если вы его найдете, то это обычно значительно облегчает компиляцию программы, поскольку он уже подогнан к структуре файловой системы вашего дистрибутива.
Перед загрузкой узнайте как можно больше о пакете. Если доступна информация по сборке или установке, то просмотрите ее на предмет необходимости других пакетов, чтобы было возможно скомпилировать этот. Часто вам необходимо установить еще и несколько библиотек, а возможно и инструмент разработки, чтобы успешно скомпилировать выбранную программу. Это особенно часто бывает, если ваша программа использует любые графические инструментарии. Иногда только после запуска процесса сборки выясняется, что необходим еще какой-то пакет. Не волнуйтесь – это не редкость. Вам просто нужно найти и установить отсутствующий пакет и продолжать попытки пока все требуемые пакеты не будут установлены.
Обычно для загрузки вы можете использовать ваш браузер или, возможно, программу для ftp. Ваш пакет вероятно будет иметь имя, имеющее одно из перечисленных окончаний: tar, tar.gz, tar.Z, tgz, или tar.bz2. Иногда вы будете загружать пакеты, используя CVS (Concurrent Version System — Система параллельных версий). Примером может быть GNU GRUB 2 от Free Software Foundation. В этом случае загруженные вами исходные тексты будут уже распакованы. Изредка вы можете найти файлы с расширением .zip, говорящим о том, что это файл zip.
Сжатый tar файлы или tarball — это наиболее популярная форма распространения исходных текстов, если не используется система управления пакетами вроде RPM от Red Hat или управление пакетами в Debian. Они создаются при помощи команды tar, архивирующей древо каталогов и все файлы из него в один архивный файл. Обычно результат может быть сжат при помощи некой программы сжатия, как правило используется одна из следующих compress, gzip или bzip2. Поскольку архивирование и сжатие это наиболее общие операции, команда GNU tar, имеющаяся во многих дистрибутивах Linux может также самостоятельно применять сжатие и развертывание с использованием compress, gzip или bzip2. Если имеющаяся у вас версия tar не поддерживает указанные типы сжатия, то UNIX и Linux системы весьма хорошо используют конвейер, позволяющий нескольким командам работать над одними и теми же данными по очереди, так что двухступенчатый процесс может выполняться вручную, а tar сделает это для вас в любом случае.
Для иллюстрации предположим, что мы загрузили проект Dr. Geo interactive geometry. Во время создания этого урока текущая версия содержалась в файле drgeo-1.1.0.tar.gz. Расширение gz говорит о том, что этот файл сжат при помощи gzip. Сначала мы покажем, как получить tar файл из сжатого файла, а затем как извлечь оттуда отдельные файлы. Затем мы покажем вам как распаковать и извлечь файлы одной командой или при помощи конвейера
Для того, чтобы просто извлечь tar-архив мы используем команду gunzipg как показано в Листинге 13.
Листинг 13. Распаковка пакета с исходными текстами Dr Geo.
[ian@localhost ~]$ ls drgeo*
drgeo-1.1.0.tar.gz
[ian@localhost ~]$ gunzip drgeo-1.1.0.tar.gz
[ian@localhost ~]$ ls drgeo*
drgeo-1.1.0.tar
Отметим, что наш файл .tar.gz теперь заменен исходным .tar файлом. Чтобы распаковать tar-файл для других упомянутых расширений вам следует использовать следующие команды (соответственно)
uncompress drgeo-1.1.0.tar.Z
gunzip drgeo-1.1.0.tar.Z
gunzip drgeo-1.1.0.tar.gz
gunzip drgeo-1.1.0.tgz
bunzip2 drgeo-1.1.0.tar.bz2
Вы можете отметить, что gunzip может работать с .Z, .tar.gz и .tgz. В действительности же, в вашей системе может вообще не быть программ compress и uncompress.
Для извлечения файлов из tar архива используется команда tar. Стандартная форма: tar -xvf имя_файла.tar, приведена в Листинге 14. Опционально вы можете ограничить вывод, используя малый фильтр для разбивки вывода на страницы.
Листинг 14. Извлечение файлов из архива Dr Geo.
[ian@localhost ~]$ tar -xvf drgeo-1.1.0.tar |more
drgeo-1.1.0/
drgeo-1.1.0/po/
drgeo-1.1.0/po/ChangeLog
drgeo-1.1.0/po/Makefile.in.in
drgeo-1.1.0/po/POTFILES.in
drgeo-1.1.0/po/drgeo.pot
drgeo-1.1.0/po/az.po
drgeo-1.1.0/po/ca.po
drgeo-1.1.0/po/cs.po
...
пция -x говорит tar, что нужно извлечь файлы из архива. Опция -v говорит tar, что нужно вывести подробный листинг обрабатываемых файлов. И опция -f вместе с именем файла (в данном случае drgeo-1.1.0.tar) говорит tar, что архивные файлы извлекаются из файла.
Правильно сделанный пакет в процессе разархивирования создаст каталог, в котором будут сохранены файлы пакета. В нашем примере это каталог drgeo-1.1.0. Иногда пакет этого не делает, и потому вы можете захотеть посмотреть структуру пакета перед тем, как выполнить его распаковку с риском получить огромное количество файлов прямо в домашнем каталоге. Чтобы выполнить проверку используйте команду tar с опцией -t, отображающей таблицу содержимого, вместо -x, производящей разархивирование. Если вы также опустите опцию -v, то все равно полученного листинга будет достаточно для того, чтобы понять какие файлы будут созданы и будет ли создан новый каталог или все будет выгружено в текущий.
Теперь, когда мы увидели как разархивировать сжатые архивы tar в два шага, вы возможно удивитесь заявлению, что все это можно сделать за один шаг. Да можно. Если вы добавите опцию -z к команде tar, то она сможет распаковать и разархивировать архивы, сжатые gzip при помощи одной команды. Например:
tar -zxvf drgeo-1.1.0.tgz
или
tar -zxvf drgeo-1.1.0.tar.Z
Для выполнения того же для архивов сжатых при помощи bzip2, вместо опции -z используйте опцию-j. Например:
tar -jxvf drgeo-1.1.0.tar.bz2
Вы может также использовать опцию -c с любой из указанных выше команд сжатия для направления распакованных файлов в стандартный вывод, который затем преобразуется в стандартный вход для команды tar. Отметим, что это оставляет ваш оригинальный файл неизменным, а не распаковывает его в большой .tar файл. Вот несколько примеров:
bunzip2 -c drgeo-1.1.0.tar.bz2 | tar -xvf -
uncompress -c drgeo-1.1.0.tar.Z | tar -xvf -
gunzip -c drgeo-1.1.0.tar.Z | tar -xvf -
gunzip -c drgeo-1.1.0.tar.gz | tar -xvf -
gunzip -c drgeo-1.1.0.tgz | tar -xvf -
Примечания:
1. Значение – вместо имени архивного файла заставляет tar использовать стандартный ввод для архивов. Ваша версия tar может делать это по умолчанию, в этом случае вам нет нужды указывать опцию -f вообще. Просто опустите в конце вышеперечисленных команд завершающие f -.
2. Команда zcat выполняет те же функции, что и gunzip -c.
Древо CVS
Иногда код необходимого вам проекта не упакован в архив, а доступен через CVS (Concurrent Version System — Система Параллельных Версий). В качестве примера можно привести проект GRUB 2, обсуждавшийся нами в разделе Менеджеры загрузки. В Листинге 15 приведен пример.
Листинг 15. Загрузка GRUB2 через CVS.
[ian@attic4 ~]$ export CVS_RSH="ssh"
[ian@attic4 ~]$ cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/grub co grub2
cvs server: Updating grub2
U grub2/.cvsignore
U grub2/AUTHORS
U grub2/COPYING
U grub2/ChangeLog
U grub2/DISTLIST
U grub2/INSTALL
U grub2/Makefile.in
U grub2/NEWS
...
Команда export говорит CVS как соединиться с удаленным сервером (используя безопасную оболочку (secure shell) или ssh в данном случае). Команда cvs проверяет (опция co) проект grub2. Вы найдете все файлы проекта в каталоге grub2, который команда cvs создаст для вас.
Zip файлы
Изредка вы можете обнаружить пакеты с исходными текстами в виде zip файлов. Это может иметь место для пакетов, которые работают в Windows также как и в Linux системах. Оригинальная программа PKZIP была разработана для систем DOS компанией PKWARE, Inc., а теперь доступна для нескольких платформ. Многие системы Linux имеют версию, созданную Info-ZIP.
Листинг 16 показывает как использовать команду unzip для распаковки исходных текстов хранителя экрана, демонстрирующего выворачивание сферы на изнанку (sphere eversion).
Листинг 16. Распаковка исходных текстов sphere eversion из zip.
[ian@attic4 ~]$ unzip sphereEversion-0.4-src.zip
Archive: sphereEversion-0.4-src.zip
creating: sphereEversion-0.4-src/
inflating: sphereEversion-0.4-src/Camera.h
inflating: sphereEversion-0.4-src/drawutil2D.h
inflating: sphereEversion-0.4-src/drawutil.h
inflating: sphereEversion-0.4-src/fontdata.h
inflating: sphereEversion-0.4-src/fontDefinition.h
inflating: sphereEversion-0.4-src/generateGeometry.h
inflating: sphereEversion-0.4-src/global.h
inflating: sphereEversion-0.4-src/mathutil.h
inflating: sphereEversion-0.4-src/Camera.cpp
inflating: sphereEversion-0.4-src/drawutil2D.cpp
inflating: sphereEversion-0.4-src/drawutil.cpp
inflating: sphereEversion-0.4-src/fontdata.cpp
inflating: sphereEversion-0.4-src/generateGeometry.cpp
inflating: sphereEversion-0.4-src/main.cpp
inflating: sphereEversion-0.4-src/mathutil.cpp
inflating: sphereEversion-0.4-src/README.TXT
inflating: sphereEversion-0.4-src/Makefile
Сборка (компиляция) программ
Теперь, когда исходные тексты распакованы в древо каталогов, рассмотрим как скомпилировать программу или программы.
Инспекция исходных текстов
Перед тем, как запустить компиляцию, вы должны просмотреть что было распаковано. В частности просмотреть документацию по установке. Обычно это файл README или INSTALL, возможно, что и оба, расположенные в каталоге вашего нового проекта. Если пакет разработан для нескольких платформ, вы можете найти файлы, специфичные для некой платформы, такие как README.linux или INSTALL.linux.
Конфигурирование
Весьма часто в главном каталоге исходных текстов встречается скрипт configure. Это скрипт разработан для настройки Makefile, который подгоняется под вашу систему. Он обычно генерируется разработчиком, с использованием программы GNU autoconf. Скрипт configure проверяет вашу систему на наличие всех нужных инструментов и совместимость. Полученный в результате Makefile или несколько таких файлов, скомпилируют проект на вашей конкретной системе.
Сложный конфигурационный скрипт может проверять множество аспектов вашй системы, включая такие вещи, как тип процессора, является ли он 32-х или 64-х битным и так далее. Простой конфигурационный сценарий не делает почти ничего, кроме создания файлов Makefile.
Если у вас нет файла с именем configure в главном каталоге проекта, то просмотрите документацию на предмет другого способа настройки параметров сборки. Если же такой файл у вас есть, то перейдите в главный каталог проекта и выполните.
./configure --help
Эта команда выдаст справку о доступных опциях конфигурации. Многие из них, такие как –prefix, встречаются в большинстве конфигурационных скриптов. Некоторые скорее всего будут специфичны для конкретного компилируемого проекта. Найдите те, который вам нужно изменить.
Примечание: Если ваш проект не имеет конфигурационного скрипта, то возможно он имеет файл Makefile, работающий на большинстве платформ, или установочный процесс в какой-то другой форме. Например, пакет, использующий только скрипты Python файлы с данными может не требовать сборки, так что он может иметь просто сценарий для установки.
В учебнике для темы 104 мы рассмотрим cтандарт иерархий файловых систем (FHS — Filesystem Hierarchy Standard). А сейчас отметим, что локальные программы должны иметь исполняемые файлы, сохраненные в древе /usr/local в /usr/local/bin и man-страницы в /usr/local/man. Скрипты configure вероятно имеют опцию –prefix, указывающую место установки. Если программа не совместима с FHS, то вам может потребоваться указать эту опцию при запуске скрипта configure. Если вы компилируете программу для замены установленной версии, то вам может потребоваться установить ее, указав каталог в /opt или /usr в качестве префиксов.
В добавок к возможному указанию префиксов вы можете обнаружить другие опции, связанные с размещением специфичных компонентов, таких как –mandir или –infodir для указания расположения man и info страниц соответственно.
После просмотра возможных опций и определения того, что вам следует изменить, выполните скрипт configure, добавив все необходимые опции. Не забудьте добавить ./ перед командой configure, поскольку каталог вашего проекта вероятно не будет указан в переменной path. Например, вы можете выполнить
./configure
или
./configure --prefix /usr/local
После запуска configure обычно вы видите сообщения, рассказывающие о типе используемой вами системы и о том, какие необходимые инструменты установлены, а какие нет. Если все идет хорошо, то к концу процесса конфигурирования вы должны получить созданный Makefile.
config.cache
По завершении выполнения скрипта configure, он сохраняет информацию о конфигурации в файле с названием config.cache, расположенном в том же каталоге, что и сам скрипт configure.
Если вам необходимо запустить ./configure вновь, то убедитесь, что прежде вы удалили файл config.cache (используйте команду rm), поскольку configure будет использовать настройки из config.cache, если он существует, не производя повторной проверки вашей системы.
Листинг 17 содержит часть выведенных сообщений выполнения configure для пакета Dr Geo, который мы распаковали ранее.
Листинг 17. Конфигурирование Dr Geo.
[ian@localhost ~]$ cd drgeo-1.1.0
[ian@localhost drgeo-1.1.0]$ ./configure | less
checking for XML::Parser... ok
checking for iconv... /usr/bin/iconv
checking for msgfmt... /usr/bin/msgfmt
checking for msgmerge... /usr/bin/msgmerge
checking for xgettext... /usr/bin/xgettext
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for g++... g++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
...
checking for guile... /usr/bin/guile
checking for guile-config... no
configure: error: guile-config required but not found
Скрипт configure проверяет несколько программ преобразования графики, являющихся частью пакета netpbm. Имеется предупреждение, поскольку одна из необходимых программ преобразования не найдена в системе. Есть также предупреждение о том, что использование префикса /usr/local требует прав суперпользователя (на этапе установки). Поскольку это первый запуск, то выводится несколько ошибок, связанных с файлом Makefile, который еще не существует, но появится если мы выполним configure вновь. И наконец скрипт configure сообщает об успешном завершении.
Make и файлы Makefile
По завершении конфигурирования, вы должны получить файл в каталоге проекта с именем Makefile. Он называется сборочный файл проекта, программа с именем make используется для его обработки и сборки программы. Может также иметься несколько make-файлов в ваших подкаталогах.
Make-файл содержит правила, являющиеся инструкциями, которые сообщают программе make как собираьб различные компоненты приложения. Файл также содержит targets (цели), которые сообщают программе make, что именно компилировать. Программа make анализирует make-файл и определяет порядок в котором следует производить компиляцию (сборку). Например, если исполняемый файл создается из трех объектных файлов, то объектные файл должны быть скомпилированы до того, как они будут объединены в исполняемый код. Мake-файл может выполнять как компиляцию, так и инсталляцию приложения. Назначения (targets) make-файла обычно доступны для нескольких функций, таких как:
make
без опций просто компилирует программу. Говоря технически, таким образом компилируется назначение по умолчанию, что обычно означает просто компиляцию программы из исходных текстов.
make install
устанавливает скомпилированную программу. Если вы производите установку в /usr/local, то вам могут потребоваться права суперпользователя (root).
make clean
удаляет файлы, созданные в процессе сборки.
make all
иногда используется для выполнения всех функций make-файла за раз. .
Обратитесь к документации проекта, чтобы узнать, есть ли дополнительные назначения (targets) или дополнительные элементы, которые могут понадобиться вам.
Теперь, когда ваш главный Makefile создан, используйте команду make, обычно без опций, для сборки выполняемых файлов, man-страниц и других частей программы. В зависимости от быстродействия вашего компьютера и сложности процесса, сборка может занять от одной-двух минуты до нескольких часов для сложных проектов.
Иногда сборка может не работать. Наиболее общие причины, это:
- Отсутствие необходимых пакетов
- Не та версия необходимых пакетов
- Не верные значения параметров, которые вы должно быть пропустили в configure или make.
- Отсутствие компилятора.
- Ошибки в скрипте configure или созданном Makefile.
- Ошибки в исходном коде.
В нашем примере с Dr Geo, одна из таких проблем была обнаружена на этапе конфигурирования, но это не обычный случай. По мере накопления опыта работы в Linux, вы сможете определить и исправить эти проблемы. Иногда вам придется обратиться к FAQ [Прим.пер.: Frequently Asking Qwestions -- ЧАсто задаваемые ВОпросы. В последнее время в Рунете это преобразуется в рускоязычное ЧАВО] или списку рассылки о поддержке данного пакета. В других случаях вам может понадобиться определить, что вы пропустили и установить это.
Установка
Если при сборке все прошло хорошо, то вы готовы к установке. На этапе компиляции были собраны все необходимые файлы, но они все еще расположены не в том месте, чтобы быть готовыми к использованию. Например, бинарные файлы необходимо скопировать в /usr/local/bin, а man страницы в /usr/local/man и т.д.
Если вы не указывали опцию –prefix, то несколько файлов и каталогов скорее всего будет скопировано в древо /usr/local. Вам потребуются права суперпользователя для записи в древо /usr/local вашей файловой системы. Если вы вошли не как суперпользователь (root), то используйте команду su для получения прав суперпользователя. Будет запрошен ввод пароля root. Затем используйте команду make install, чтобы установить только что собранную программу. Установка занимает от нескольких секунд до минут, в зависимости от размера программы. Мы привели часть выведенного при установке Dr Geo в Листинге 18.
Листинг 18. Установка Dr Geo.
[ian@attic4 drgeo-1.1.0]$ su
Password:
[root@attic4 drgeo-1.1.0]# make install
Making install in po
make[1]: Entering directory `/home/ian/drgeo-1.1.0/po'
if test -n ""; then \
/usr/local/share; \
else \
/bin/sh ../mkinstalldirs /usr/local/share; \
fi
installing az.gmo as /usr/local/share/locale/az/LC_MESSAGES/drgeo.mo
installing ca.gmo as /usr/local/share/locale/ca/LC_MESSAGES/drgeo.mo
installing cs.gmo as /usr/local/share/locale/cs/LC_MESSAGES/drgeo.mo
installing da.gmo as /usr/local/share/locale/da/LC_MESSAGES/drgeo.mo
installing de.gmo as /usr/local/share/locale/de/LC_MESSAGES/drgeo.mo
installing el.gmo as /usr/local/share/locale/el/LC_MESSAGES/drgeo.mo
installing en_CA.gmo as /usr/local/share/locale/en_CA/LC_MESSAGES/drgeo.mo
installing en_GB.gmo as /usr/local/share/locale/en_GB/LC_MESSAGES/drgeo.mo
...
/usr/bin/install -c drgeo /usr/local/bin/drgeo
/bin/sh ./mkinstalldirs /usr/local/share/applications
/usr/bin/install -c -m 644 drgeo.desktop /usr/local/share/applications/drgeo.desktop
make[2]: Leaving directory `/home/ian/drgeo-1.1.0'
make[1]: Leaving directory `/home/ian/drgeo-1.1.0'
[root@attic4 drgeo-1.1.0]# exit
exit
[ian@attic4 drgeo-1.1.0]$
После копирования файлов, команда make install должна также убедиться, что все установленные файлы имеют корректные права доступа и разрешения. После завершения установки программа считается установленной и готовой к использованию, или готовой к предварительной настройке перед использованием.
Замечание: Если вы имеете права суперпользователя, то можно очень легко, допустив ошибку, нанести большой вред системе, поэтому не забудьте завершить режим суперпользователя командой exit или нажатием ctrl-d в командной оболочке bash.
Запуск программ
Если ваша программа готова к запуску, то вы можете попробовать запустить ее, набрав в командной строке ее имя, для нашего примера drgeo. На Рисунке 1 показано окно Dr Geo, отображающее один из примеров, поставляемых вместе с программой.
Вот что еще вам следует сделать перед запуском программы.
- Прочтите man страницы если они есть в пакете. Попытайтесь выполнить man имя_программы.
- Настроить конфигурационные файлы, например в /etc.
- Настроить автоматический запуск для такой программы, как демон сервера.
В этом разделе мы рассмотрели процесс установки программы из исходных тектсов от самого начала и до конца. В следующих разделах мы поговорим о библиотеках, управлении библиотеками и пакетами, а также о том, как устанавливать их.
Взято с ibm developerworks