MyTetra Share
Делитесь знаниями!
Типовая сборка программ под Linux. Что делать, если нет файла configure, какие системы сборки бывают
Время создания: 10.01.2020 16:11
Текстовые метки: linux, сборка, компиляция, установка, исходники, программа, система, конфигурирование, configure, autotools, make, install, makefile, autogen, bootstrap, cmake, qmake
Раздел: Компьютер - Linux - Инсталляция программ
Запись: xintrea/mytetra_syncro/master/base/1578661862sk81scefcd/text.html на raw.github.com

В ОС Linux авторы программ традиционно наплевательски относятся к пользователям. Зачастую файлы README и INSTALL содержат недостоверную информацию о том, как собирать загадочные проекты этих сумрачных гениев. Поэтому, опытный Linux-пользователь должен уметь "на глаз" определять, какая система сборки используется в том или ином программном пакете. Определяется это, обычно, по составу файлов, которые находятся в корне проекта.


Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из файла Makefile. Но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, пришлось бы для каждого дистрибутива отдельно прописывать пути, где какие лежат библиотеки и куда лезть за заголовочными файлами. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов… Хорошая новость в том, что на этом они остановились.

Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны пакеты autoconf, automake и cmake, все это рано или поздно пригодится.


Automake + Autoconf

Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор configure. Если файл с таким именем уже есть в исходниках, то можно сразу запускать его. Но бывает так, что этого файла нет. Тогда, если это проект на c/c++, а не какой-нибудь Ruby или Go, то правила сборки конфигуратора configure могут быть описаны в файле configure.in или configure.ac. Если таковых файлов нет, то скорее всего используется какая-либо другая система сборки, например cmake.


Если есть файл configure.in

Итак, для сборки конфигуратора configure, в случае если файл configure.in существует, необходимо выполнить команду:


./bootstrap


или


./autogen.sh


Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:


aclocal

autoheader

automake --gnu --add-missing --copy --foreign

autoconf -f -Wall


Все эти команды используют файл configure.in. После выполнения этих команд создастся файл configure.


Если есть файл configure.ac

В этом случае необходимо выполнить такие команды:



aclocal

autoconf

automake

make --distclean (или make distclean)



В результате все так же появится файл configure.



Еще вариант для configure.in


Иногда бывает так, что в комплекте идут уже готовые файлы configure и configure.in. И вроде как можно было бы просто запустить configure, но он оказывается неработоспособным и выдает ошибки типа:



configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."



В этом случае для перегенерации configure надо запустить команду:



autoreconf -i



В результате будет сгенерован новый файл configure, с которым можно будет работать. Но и тут не все так просто: если файл configure.in был написан для одной версии autoconf, а у пользователя другая версия autoconf (пусть даже и более свежая, с совместимостью снизу-вверх никто не заморачивается), то далеко не факт, что обработка configure.in завершится успешно. Правда, иногда помогает повторный запуск с опцией -v (для отладочного вывода) команды autoreconf -v.



Использование конфигуратора configure


Далее необходимо запустить полученный конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально - может не быть):


./configure


Внимание!

Иногда разработчики поставляют исходники, в которых одновременно присутствуют и файл autogen.sh и файл configure. Чаще всего это означает, что разработчики забыли исключить файл configure из комплекта поставки. По-хорошему, они должны были поставить только autogen.sh, чтобы он сгенерировал configure с учетом системы пользователя. Поэтому не стоит торопиться и сразу запускать configure. Возможно, стоит переименовать этот файл, запустить autogen.sh, и запустить новый configure. Если он не стработает, попробовать запустить старый.

Попадаются и такие проекты, в которых переход на autogen.sh либо заброшен, либо находится в начальной стадии. И центральным, генерирующим Makefile скриптом, является configure. Конечно, разработчики нигде об этом писать не будут, исходя из принципа что кому нужно - тот сам разберется. В этом случае нет смысла запускать autogen.sh, нужно расчитывать именно на configure.

Как было сказано выше, сборка программ под Linux - это особая магия, иногда требующая умения читать мысли незнакомых людей.


