В некоторых случаях исполняемые модули приложений могут поставляться и
в виде tar-gz-архивов. В таком случае установка приложения только
немного сложнее, чем в случае установки из rpm-пакета: необходимо
просто развернуть архив и чаще всего можно уже запускать полученное
приложение. Немного сложнее установить приложение, если оно
поставляется в исходных текстах. Этот случай и рассмотрим в настоящем
разделе.
Необходимые сведения о программировании на языке Си
Начать стоит с того, что операционная система UNIX родилась на свет
одновременно с языком программирования C (Си). Более того, язык C был
создан специально для разработки этой ОС, значительная часть UNIX была
написана на языке С. ОС Linux тоже написана на Си. Поэтому, а также в
соответствии с принципом свободного распространения исходных кодов,
многие приложения для Линукс распространяются в виде текстов на С.
Естественно, что для того, чтобы такое приложение установить в систему
и запустить на исполнение, его необходимо скомпилировать. Для
выполнения процедур компиляции обычно используется программа gcc (хотя
существуют и некоторые альтернативные разработки).
GNU-компилятор с языка С gcc, содержит в себе 4 основных компонента,
соответствующие четырем этапам преобразования исходного кода в
исполняемую программу.
Первый компонент - это препроцессор, который модифицирует исходный код
программы перед компиляцией в соответствии с командами препроцессора,
содержащимися в С-программе. В соответствии с этими командами
выполняются простые подстановки текста.
Второй - собственно компилятор, который обрабатывает исходный код и
преобразует его в код на языке ассемблера.
Третий компонент - ассемблер, который генерирует объектный код.
И, наконец, четвертый компонент - компоновщик, который собирает
исполняемый файл из файлов объектного кода. Дело в том, что большие
программы обычно пишутся по-частям, в виде множества отдельных файлов,
содержащих исходный код соответствующей части. Компилятор обрабатывает
каждый такой файл отдельно и создает отдельные объектные модули (файлы
таких модулей обычно имеют расширение .o). Создание единой исполняемой
программы из таких модулей и является задачей компоновщика. При таком
подходе, если в какой-то модуль программист вносит исправление, нет
необходимости заново компилировать всю программу: достаточно
откомпилировать исправленный модуль и заново запустить компоновщик.
Для выполнения стандартных операций программист может использовать
функции из стандартных библиотек. Самый характерный пример - это
библиотека libc, которая содержит функции, выполняющие такие задачи,
как управление памятью и операции ввода-вывода. Программисты могут
создать свои собственные библиотеки и использовать их при написании
новых программ.
Библиотеки бывают статическими, разделяемыми и динамическими.
Статическая библиотека - это библиотека, код которой встраивается в
программу при компиляции. Код разделяемой библиотеки не встраивается в
программу, а загружается в память одновременно с программой и
программа получает доступ к функциям этой библиотеки. Динамические
библиотеки - разновидность разделяемых, только библиотечные функции
загружаются в память только тогда, когда из программы поступит вызов
соответствующей функции. В процессе выполнения программы они могут
выгружаться и заменяться другими функциями из той же или другой
библиотеки. Имена статических библиотек обычно имеют суффикс .a, а
имена разделяемых библиотек - суффикс .so, за которым следует старший
и младший номера версии. Имя может быть любой строкой, которая
однозначно характеризует библиотеку. Обычно имена библиотек начинаются
с lib. Примеры: libm.so.5 - общая математическая библиотека,
.6 - библиотека для работы с системой X Window. Библиотека
libc.so.5 компонуется автоматически, в то время как большинство других
библиотек необходимо явно указывать в командной строке при вызове
программы gcc. Это делается через опцию -l за которой следует
уникальная часть имени библиотеки, например, для вызова математической
библиотеки достаточно указать -lm.
Многие системные библиотеки располагаются в системных каталогах,
например, в /usr/lib/ и /lib/, но некоторые могут располагаться и в
других каталогах. Список этих каталогов помещается в файл
/etc/ld.so.conf. Каждый раз, когда разделяемая библиотека изменяется
или инсталлируется вновь, нужно выполнять команду ldconfig, чтобы
обновить файл /etc/ld.so.conf, а также ссылки на него. Если библиотека
инсталлируется из RPM-пакета, это обычно делается автоматически, хотя
и не всегда.
При компиляции больших программ, использующих фрагменты исходного
кода, расположенные в разных файлах, бывает очень трудно отследить,
какие файлы нужно перекомпилировать, а какие только компоновать. В
таких случаях очень помогает утилита make, которая автоматически
определяет, следует ли компилировать файл исходного кода, по дате его
последней модификации. Утилита make оперирует файлами, исходя из их
зависимости друг от друга. Эти зависимости определяются файлом с
именем makefile. Строка файла makefile состоит из трех частей: имени
целевого файла, списка файлов, от которых он зависит, и команды. Если
какой-либо файл из списка изменился после целевого файла, то
выполняется указанная в строке команда. В строке может быть указано
несколько команд. Обычно команда - это вызов компилятора для
компиляции файла исходного кода или компоновки файлов объектного кода.
Строки, определяющие зависимости, отделяются друг от друга пустой
строкой.
Инсталляция пакетов ПО из исходных текстов
Теперь, когда мы получили первое впечатление о том, как осуществляется
компиляция программ на языке С, можно перейти к рассмотрению того, как
обращаться с пакетами программ, распространяемыми в виде исходных
кодов. Первое, что надо сказать в этой связи, это то, что для
установки таких пакетов Вы, естественно, должны иметь в своей системе
утилиты gcc и make.
Непосредственно процесс инсталляции пакета состоит из следующих шагов:
Перейти (с помощью команды `cd') в каталог, содержащий исходные
коды устанавливаемого пакета.
Выполнить команду `./configure', которая осуществляет
конфигурирование пакета в соответствии с Вашей системой. Процесс
выполнения этой команды занимает довольно длительное время, причем
команда выдает на экран сообщения, сообщающие, какие именно
особенности системы испытываются.
Выполнить команду `make', для того, чтобы скомпилировать пакет.
После этого можно выполнить (это шаг не является обязательным)
команду `make check', которая вызывает запуск процедур
самотестирования, которые поставляются с пакетом.
Выполнить команду `make install' для установки программ, а также
файлов данных и документации.
Заключительный этап состоит в выполнении команды `make clean',
которая удаляет промежуточные объектные и двоичные файлы из каталога с
исходными кодами. Для удаления временных файлов, которые создала
команда `configure' (после чего пакет можно компилировать для другого
типа компьютеров), надо выполнить команду `make distclean'.
В большинстве случаев выполнение этой последовательности команд
достаточно для установки нового пакета.