пятница, 4 декабря 2009 г.

Сборка из исходников

1). распаковка
$ tar xvzf имя_архива.tar.gz
$ tar xvjf имя_архива.tar.bz2
2). применение патчей (перед проверить чтобы версия патча совпадала с версией программы)
$ cd исходники_программы
$ patch --dry-run -p1 < /путь/к/патчу.patch (проверка)
$ patch -p1 < /путь/к/патчу.patch (наложение)
Отмена наложенного патча ключ -R
Если патчи в зжатом виде
$ gzip -cd патч.gz | patch -p0
$ bzip2 -cd патч.bz2 | patch -p0
3). перед установкой
проверить наличие пакетов: gcc-* (компилятор), binutils (компоновщик и архиватор библиотек), libc-dev (заголовки стандартной библиотеки языка Си), make.
прочитать README из корня архива
4). кунфигурирование и сборка
$ ./configure --prefix=/usr/local (путь установки) --with-* --without-* (вкл./выкл. добавляемых в приложение компоненты) --enable-* (использование спец. кода). Потом сгенерится Makefile.
$ make
Исли в корне нет Makefile или configure значит программа использует альтернативные сборки:
scons (в корне файл SConstruct)
- устанавливаем scons и запускаем процесс компиляции $ scons PREFIX=/usr/local $ sudo scons)
- опции в README передаются scons в качестве аргументов
cmake (CMakeLists.txt)
- $ cmake . (. - сборка в текущем каталоге)
- $ make
- опции в README передаются в качестве аргументов
5). Проблемы компиляции
Checking for qt4 ... no - установить сам пакет и его заголовочный файлы *-dev
Checking for unistd.h ... no - установить заголовочный файлы (пакет искать по названию файла)
Если не помогло:
недоустановленные dev-пакеты - доустановить
устаревшии версии пакетов в дистре - сборка из исходников самой зависимости, а также зависимость зависимости и т.д.
неправильные пути поиска библиотек и заголовочных файлов (обусловлена ошибкой составителя правил для системы сборки или установкой зависимости в нестандартный каталог) - указать пути через переменны компилятора и линковщика перед запуском сборщика
$ export CFLAGS="$CFLAGS -I /usr/local/include -I /opt/include -I /usr/mysoft/include"
$ export LDFLAGS="$LDFLAGS -L /usr/local/lib -L /opt/lib -L /usr/mysoft/lib"
если зависимость в нужном месте а конфигуратор ее не видит нужно править configure коментом мест где производится поиск зависимости
если приложение не может быть собрано новым компилятором (написано в README) установи нужную версию компилятора и укажи к нему путь через переменную СС перед запуском сборщика:
$ install gcc-3.4
$ export CC="which gcc-3.4"
$ ./configure --prefix=/usr/local
6). установка
$ make (scons) install (uninstall - удаление из корня исходников)
checkinstall - создание пакетов в момент установки программы из исходников. использование вместо make install набрать
# checkinstall -R // RPM-пакет
# checkinstall -D // Deb-пакет
# checkinstall -S // Slackware
После установки strip для бинарников и библиотек с целью уменьшить их обьем, для уже установленных приложений можно так
# find / | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded
# find / | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded
7). Проблемы запуска
перечитать README, там могут быть указание где и при каких условия не работает, проверить доступность компонентов и каталогов программе, --help и проверить есть ключ дебуга, логи посмотреть.
тяжелая артиллерия strace (трассировщик системных вызовов, отслеживает все сисколлы, произведенные приложением и проверяет возвращаемое значение)
$ strace программа
вызов лучше смотреть с конца, пролистывая close и смотря open, проверить какие вернули отрицательный статус (-1) и смотреть к чему обращались (95% - права или отсутствие каталога/файла)
8). Флаги оптимизации
оптимизация выше "-О1" (или просто "-О") потенциально опасна
"-О2" не опасен большинству приложений, зато убивает низкоуровневый код с ассемблерными вставками
"-О3" (активирует агрессивный режим, идущий против стандартов) валит каждое 2 приложение.
Лучше остановится на таких флагах
О - базовая оптимизация (значительно увеличивается скорость исполнения программы)
О2 - стандартная (по сравнению с О чуть увеличит объем бинарника и скорость исполнения)
Оs - тоже О2 + флаги уменьшающие размер
fomit-frame-pointer - компилятор не сохраняет указатель на кадр стека (экономим на этом время). Может увеличить скорость программы

Если библиотеки в нестандартных каталогах и нужны при сборке ldconfig в помощь

Если непонятно, почему программа не находит что-то при конфигурации из сорцов, есть простой алгоритм:
Если пакет стоит, а configure говорит что нет, значит скорее всего нет пакета с хидерами (т.е. -devel) для одноименного пакета.
Если из сообщения вообще непонятно, чего конфигуратору нужно (типа "у вас не установлен KDE" smile.gif ) - смотрим файл configure.log в том же каталоге где патались запустить configure. Ищем там то самое сообщение, которым закончилась неудачная попытка конфигурации (оно всегда ближе к концу, непосредственно перед таблицей переменных, которые в логе всегда выводятся в конец файла).
Смотрим, чего конфигуратору не хватило - чаще всего он ищет либо какой-то хидер (.h или .hpp) либо некую библиотеку (тогда в логе будут сообщения от линкера (ld) о том, что библиотека не найдена (типа -lbla-bla not found).
В установке программ кликаем по биноклю в строке поиска, выбираем "по файлу" и вбиваем в строку не найденный файл. После чего устанвливаем найденные пакеты вместе с депенденсами.

Комментариев нет:

Отправить комментарий