Конфигуратор configure построит Makefile основываясь на полученных знаниях и файле makefile.am. Можно передать конфигуратору опции, предусмотренные в исходниках программы, которые позволяют включать/отключать те или иные возможности программы, обычно узнать о них можно командой


./configure --help


Также есть набор стандартных опций, вроде


--prefix=


которая указывает, какой каталог использовать для установки. Для Ubuntu обычно


--prefix=/usr


или


--prefix=/usr/local


Пути указываются без слеша в конце!


Ошибки в configure

В процессе работы configure возможно возникновение ошибок. Чаще всего ошибки будут возникать из-за того, что некоторые пакеты или dev-пакеты не установлены. Вот как выглядят ошибки:


configure: no Berkeley DB version 4.1 or higher found

configure: error: BerkeleyDB (libdb) not found.

...

checking for library containing poptGetContext... no

configure: error: POPT (libpopt) not found.



В этом случае надо доустанавливать из репозитария пакеты libdb5.3, libdb-dev, libpopt0, libpopt-dev. Как конкретно называются пакеты - зависит от дистрибутива. Чаще всего, опытные линуксоиды, "примерно", по логике вещей находят похожие названия пакетов (по части имени), и из них выбирают те что надо доустановить. После чего снова необходимо запустить configure, и так до тех пор, пока не исчезнут все ошибки.



Иногда может получиться так, что нужная библиотека и ее заголовочные файлы в системе установлены, но configure её упорно не видит. В этом случае надо пробовать использовать опции, которые (возможно) будут написаны в самой ошибке, чтобы через них указать путь к заголовкам библиотеки. Если же в тексте ошибки не сказано через какую опцию задается проблемный путь, надо пытаться читать выхлоп configure --help, в котором (возможно) будет написано через какие опции задаются пути. Либо надо копировать текст ошибки и искать решение в Интернете.



Признаком того, что configure правильно отработал, будет появление файла Makefile.


Cmake

Если в проекте имеется файл CMakeLists.txt, то скорее всего, проект надо собирать через утилиту cmake.

Традиционно, сборка проекта с cmake, если не оговорено отдельно, производится следующим образом:


  1. Создать в каталоге корня проекта подкаталог build. Корень проекта определяется, обычно, по тому, что в нем лежит файл CMakeLists.txt.
  2. Перейти в подкаталог build
  3. Выполнить команду:

cmake ..


Для команды cmake может потребоваться указать еще какие-то дополнительные опции, типа:


cmake .. -DCMAKE_INSTALL_PREFIX=/usr


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


Qmake

Если проект написан на Qt, то он, скорее всего, собирается через qmake (верно для Qt 3, 4, 5). Признаком того, что проект написан на Qt, является наличие файла с расширением *.pro, - это и есть файл Qt пректа. Утилита qmake делает на основе *.pro-файла файл Makefile.

Команда сборки, обычно, следующая. В каталоге, где лежит *.pro-файл необходимо выполнить:


qmake .


Да, надо обратить внимание, что команда с точкой. Точка означает текущий каталог. После работы данной команды, должен появиться файл Makefile. Следует учесть, что для успешной сборки qt-проекта, в системе должен быть установлен и фреймверк Qt соответствующей версии, и dev-пакеты к нему.


Make

make - это утилита, ради которой все вышеперечисленное и затевалось. Make занимается, непосредственно, сборкой проекта. Для работы make необходимо наличие Makefile (мейкфайла), который создавался на предыдущих шагах. Запуск процесса сборки производится командой:


make


Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент, когда команда в консоли закончит свое выполнение и не будет слова error. Теперь всё скомпилировано и готово для установки.

Сама установка происходит под пользователем root с помощью команды:


make install


Либо, если необходимо установить программу через пакетный менеджер, создается пакет через программу checkinstall с соответсвующими для текущего дистрибутива опциями. Некоторые дистрибутивы представляют собственные средства установки и генерации пакетов. Описание подобного программного обеспечения в задачу данной статьи не входит. Пользователю придется ознакомиться с ними самостоятельно.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования