Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

31 - Установка программ из source-кодов

Лекция



Сразу хочу сказать, что здесь никакой воды про установка программ из source-кодов, и только нужная информация. Для того чтобы лучше понимать что такое установка программ из source-кодов , настоятельно рекомендую прочитать все из категории Операционная система LINUX.

В этой лекции мы рассмотрим как в Linux выполнить установку программы из исходных кодов. Также говорят установить из source-кодов или “исходников“. В настоящее время для всех популярных Linux-дистибутивов программное обеспечение поставляется в виде пакетов и уже нет необходимости компилировать и устанавливать программы из source-кодов. Но все же уметь выполнять эту операцию нужно.

Как правило, исходные коды программы распространяются в архиве .tar.gz. Иногда могут встречаться другие типы архивов, но этот пока самый распространенный. Что означают символы tar.gz? Они говорят о том, что исходные коды программы были заархивированы командой tar, а затем сжаты командой gzip. Команда tar (type archive) - одна из самых старых команд Linux. Ее задача состоит в том чтобы из любой ветки файловой системы можно было сделать архив в виде одного файла. Таким образом утилита tar не сжимает данные, а записывает их в несжатом виде в один файл. Затем, созданный tar-файл, сжимается архиватором gzip. Например, создайте каталог targz в котором создайте несколько подкаталогов и файлов:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ mkdir targz
$ mkdir -p ./targz/1
$ mkdir -p ./targz/2
$ mkdir -p ./targz/3
$ mkdir -p ./targz/4
$ echo "Hello hello HELLO" > ./targz/1.txt
$ cp ./targz/1.txt ./targz/2.txt
$ cp ./targz/1.txt ./targz/3.txt
$ cp ./targz/1.txt ./targz/4.txt
$ cp ./targz/1.txt ./targz/1/1.txt
$ cp ./targz/1.txt ./targz/2/1.txt
$ cp ./targz/1.txt ./targz/3/1.txt
$ cp ./targz/1.txt ./targz/4/1.txt

Чтобы создать tar-архив (tar-файл) каталога targz выполняем команду:

1
$ tar -cf targz.tar ./targz/

В результате получим файл targz.tar. Чтобы распаковать tar-архив выполняем следующую команду:

1
$ tar -xvf targz.tar

Чтобы из tar-архива создать tar.gz-архив его нужно сжать утилитой gzip:

1
$ gzip targz.tar

В результате получим tar.gz-архив - targz.tar.gz. Обратите также внимание на то, что утилита gzip при сжатии удаляет исходный файл. То есть файл targz.tar будет автоматически удален после того как будет создан файлtargz.tar.gz. Чтобы распаковать gz-архив нужно воспользоваться командой gunzip:

1
$ gunzip targz.tar.gz

Таким образом, чтобы распаковать tar.gz-архив можно воспользоваться командами tar и gunzip:

1
2
$ gunzip targz.tar.gz
$ tar -xvf targz.tar

или использовать команду tar c дополнительным ключом - z, который автоматически вызывает команду gunzip для распаковки gz-архива:

1
$ tar -xvzf targz.tar.gz

В результате получим исходный каталог targz. Еще одна полезная, хотя и немного громоздкая конструкция которая позволяет вывести в консоли содержимое tar.gz-архива не распаковывая его:

1
$ gzip -dc targz.tar.gz 2>/dev/null | tar tvvf -

Итак, мы научились распаковывать tar.gz-архивы в которых распространяются исходные коды многих программ. Об этом говорит сайт https://intellect.icu . Теперь посмотрим как из них скомпилировать программу и установить ее. Для примера я предлагаю воспользоваться исходными кодами http-сервера - mini_httpd. Скачать можно отсюда.

Давайте познакомимся с основными служебными файлами, которые как правило содержаться в source-кодах. Распаковываем tar.gz-архив:

1
$ tar -xzvf mini_httpd-1.19.tar.gz

