Журнал LinuxFormat - перейти на главную

LXF111:Compilation

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Сборка – это просто!

Новая версия вашей любимой программы вышла без пакета для вашего дистрибутива. Что же делать? Да собрать ее из исходных текстов! Майк Сондерс расскажет все, что вам следует знать...

LXF111 44 1.jpg Пакет Audacity из репозитория Ubuntu: да, неплохо, но можно добавить пару эффектов, собрав его из исходных текстов.

Сборка приложения из исходников – это старая школа, верно? Кому охота бороться с командной строкой, отлавливать зависимости и упрашивать компилятор GCC работать как полагается? Глупо заниматься этим в мире двоичных пакетов и сетевых репозиториев. В Интернете доступны тысячи пакетов, и все аккуратно собраны для наших дистрибутивов, аннулируя необходимость возиться с Make-файлами. Но это только кажется. При всем их удобстве, двоичные пакеты имеют множество ограничений, которые можно преодолеть, лишь собрав программу из исходных текстов. Вот некоторые преимущества ручной сборки:

  • Злободневность Получайте программы сразу же после их публикации. КрутоеПриложение 2.1 уже вышло, а в вашем дистрибутиве все еще версия 2.0, и вам придется ждать следующего крупного релиза (если это только не самообновляющийся дистрибутив вроде Gentoo или Arch), чтобы обзавестись новинкой. Сборкой из исходных текстов вы сможете получить новейшую версию чего угодно сразу после выхода.
  • Функции В интересах стабильности издатели дистрибутивов при создании пакетов часто отключают экспериментальные функции, предоставляя вам более бедную (хотя и надежную) часть приложения. А идя путем исходных текстов, мы включаем дополнительные примочки – имеем право!
  • Оптимизация При сборке из исходных текстов вы получаете шанс сконфигурировать программу для вашей машины. Бинарные пакеты создаются для большого диапазона x86-процессоров. Используя определенные опции компилятора, вы можете создать специальное приложение именно для вашей модели процессора и извлечь дополнительную производительность из вашего ПК.

Доказать это проще, чем кажется; давайте рассмотрим, как оно работает. Навыки, приобретенные вами при чтении этой статьи, дадут хорошую основу для Linux (и Unix) карьеры, поскольку таким способом собираются почти все программы. Мы возьмем стандартный, немодифицированный вариант Ubuntu 8.04 и установим в нем звуковой редактор Audacity, включив при этом пару дополнительных опций. Audacity – хороший выбор, потому что в процессе его сборки могут возникать некоторые странные ошибки, а значит, мы научимся справляться с любой неожиданностью.

Подготовка

Зачем нужна сборка?

Если вы никогда до этого не видели исходного кода, вас может сбить с толку используемая здесь терминология, так что давайте разберемся с терминами и процессами.

Сборка (компиляция) – это процесс преобразования человеко-читаемого исходного кода (программы, записанной на одном из высокоуровневых языков программирования) в двоичные инструкции, используемые конкретным процессором данного компьютера. Для самых популярных языков программирования, C и C++, тяжелую работу преобразования исходного текста в двоичный исполняемый файл («бинарник») выполняет Коллекция Компиляторов GNU (GCC – GNU Compiler Collection): она читает исходные тексты и переводит содержащиеся в них инструкции C или C++ в машинный код вашего процессора.

Различные семейства процессоров имеют разные типы команд; например, при компиляции исходного текста приложения для работы на процессоре Intel, полученная программа не будет работать на процессоре PowerPC. Вам потребуется пересобрать ее для каждого типа процессора, на котором она будет использоваться.

Отметим, что для интерпретируемых языков, вроде Python, Perl или Ruby, каждая строка исходного текста выполняется на лету. Для этих языков нет никакого процесса компиляции – интерпретатор проходит программу строку за строкой.

Прежде всего заполучим исходный текст Audacity. Вы можете найти его на сайте проекта в http://audacity.sf.net, или на LXFDVD в разделе Звук. Сохраните audacity-src-1.2.6.tar.gz на рабочем столе, затем откройте окно командной строки (Приложения > Вспомогательные программы > Терминал) и введите следующее:

cd Desktop
tar xfvz audacity-src-1.2.6.tar.gz
cd audacity-src-1.2.6

