Компиляция и установка программ из исходников
Не редко необходимые пакеты можно найти только в виде исходных текстов, в данной статье описывается метод установки пакета из исходных текстов.
Распаковка
Программы обычно распространяются в упакованных архивах, это файлы с расширениями
Нужно понимать отличие между архиватором и упаковщиком.
Для архивации директорий и файлов используется программа tar; результатом её работы является файл с расширением .tar. Грубо говоря, это копия файловой системы — директорий и файлов с их атрибутами и правами доступа, помещённая в один файл.
Данный файл по размеру будет чуть больше, чем суммарный размер файлов, которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики — программы, которые позволяют уменьшить размер файла без потери данных.
Программа tar умеет распаковывать, поэтому не нужно вызывать gunzip, а можно просто указать программе tar, что файл нужно cначала распаковать. Например, команда
tar -xvf some_app_name>.tar.gz
сразу распакует и разархивирует. Отличие файлов с расширениями
лишь в том, что использовались разные упаковщики, программа tar определяет метод сжатия автоматически и дополнительных опций в данном случае не требуется.
После распаковки необходимо перейти в полученный каталог, все описываемые ниже команды выполняются в каталоге с исходными текстами пакета.
Сборка пакета
Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов …на этом они остановились
Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake.
Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор; как собрать конфигуратор, описано в файле configure.in. Для сборки конфигуратора необходимо выполнить
Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:
aclocal autoheader automake --gnu --add-missing --copy --foreign autoconf -f -Wall
Все эти команды используют файл configure.in. После выполнения этих команд создастся файл configure. После этого необходимо запустить конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально- может не быть)
Конфигуратор построит Makefile основываясь на полученных знаниях и файле makefile.am. Можно передать конфигуратору опции, предусмотренные в исходниках программы, которые позволяют включать/отключать те или иные возможности программы, обычно узнать о них можно командой
Также есть набор стандартных опций, вроде
, которая указывает, какой каталог использовать для установки. Для Ubuntu обычно
БЕЗ слеша в конце! Теперь можно запустить процесс сборки самой программы командой
Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент, когда команды в консоли перестанут «беспорядочно» выполняться и не будет слова error. Теперь всё скомпилировано и готово для установки.
Установка
Усилия потраченные на Правильную установку в последствии с лихвой окупятся в случае удаления или обновления устанавливаемого программного обеспечения.
Правильная установка(Вариант №1)
Установка при помощи утилиты checkinstall. Для установки выполните
sudo apt-get install checkinstall
Минус данного способа: checkinstall понимает не все исходники, поскольку автор программы может написать особые скрипты по установке и checkinstall их не поймёт.
Для создания и установки deb-пакета необходимо выполнить
Правильная установка(Вариант №2)
Быстрое создание deb-пакета «вручную».
Основное отличие от предыдущего способа заключается в том, что в данном случае вы создаете пакет вручную и отслеживаете все вносимые изменения. Так же этот способ подойдет вам, если исходники не поддерживают сборку пакета с checkinstall.
fakeroot make install DESTDIR=`pwd`/tempinstall
Создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/conffiles список всех файлов, которые должны попасть в /etc:
сd tempinstall mkdir DEBIAN find etc | sed "s/^/\//" > DEBIAN/conffiles
Package: имя_пакета Version: 1.2.3 Architecture: amd64/i386/armel/all Maintainer: Можете вписать своё имя, можете дребедень, но если оставить пустым, то dpkg будет ругаться Depends: Тут можно вписать список пакетов через запятую. Priority: optional Description: Тоже надо что-нибудь вписать, чтобы не кидало предупреждения
sudo dpkg -i tempinstall.deb
Configure Make Install
Сначала Вам скорее всего нужно скачать архив с программой, которую Вы хотите установить.
Например, команда для скачивания python3.7:
И перейти в только что распакованную директорию
В этой директории скорее всего будет находиться скрипт configure
Configure
configure — это не команда linux а скрипт, который обычно лежит в папке к configure
Означает, что означает что префикс установки /usr ,
Бинари уходят в usr/bin
libraries в usr/lib
Проверяется наличие всего необходимого
Создается файл MakeFile
—prefix=PREFIX — папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
—bindir=DIR — папка для размещения исполняемых файлов, должна находится в PREFIX;
—libdir=DIR — папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
—includedir=DIR — папка для размещения man страниц;
—disable-возможность — отключить указанную возможность;
—enable-возможность — включить возможность;
—with-библиотека — подобно enable активирует указанную библиотеку или заголовочный файл;
—without-библиотека — подобное disable отключает использование библиотеки.
Make
.cpp файлы компилируются в .o файлы
один .h файл может использоваться несколькими .cpp файлами
makefile нужны для того чтобы печатать меньше названий файлов и опций вручную.
С их помощью можно делать build только тех файлов, которые изменились.
Make это инструмент, который вызывает компиллятор. Можно указать тот компиллятор который нужен именно Вам.
С помощью инструкций в makefile можно указать какие именно файлы нужно заново компилировать.
В директории находятся три .cpp файла, два .h файла и три .o файла, оставшиеся от прошлой компиляции.
- Example.cpp , Example.o
- Second.cpp , Second.h , Second.o
- Third.cpp , Third.h , Third.o
Мы хотим, чтобы при изменении самого Example.cpp либо его зависимости Second.h начиналась новая компиляция Example.cpp а затем новый Example.o линковался со старыми Second.o и Third.o Для этого напишем Makefile aomake all: simple simple: Example.o Second.o Third.o g++ Example.o Second.o Third.o — Simple Example.o: Example.cpp Second.h g++ -c Example.cpp Отступы нужно ставить табуляцией Смотрим на последние две строки:
Если Second.h или Example.cpp (в который включен Second.h) изменились нужно компилировать файл Example.cpp после чего получается object файл Example.o и, как видно из первых двух строк — после обновления Example.o все object файлы линкуются.
Выигрыш в этой ситуации заключается в том, что нам не нужно было перекомпилировать Second.cpp и Third.cpp мы просто перелинковали уже существующие Second.o Third.o с новым Example.o
To запустить этот файл нужно к команде make добавить опцию f и название файла make -f aomake У файла Second.cpp две зависимости: Second.h и Third.h
У файла Third.cpp только одна зависимость: Third.h
Учтём эти зависимости в нашем aomake all: simple simple: Example.o Second.o Third.o g++ Example.o Second.o Third.o — Simple Second.o: Second.cpp Second.h Third.h g++ -c Second.cpp Third.o: Third.cpp Third.h g++ -c Third.cpp Example.o: Example.cpp Second.h g++ -c Example.cpp Ещё одной полезной опцией является j make -j -j — jobs Определяет число работ — jobs (commands) которые запускаются одновременно.
Если указано больше чем одна -j опция, то применяться будет последняя.
Если -j опция дана без аргументов make не будет ограничивать количество работ запускаемых одновременно. То есть запуститься сможет неограниченное количество работ одновременно. Более подробную информацию по Makefile вы можете найти в статье «makefile tutorial»
Install
install Make — это не единственный способ устанавливать программы под linux. Более того, за сорок с лишним лет существования утилиты make вышло много её версий.
gnu.org Прежде чем ставить что-то по-старинке с make install — советую изучить checkinstall
Configure Make Install
Сначала Вам скорее всего нужно скачать архив с программой, которую Вы хотите установить.
Например, команда для скачивания python3.7:
И перейти в только что распакованную директорию
В этой директории скорее всего будет находиться скрипт configure
Configure
configure — это не команда linux а скрипт, который обычно лежит в папке к configure
Означает, что означает что префикс установки /usr ,
Бинари уходят в usr/bin
libraries в usr/lib
Проверяется наличие всего необходимого
Создается файл MakeFile
—prefix=PREFIX — папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
—bindir=DIR — папка для размещения исполняемых файлов, должна находится в PREFIX;
—libdir=DIR — папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
—includedir=DIR — папка для размещения man страниц;
—disable-возможность — отключить указанную возможность;
—enable-возможность — включить возможность;
—with-библиотека — подобно enable активирует указанную библиотеку или заголовочный файл;
—without-библиотека — подобное disable отключает использование библиотеки.
Make
.cpp файлы компилируются в .o файлы
один .h файл может использоваться несколькими .cpp файлами
makefile нужны для того чтобы печатать меньше названий файлов и опций вручную.
С их помощью можно делать build только тех файлов, которые изменились.
Make это инструмент, который вызывает компиллятор. Можно указать тот компиллятор который нужен именно Вам.
С помощью инструкций в makefile можно указать какие именно файлы нужно заново компилировать.
В директории находятся три .cpp файла, два .h файла и три .o файла, оставшиеся от прошлой компиляции.
- Example.cpp , Example.o
- Second.cpp , Second.h , Second.o
- Third.cpp , Third.h , Third.o
Все они нужны для проекта и не могут быть объединены в один файл.
Известно, что Example.cpp включает в себя файл Second.h и других зависимостей не имеет.
Мы хотим, чтобы при изменении самого Example.cpp либо его зависимости Second.h начиналась новая компиляция Example.cpp а затем новый Example.o линковался со старыми Second.o и Third.o
Для этого напишем Makefile aomake
all: simple simple: Example.o Second.o Third.o g++ Example.o Second.o Third.o — Simple Example.o: Example.cpp Second.h g++ -c Example.cpp
Отступы нужно ставить табуляцией
Смотрим на последние две строки:
Если Second.h или Example.cpp (в который включен Second.h) изменились нужно компилировать файл Example.cpp после чего получается object файл Example.o и, как видно из первых двух строк — после обновления Example.o все object файлы линкуются.
Выигрыш в этой ситуации заключается в том, что нам не нужно было перекомпилировать Second.cpp и Third.cpp мы просто перелинковали уже существующие Second.o Third.o с новым Example.o
Чтобы запустить этот файл нужно к команде make добавить опцию f и название файла
У файла Second.cpp две зависимости: Second.h и Third.h
У файла Third.cpp только одна зависимость: Third.h
Учтём эти зависимости в нашем aomake
all: simple simple: Example.o Second.o Third.o g++ Example.o Second.o Third.o — Simple Second.o: Second.cpp Second.h Third.h g++ -c Second.cpp Third.o: Third.cpp Third.h g++ -c Third.cpp Example.o: Example.cpp Second.h g++ -c Example.cpp
Ещё одной полезной опцией является j
-j — jobs Определяет число работ — jobs (commands) которые запускаются одновременно.
Если указано больше чем одна -j опция, то применяться будет последняя.
Если -j опция дана без аргументов make не будет ограничивать количество работ запускаемых одновременно. То есть запуститься сможет неограниченное количество работ одновременно.
Более подробную информацию по Makefile вы можете найти в статье «makefile tutorial»
Install
Make — это не единственный способ устанавливать программы под linux. Более того, за сорок с лишним лет существования утилиты make вышло много её версий.
Прежде чем ставить что-то по-старинке с make install — советую изучить checkinstall