Переходим в каталог с исходниками и смотрим его содержимое:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cd ./mini_httpd-1.19/
$ ls -l
итого 192
drwxr-xr-x 3 igor igor  4096 2003-12-20 06:05 contrib
-r--r--r-- 1 igor igor   340 2001-12-22 20:54 FILES
-r--r--r-- 1 igor igor   414 1999-09-28 21:49 htpasswd.1
-r--r--r-- 1 igor igor  4959 2001-12-19 02:08 htpasswd.c
-r--r--r-- 1 igor igor   326 2005-06-29 20:32 index.html
-rw-r--r-- 1 igor igor  3140 2002-11-02 01:02 Makefile
-r--r--r-- 1 igor igor  2661 2005-06-29 20:31 match.c
-r--r--r-- 1 igor igor  1679 2005-06-29 20:31 match.h
-rw-r--r-- 1 igor igor   199 2001-12-23 22:09 mime_encodings.txt
-rw-r--r-- 1 igor igor  4632 2003-10-26 19:00 mime_types.txt
-r--r--r-- 1 igor igor 16625 2005-06-29 20:31 mini_httpd.8
-r--r--r-- 1 igor igor 88322 2005-06-29 20:31 mini_httpd.c
-r--r--r-- 1 igor igor  1132 2001-12-20 09:14 mini_httpd.cnf
-r--r--r-- 1 igor igor  2249 2002-07-30 21:45 port.h
-r--r--r-- 1 igor igor  2157 2005-06-29 20:31 README
drwxr-xr-x 2 igor igor  4096 2003-12-20 06:05 scripts
-r--r--r-- 1 igor igor  8284 2005-06-29 20:31 tdate_parse.c
-r--r--r-- 1 igor igor  1575 2005-06-29 20:31 tdate_parse.h
-r--r--r-- 1 igor igor   231 2003-12-20 06:03 version.h

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

Следующий важный файл - это файл Makefile. Этот файл предназначен для утилиты make. Утилита makeпредназначена для того, чтобы реализовать в автоматическом режиме некий алгоритм действий, необходимый для компиляции или установки приложения. Этот алгоритм действий и описан в файле Makefile. Будем говорить, что утилита make реализует цель описанную в файле Makefile. Целей может быть несколько. Откроем командой less Makefile и посмотрим часть его содержимого:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.....
BINDIR =        /usr/local/sbin
MANDIR =        /usr/local/man
CC =            gcc
CDEFS =         ${SSL_DEFS} ${SSL_INC}
CFLAGS =        -O ${CDEFS}
#CFLAGS =       -g ${CDEFS}
LDFLAGS =       -s
#LDFLAGS =      -g
LDLIBS =        ${SSL_LIBS} ${SYSV_LIBS} ${CRYPT_LIB}

all:            mini_httpd htpasswd

mini_httpd:     mini_httpd.o match.o tdate_parse.o
        ${CC} ${CFLAGS} ${LDFLAGS} mini_httpd.o match.o tdate_parse.o ${LDLIBS} -o mini_httpd

mini_httpd.o:   mini_httpd.c version.h port.h match.h tdate_parse.h mime_encodings.h mime_types.h
        ${CC} ${CFLAGS} -c mini_httpd.c

match.o:        match.c match.h
        ${CC} ${CFLAGS} -c match.c

tdate_parse.o:  tdate_parse.c tdate_parse.h
        ${CC} ${CFLAGS} -c tdate_parse.c
.....

В самом начале идет инициализация переменных, которые будут использоваться в Makefile. Например, переменная BINDIR = /usr/local/sbin. Затем идет вот такая конструкция:

1
all:            mini_httpd htpasswd

all - это и есть имя цели. Справа от двоеточия идет условие выполнения этой цели. Эта строка читается так: цель all будет достигнута тогда, когда будут достигнуты цели mini_httpd и htpasswd. Давайте посмотрим на цель mini_httpd:

1
2
mini_httpd:     mini_httpd.o match.o tdate_parse.o
        ${CC} ${CFLAGS} ${LDFLAGS} mini_httpd.o match.o tdate_parse.o ${LDLIBS} -o mini_httpd