Первая команда переносит нас в каталог Desktop, а вторая извлекает сжатый архив .tar.gz. (Заметьте, что для архивов с суффиксом .tar.bz2 вы должны использовать вместо нее tar xfvj). Наконец, мы перемещаемся в свежесозданный каталог с исходными текстами.

Введите ls, чтобы увидеть список распакованных файлов архива. Наряду с различными скриптами (подсвеченными зеленым) и подкаталогами (синего цвета), вы увидите файл README.txt. Всегда стоит глянуть в файлы с именами README.txt или INSTALL.txt, поскольку в них может быть полезная информация насчет сборки программы. Введите less README.txt, чтобы просмотреть файл, затем нажмите клавишу Q для выхода. В данном случае, нам не нужно читать все: можно перейти прямо к процессу компиляции.

LXF111 45 1.jpg Это результат работы ./configure --helpGCC показывает доступные нам опции настройки сборки.

Скрипт configure подготовит исходный текст Audacity к сборке. Введите команду

./configure --help

Она запустит скрипт настройки (./ требуется, потому что сценарий находится в текущем каталоге) и выведет все доступные опции сборки. Прокрутив терминал, вы увидите, что нам доступен огромный диапазон параметров. Но не дрожите – вполне можно принять значения по умолчанию. Хотя мы и собираемся сделать кое-какие мелкие изменения – во-первых, включим библиотеку SoundTouch: она предоставляет дополнительные инструменты манипуляции темпом и тоном, не вошедшие в стандартный пакет Ubuntu.

Далее, можно изменить место установки программы после сборки. Для этого используем со скриптом настройки опцию --prefix. Например, чтобы установить Audacity в каталог /usr/local (отдельно от других программ – так проще для поддержки), введите --prefix=/usr/local.

Как указывалось ранее, другим крупным преимуществом сборки программ из исходных текстов является выбор оптимизации. Установив переменные среды CFLAGS (для кода C) и CXXFLAGS (для C++) перед запуском скрипта configure, можно выбрать точные опции оптимизации компилятора GCC, которые мы хотим использовать. Это сложный предмет, но дополнительное увеличение скорости получить очень легко. Взгляните на эти команды:

 export CFLAGS=”-O3 -march=core2”
 export CXXFLAGS=”-O3 -march=core2”

Так мы устанавливаем вышеупомянутые переменные среды с оптимизацией, соответствующей архитектуре Intel Core 2. Часть -O3 начинается с буквы О, а не с нуля, и устанавливает третий уровень оптимизации. (Большинство дистрибутивов собирают свои пакеты с -O2 для упрощения отладки и небольшого уменьшения размера исполняемого файла). Если у вас машина с чипом AMD64, то используйте -march=athlon64, а если вы не уверены, то используйте просто -march=i686 для более широкой совместимости. За полным списком поддерживаемых процессоров можете обратиться к man-страницам GCC (man gcc), но читать их нелегко!

Итак, мы настроили оптимизацию, и готовы к запуску скрипта configure. Вперед:

./configure --prefix=/usr/local --with-soundtouch=system

Тем самым мы велим скрипту произвести установку в каталог /usr/local и включить опцию SoundTouch, которая присутствовала в выводе ./configure --help, виденном нами ранее. (Часть ‘system’ опции SoundTouch говорит о том, что мы хотим использовать версию SoundTouch, доступную в дистрибутиве, поскольку поставляемая с Audacity содержит ошибки.)

Ловим зависимости

Ой, что-то не так. После запуска команды ./configure выскочила следующая ошибка: ‘C compiler cannot create executables’ [компилятор C не может создавать исполняемые файлы]. Для сборки двоичных файлов из исходных текстов необходимо установить инструментарий разработчика, так что введите:

sudo apt-get install build-essential

В Ubuntu это приведет к установке мета-пакета, включающего все инструменты, необходимые для сборки стандартных программ командной строки. Если у вас другой дистрибутив, поищите GCC, G++ и Binutils в своем менеджере пакетов и немедленно установите их, затем повторно выполните скрипт настрой- ки. (Для новичков в командной строке подскажем экономящий время способ: нажмите клавишу «стрелка вверх», и ранее введенные команды вернутся).

Теперь скрипт проработает дольше, но споткнется и сообщит, что не смог найти в системе программу с именем wx-config. Для отрисовки интерфейса Audacity использует графический инструментарий под названием wxWidgets, а мы его еще не установили; потому и возникла ошибка. Итак, нужно извлечь wxWidgets из менеджера пакетов Synaptic.

