Лекция
Сразу хочу сказать, что здесь никакой воды про установка программ из 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.o, match.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 это install, clean и 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
Комментарии
Оставить комментарий
Операционная система LINUX
Термины: Операционная система LINUX