Зачем мне это?

Ведь можно было бы просто взять бинарный пакет и радоваться жизни.

Однако эта информация полезна:

  • В приложении могут быть ошибки. А вам НУ ОЧЕНЬ надо использовать данное приложение. В результате, обладая знанием и навыком, можно внести исправление и решить текущую проблему.
  • Вы начинаете новый проект и хотите построить разумную систему сборки вашего приложения.
  • ….

Начнём с простого :)

Как выглядит процесс сборки из исходных кодов:

  1. Получить доступ к исходным кодам и скачать себе.
    • GitHub, публичный хостинг Git-репозиториев, из которых можно делать clone. Для работы необходим git.
    • В “стародавние” времена у каждого уважающего себя проекта был сайт, на котором публиковались архивы с исходным кодом. И их можно было скачать.
    • В любом нормальном дистрибутиве для каждого пакета есть также пакет с исходным кодом, из которого данный бинарный пакет был собран.
  2. Узнать каким образом это ПО собирается.
    • readme, README.md, …. - файлы содержат общую информацию о проекте. Зачастую там можно найти информацию про сборку.
    • Альтернативные: get-started.md, каталог doc/, файл INSTALL
    • Поискать информацию о сборке на официальном сайте проекта. Другое место - база знаний, она же wiki.
    • Свободный поиск.
  3. Собрать, следуя инструкции. И пытаться решить проблемы, которые не были отражены в инструкции.

Рассмотрим пример сборки на чистом Make

Соберём из исходных кодов http://ne.di.unimi.it/

Оно является текстовым редактором :)

  1. поставить git
  2. прочитать INSTALL.md
  3. поставить make с помощью мета-пакета build-essential
  4. выполнить команду make из INSTALL.md
  5. поймать ошибку по отсутсвующему файлу makeinfo
  6. найти пакет, в котором есть исполняемый файл makeinfo, texinfo
  7. поймать ошибку об отстсвующем файле curses.h от комплиятора GCC
  8. находим пакет libncruses-dev, в котором содержатся нужные файлы, ставим его
  9. разделяем make build install на make build и sudo make install

Какие проблемы сборки на Make мы увидели?

  • Мы должны были сами понять чего не хватает для сборки.
  • Мы получали ошибки о том, что чего-то не хватает только во время выполнения этого шага, а не заранее.
  • Нам очень повезло, что зависимости лежат именно там, где они прописаны в Makefile. При компиляции можно (и нужно) указать каталоги, в которых происходит поиск заголовочных файлов и файлов-библиотек. В разных дистрибутивах они могут находиться в разных местах.

  • Надо было уметь пользоваться инструментами для поиска пакетов-зависимостей

GNU Autotools

Для смягчения проблем первых трёх проблем придумали более сложные системы сборки.

С помощью Autotools разработчик описывает список зависимостей, которые нужны для сборки его приложения. А пользователь перед компиляцией запускает специальный скрипт, который проверят, что все зависимости установлены и настраивает Makefile на их использование.

  • Мы узнаем, что нет нужных компонент на этапе конфигурирования
  • Пользователь получает информацию о проблеме не в формате ошибки вызова инструмента

В качестве примера приложения, которое использует GNU Autotools рассмотрим LFTP, https://lftp.yar.ru/, клиента для FTP и SFTP.

  1. Качаем с помощью wget исходные коды
  2. Распаковываем файл
  3. Читаем файл INSTALL
  4. Выполняем скрипт configure
  5. Скрипт упал на отсутствующей библиотеке readline
  6. Ставим заголовочные файлы, libreadline-dev
  7. Запускаем скрипт заново
  8. Жалуется на pkg-config и заголовочные файлы libgnutls. Ставим их
  9. Запускаем скрипт заново
  10. Ставим zlib1g-dev пакет
  11. Запускаем скрипт заново
  12. Запускаем компиляцию make -j3
  13. Ставим приложение с помощью sudo make install
./configure
make
sudo make install