Однако прежде чем браться за мышь, важно учесть, что многие программы Linux, особенно библиотеки и инструментарии, от которых зависят другие программы, поставляются в двух версиях. Одна из них – это библиотека времени выполнения, к которой могут подключаться программы, другая – набор библиотек разработчика и заголовочных файлов, используемых для сборки приложений. Итак, откройте Synaptic (в меню Система > Администрирование) и поищите wxWidgets.

Прокрутите появившийся список, и вы увидите libwxgtk2.6-0. Это библиотека времени выполнения, от которой зависят программы, использующие wxWidgets – она предоставляет реализацию вызовов wxWidgets средствами GTK+. Проверьте, установлена ли она, а также наличие libwxgtk2.6-dev (здесь содержатся необходимые файлы разработчика для сборки наших исходных текстов), затем примените изменения. (В других дистрибутивах эти пакеты будут иметь сходные имена, так что ищите wxWidgets или wxgtk. У пакетов разработчика имена почти всегда заканчиваются на -dev или -devel.)

Теперь перезапустите скрипт настройки. Вы увидите, что Audacity требует более старую версию wxWidgets, а именно 2.4.x! Это практически стандартная ситуация при сборке из исходных текстов, вот почему мы все это здесь и показываем; часто необходим метод проб и ошибок, чтобы точно выяснить, какие именно библиотеки и какие версии необходимы – и иногда это может утомлять. Итак, возвращаемся обратно в Synaptic, удаляем wxWidgets 2.6, и устанавливаем версию 2.4 (не забудьте пакет -dev).

Магия Checkinstall

Если у вас несколько ПК или вы являетесь администратором большого парка корпоративных машин, то у вас, вероятно, нет времени для выполнения всех шагов сборки на каждом компьютере. К счастью, для этого есть инструмент, позволяющий создавать двоичные пакеты программ, собранных из исходных текстов. Checkinstall, который можно загрузить с http://tinyurl.com/2uodas (или взять в разделе Главное диска-приложения LXFDVD), создает пакеты Deb, RPM и .tgz для Slackware.

Установив Checkinstall, запустите скрипт ./configure для приложения, которое вы хотите собрать, как было описано в тексте. Затем выполните make для выполнения сборки приложения, но не запускайте после этого обычное make install: вместо него, от имени root выполните checkinstall.

Тут вам будет задано несколько вопросов, например, про тип создаваемого пакета или хотите вы включить в него документацию или нет. По завершении работы Checkinstall вы получите двоичный пакет, который сможете установить на любом необходимом числе машин (если, конечно, на них тот же дистрибутив и установлены те же библиотеки).

Собираем код

Запустите скрипт configure еще раз, и вы увидите, что теперь все пройдет гладко. Для других программ может понадобиться обработать больше зависимостей, прежде чем удастся выполнить сборку – как уже говорилось, это всегда процесс проб и ошибок. Например, если configure-скрипт программы жалуется, что не может найти библиотеки разработки PNG, посмотрите пакет с именем вроде libpng-dev. Если вы собираете приложение, основанное на Qt, потребуется libqt-dev. Часто в файле README приводится полный список.

Команда, которую следует подать компилятору GCC – это (барабанная дробь)…

 make

Вот так все просто. Утилита make обращается к только что созданному файлу Makefile, разъясняющему порядок сборки исходного кода программы. В зависимости от ее размера – и скорости вашей машины – процесс сборки может занять где-то от 10 секунд (для небольших приложений командной строки) до нескольких часов (для таких левиафанов, как OpenOffice.org).

На этапе сборки вы заметите, что GCC вызывается с использованием настроек CFLAGS и CXXFLAGS, определенных нами ранее. Вы также можете увидеть предупреждения (warnings) о «нестрогом» коде, но о них беспокоиться нечего. Однако вы можете прийти в шок, когда процесс сборки вдруг остановится с ошибкой. Вы увидите, что SoundTouchEffect.o не может быть собран – означает ли это, что SoundTouch отсутствует?

Ну да, скрипт configure должен был бы предупредить нас об этом. Но не все в нашем мире совершенно – придется исправить проблему лично. Припомните, как мы в начале указали опцию --with-soundtouch=system для скрипта configure, вместо =local, потому что версия, поставляемая с Audacity, повреждена. (Вы и сами могли убедиться в том, что =local не работает, но мы малость сэкономили вам время!)