Цель mini_httpd в свою очередь будет достигнута тогда когда будет успешно выполнена команда ${CC} ${CFLAGS} ${LDFLAGS} mini_httpd.o match.o tdate_parse.o ${LDLIBS} -o mini_httpd в результате которой должен скомпилироваться бинарный файл mini_httpd. Но, чтобы файл был успешно скомпилирован должны быть достигнуты цели mini_httpd.omatch.o и tdate_parse.o. И так далее по цепочке. Одна цель зависит от другой.

Как следует понимать строку ${CC} ${CFLAGS} ${LDFLAGS} mini_httpd.o match.o tdate_parse.o ${LDLIBS} -o mini_httpd? Очень просто. Путем подстановки значений переменных, она преобразуется к виду:

1
gcc -s mini_httpd.o match.o tdate_parse.o -lcrypt -o mini_httpd

gcc - это стандартный компилятор Linux для языков С/С++. То есть если в командной строке набрать make mini_httpd, то будет выполнена цепочка действий описанных в файле Makefile, после которых в случае успеха будет создан бинарный файл в каталоге с исходными кодами.

Другие цели которые есть в Makefile это installclean и tar. Цель clean очищает каталок с исходными кодами от промежуточных файлов компиляции оставляя только исходники. Цель tar создает tar.gz-архив. А цель installвыполняет установку приложения в систему:

1
2
3
4
5
6
7
8
9
install:        all
        rm -f ${BINDIR}/mini_httpd ${BINDIR}/htpasswd
        -mkdir -p ${BINDIR}
        cp mini_httpd htpasswd ${BINDIR}
        rm -f ${MANDIR}/man8/mini_httpd.8 ${MANDIR}/man1/htpasswd.1
        -mkdir -p ${MANDIR}/man8
        cp mini_httpd.8 ${MANDIR}/man8
        -mkdir -p ${MANDIR}/man1
        cp htpasswd.1 ${MANDIR}/man1

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

Таким образом, если в каталоге с исходными файлами присутствует Makefile, то можно приступать к компиляции. По умолчанию команда make без указания цели будет выполнять цель all. То есть makeравносильно make all. После успешного выполнения команды make можно выполнять команду make install, которая завершить установку программы в системе.

Если в каталоге с исходниками нет файла Makefile, а есть файл Makefile.in, значит должен быть скрипт config. Скрипт config проверяет систему и создает файл Makefile. Таким образом в общем случае команды для установки программы из исходных кодов при отсутствии файла Makefile будут такими:

1
2
3
$ ./config
$ make
$ make install

Если выполнить команду make в каталоге ./mini_httpd-1.19/, то получим ошибку компиляции целиhtpasswd.o, соответственно цель all не может быть реализована. В файле README написано, что утилитаhtpasswd предназначена для смены пароля. Основной же файл это mini_httpd. Поэтому, чтобы установить сервер, хотя бы частично можно написать так:

1
2
$ make clean
$ make mini_httpd

Компиляция проходит без ошибок и в результате будет скомпилирован файл mini_httpd. Если запустить этот файл от имени рута, затем открыть бразузер и набрать в нем http://localhost, то мы увидим сообщение о том, что mini_httpd-сервер работает. Останется только скопировать файл в каталог с бинарными файлами.

В качестве домашнего задания попробуйте изменить в файле Makefile цель install таким образом, чтобыmini_httpd мог работать в вашем дистрибутиве и управляться стандартными командами /etc/init.d/mini_httpd start|stop|restart.

Пожалуйста, пиши комментарии, если ты обнаружил что-то неправильное или если ты желаешь поделиться дополнительной информацией про установка программ из source-кодов Надеюсь, что теперь ты понял что такое установка программ из source-кодов и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Операционная система LINUX

создано: 2014-09-13
обновлено: 2021-03-13
132506



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Операционная система LINUX

Термины: Операционная система LINUX