Внутреннее устройство Linux - Уорд Брайан. Страница 109
1. Распаковку архива с исходным кодом.
2. Конфигурирование пакета.
3. Запуск команды make для сборки команд.
4. Запуск команды make install или специфичной для данной версии ОС команды, которая устанавливает пакет.
примечание
Вы должны понимать основы, изложенные в главе 15, прежде чем продолжать чтение этой главы.
16.2. Распаковка архива с исходным кодом на языке C
Исходный код какого-либо пакета обычно предоставляется в виде файла .tar.gz, .tar.bz2 или .tar.xz, и вам следует распаковать этот файл, как описано в разделе 2.18. Однако перед распаковкой проверьте содержимое архива с помощью команд tar tvf или tar ztvf, поскольку некоторые пакеты не создают собственные подкаталоги в том каталоге, где вы распаковываете архив.
Отчет, подобный приводимому ниже, свидетельствует о том, что пакет в порядке и готов для распаковки:
package-1.23/Makefile.in
package-1.23/README
package-1.23/main.c
package-1.23/bar.c
—snip—
Тем не менее вы можете обнаружить, что не все файлы находятся внутри одного каталога (вроде каталога package-1.23 из приведенного примера):
Makefile
README
main.c
—snip—
Распаковка такого архива может создать большую путаницу в вашем текущем каталоге. Чтобы избежать этого, создайте новый каталог и перейдите в него перед извлечением содержимого архива. Наконец, остерегайтесь пакетов, которые содержат файлы с абсолютными путями, вроде таких:
/etc/passwd
/etc/inetd.conf
Возможно, вам не встретится ничего подобного, но если все-таки встретится — удалите такой архив из системы. Возможно, он содержит вирус-троян или какой-либо вредоносный код.
С чего начать. После извлечения содержимого архива с исходным кодом и появления множества файлов перед вами попытайтесь получить представление о пакете. В частности, поищите файлы README и INSTALL. Обязательно загляните в каждый файл README, поскольку они часто содержат описание пакета, краткое руководство, советы по установке и другую полезную информацию. Многие пакеты сопровождаются также файлами INSTALL, содержащими инструкции по компиляции и установке пакета. Особое внимание уделите специальным параметрам компилятора и определениям.
В дополнение к файлам README и INSTALL вы найдете другие файлы пакета, которые можно грубо распределить по трем категориям.
• Файлы, относящиеся к команде make, такие как Makefile, Makefile.in, configure и CMakeLists.txt. Очень старые пакеты содержат файл Makefile, который вам может понадобиться изменить, но большинство пакетов использует утилиту конфигурирования, например GNU Autoconf или CMake. Они поставляются с файлом сценария или конфигурации (такими как configure или CMakeLists.txt), чтобы помочь создать файл Makefile из файла Makefile.in, основываясь на настройках вашей системы и параметрах конфигурации.
• Файлы исходного кода, имена которых оканчиваются на .c, .h или .cc. Файлы исходного кода на языке C могут появиться практически всюду в каталоге пакета. У файлов исходного кода на языке C++ обычно есть суффиксы .cc, .C или .cxx.
• Объектные файлы, имена которых оканчиваются на .o, или двоичные файлы. Обычно объектные файлы отсутствуют в пакетах с исходным кодом, но вы можете встретить их в редких случаях, когда поставщику пакета не разрешено распространение исходного кода и вам необходимо предпринимать что-либо особое, чтобы использовать такие объектные файлы. В большинстве случаев наличие объектных (или двоичных исполняемых) файлов в пакете означает, что он был составлен не очень хорошо и вам следует запустить команду make clean, чтобы убедиться в пригодности кода для компиляции.
16.3. Утилита GNU Autoconf
Хотя исходный код на языке C обычно довольно хорошо портируется, различия между платформами делают невозможной компиляцию большинства пакетов с помощью единственной утилиты Makefile. Раньше для решения этой проблемы предлагались отдельные утилиты Makefile для каждой операционной системы или же утилита, которую легко изменять. При таком подходе приходилось задействовать сценарии, которые генерируют файлы Makefiles на основе анализа системы, использованной для сборки пакета.
Утилита GNU Autoconf является популярным средством для автоматического создания файла Makefile. Пакеты, которые используют эту систему, содержат файлы с именами configure, Makefile.in и config.h.in. Файлы с суффиксом .in являются шаблонами; идея состоит в том, чтобы запускать сценарий конфигурирования, который выявляет характеристики вашей системы, а затем выполняет подстановки в файлах .in для создания реальных файлов сборки. Для конечного пользователя это просто; чтобы создать файл Makefile из файла Makefile.in, запустите команду configure:
$ ./configure
Вы должны получить пространный диагностический вывод, пока сценарий проверяет вашу систему на соответствие необходимым условиям. Если все завершается удачно, команда configure создает один или несколько файлов Makefile и файл config.h, а также файл кэша (config.cache), чтобы ей не приходилось выполнять некоторые проверки заново.
Теперь можно запустить команду make для компиляции пакета. Успешное прохождение этапа с командой configure не обязательно означает, что этап make тоже будет пройден, но шансы на это весьма велики (см. раздел 16.6, чтобы разобраться с неудачными результатами конфигурирования и компиляции).
Получим некоторый опыт выполнения такого процесса.
примечание
Для этого вам требуется иметь все необходимые инструменты сборки, которые доступны в вашей системе. Для Debian и Ubuntu простейшим способом является установка пакета, существенного для сборки; для систем, подобных Fedora, воспользуйтесь утилитой groupinstall.
16.3.1. Пример работы утилиты Autoconf
Прежде чем обсуждать то, как вы можете изменить поведение утилиты Autoconf, посмотрим на простой пример, чтобы вы знали, чего ожидать. Вы будете устанавливать пакет GNU coreutils в ваш домашний каталог (для гарантии того, что он не смешается с вашей системой). Скачайте пакет с веб-страницы http://ftp.gnu.org/gnu/coreutils/ (обычно самой лучшей является последняя версия), распакуйте его, перейдите в распакованный каталог и выполните конфигурирование таким образом:
$ ./configure —prefix=$HOME/mycoreutils
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
—snip—
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
Теперь запустите команду make:
$ make
GEN lib/alloca.h
GEN lib/c++defs.h
—snip—
make[2]: Leaving directory '/home/juser/coreutils-8.22/gnulib-tests'
make[1]: Leaving directory '/home/juser/coreutils-8.22'
Далее попробуйте запустить один из исполняемых файлов, только что созданных вами, например ./src/ls, и попытайтесь выполнить команду make check, чтобы осуществить ряд проверок пакета. На это может потребоваться некоторое время, но наблюдать за проверкой интересно.
Наконец вы готовы к установке пакета. Выполните сначала пробный прогон с помощью команды make –n, чтобы увидеть то, что выполняет команда make install, но не устанавливая сам пакет:
$ make -n install
Просмотрите результат работы и, если не заметите никаких странностей (таких как установка в каталог, отличающийся от каталога mycoreutils), выполните реальную установку:
$ make install
Теперь в вашем домашнем каталоге должен появиться подкаталог с именем mycoreutils, содержащий подкаталоги bin, share и др. Попробуйте запустить некоторые команды из каталога bin (вы только что выполнили сборку многих основных инструментов, о которых узнали из главы 2). Наконец, поскольку вы настроили каталог mycoreutils так, чтобы он не зависел от остальной части системы, можно полностью удалить его, не опасаясь причинить вред системе.