Итак, configure здесь нас немного подвел. Но дело за малым: откройте Synaptic и найдите и установите libSoundTouch (вместе с коллегой -dev). Скрипт настройки перезапускать не нужно – он завершился удачно, так что вновь введите make и следите за выводом. Теперь вы увидите, что не был найден FLAC. Ох! Запустите Synaptic и установите пакет библиотеки libflac-dev.

Введите ‘make’ еще раз, и вы увидите, что процесс сборки пошел дальше, но затем вновь остановился с целой серией ошибок, включая такую:

 undefined reference to ‘soundtouch::SoundTouch::SoundTouch()’

Похоже, компилятор до сих пор не может найти SoundTouch, даже несмотря на то, что мы установили ее и на стадии configure предупреждений не было. Дожили! На последней стадии сборки, когда все файлы программы объединяются (компонуются или «линкуются») в исполняемый файл, GCC не понимает, где находится SoundTouch.

Необходимо изменить Make-файл, который управляет процессом сборки. Введите

 gedit src/Makefile

Прокрутите до строки 31, где стоит ‘LIBS’ – это библиотеки, с кото рыми должен быть объединен (слинкован) Audacity. Добавьте в конец строки -libsoundtouch (регистр букв важен), сохраните файл и выйдите из редактора. Запустите make вновь. Вы увидите, что основной двоич ный файл Audacity был собран корректно, но процесс уперся в новую стену: не нашлась утилита msgfmt для управления документацией.

На сей раз не обойтись без поиска в Google. Ищите ‘msgfmt’ и ‘Ubuntu’ (оба термина – в одном сеансе поиска, но не в кавычках, поскольку это не фраза); вы увидите, что другие пользователи наткнулись на те же проблемы при сборке программ. Пропажа, оказывается, сидит в пакете gettext, но – как это нудно! – у команды Ubuntu есть пакет gettext и пакет gettext-base. Последний был установлен как часть набора build-essential, тогда как важный для нас инструмент msgfmt содержится в первом. Может быть, когда-нибудь разработчики дистрибутива перестанут разбивать программы на триллионы двусмысленно названных пакетов; но хорошо уже и то, что решение быстро нашлось в Google.

Итак, установите gettext, чтобы получить msgfmt, и запустите make вновь. Как говорит Борат, большой успех! Вы вернетесь в командную строку без ошибок. Осталось только установить вновь собранный Audacity в файловой системе, так что введите:

sudo make install

Это действие надо выполнить от имени пользователя root (администратора), потому и sudo. В не-Ubuntu дистрибутивах может потребоваться переключиться в режим root командой su, а затем ввести make install. И вы сможете запустить программу:

LXF111 47 1.jpg Ура! Audacity пересобран. Пусть интерфейс у него и на GTK 1, зато теперь у нас есть два классных новых эффекта.

/usr/local/bin/audacity

Если надо удалить программу, выполните sudo make uninstall. Вы можете также удалить каталог с исходными текстами, когда захотите – откомпилированная версия теперь хранится в /usr/local/.

Шрифты – не фонтан

Вы можете отметить, что в этой версии Audacity шрифты выглядят не очень-то красиво. Это потому, что версия wxWidgets 2.4, включенная в Ubuntu, была собрана с GTK1, где нет сглаживания шрифтов. Пересборка wxWidgets 2.4 с GTK 2 – это еще одно упражнение, которое вы можете выполнить по завершении нашего урока! В любом случае, загрузите какой-нибудь звуковой файл и щелкните на меню Эффекты. Вы увидите две новые опции, которые не были доступны в базовой версии Ubuntu: Изменить тон и Изменить темп.

Благодаря чудодейственной мощи сборки мы на шаг опередили Ubuntu. Что, Шаттлворт, съели? Поскольку добавление поддержки SoundTouch ради двух наших дополнительных функций – дело хлопотное, неудивительно, что команда Ubuntu на него плюнула. Сборка большинства программ, за которые вы возьметесь, пройдет гладко или потребует лишь несколько очевидных зависимостей, но мы навидались всяческих вариантов возможных проблем, так что теперь вы обучены и готовы к любым неожиданностям. Теперь пора за сборку! LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика