В этом разделе затронуты некоторые из наиболее часто задаваемых вопросов о коллекции портов и описаны основные методы устранения проблем, а также рассказано, что делать, если порт не работает.
А, вы, наверное, имеете в виду последовательные порты на задней панели вашего компьютера. Здесь мы используем слово "порт" в смысле результата "портирования" (переноса) программы с одной версии Unix на другую.
Патч - это маленький файл, в котором указано, как перейти от одной версии файла к другой. Он имеет формат обычного текста, и, как правило, содержит указания типа "удалить строку 23", "добавить вот эти две строки после строки 468" или "заменить строку 197 вот на такую". Их также называют дифф-файлами или просто диффами, потому что они создаются программой diff.
Это файлы, оканчивающиеся на .tar или, как вариант, на .tar.gz, .tar.Z, .tar.bz2 и даже .tgz.
В основном такие файлы представляют собой дерево каталогов, которое было заархивировано в один файл (.tar) и (может быть) подвергнуто сжатию (.gz). Такая методика первоначально использовалась для архивов на лентах Tape ARchives (откуда, собственно, и пошло слово tar), и она широко используется для распространения исходного кода программ в Интернет.
Вы можете просмотреть, какие файлы находятся в этих архивах, или даже самостоятельно извлечь их с помощью стандартной для Unix программы tar, включенной в стандартную поставку системы FreeBSD, как здесь:
% tar tvzf foobar.tar.gz % tar xzvf foobar.tar.gz % tar tvf foobar.tar % tar xvf foobar.tar
Это число, получаемое в результате сложения содержимого того файла, который вы хотите проконтролировать. Если меняется хоть один символ, контрольные суммы перестают совпадать, так что простое их сравнение поможет выявить изменение.
4.7.1.5. Я делал все, что здесь сказано, при компиляции портов с компакт-диска и все прекрасно работало до тех пор, пока я не попытался установить порт программы kermit.
# make install >> cku190.tar.gz doesn't seem to exist on this system. >> Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.
Почему он не может быть найден? У меня не тот компакт-диск?
Как описано в главе о компиляции портов с компакт-диска, некоторые порты не могут быть помещены на CDROM из-за их лицензионных ограничений. Kermit является примером такого приложения. Его условия лицензирования не позволяют нам поместить его tar-файл на компакт-диск, так что вам придется скачать его вручную--извините!
Причиной, по которой вы получили все эти сообщения об ошибках, является то, что в тот момент вы не были подключены к Интернет. Как только вы скачаете этот файл с любого из MASTER_SITES (перечисленных в Makefile), то сможете начать процесс установки заново.
4.7.1.6. Я это сделал, но, когда я попытался поместить этот файл в каталог /usr/ports/distfiles, то получил сообщение об ошибке, сообщающее об отсутствии прав доступа.
При работе система портов будет сгружать дистрибутивные tar-файлы в каталог /usr/ports/distfiles, однако многие системные администраторы определяют этот каталог как символическую ссылку на удалённый файловый сервер или компакт-диск, который доступен только для чтения. Если в вашем случае это так, то вы должны указать другой каталог для использования в качестве хранилища дистрибутивных файлов такой командой:
# make DISTDIR=/local/dir/with/write/permission install
4.7.1.7. Система портов работает, только когда все находится в каталоге /usr/ports? Администратор нашей системы сказал, что я должен держать все свои файлы в /u/people/guests/wurzburger, но тогда ничего не работает.
Для того, чтобы указать системе построения портов на использование других каталогов, вы можете использовать переменные PORTSDIR и PREFIX. В частности,
# make PORTSDIR=/u/people/guests/wurzburger/ports install
будет строить порт в каталоге /u/people/guests/wurzburger/ports, а устанавливать все в /usr/local.
# make PREFIX=/u/people/guests/wurzburger/local install
будет строить порт в каталоге /usr/ports и устанавливать в /u/people/guests/wurzburger/local.
И, наконец,
# make PORTSDIR=../ports PREFIX=../local install
использует обе переменные (этот пример слишком длинен для помещения на страницу полностью, но вы должны уловить общую идею).
Некоторые порты, использующие imake(1) (часть X Windows System), не очень хорошо работают с PREFIX, и всё равно будут пытаться устанавливаться в каталог /usr/X11R6. Подобным же образом некоторые порты на языке Perl игнорируют значение PREFIX и устанавливаются в дерево Perl. Заставить такие порты работать с PREFIX трудно или невозможно.
Если вам не нравится набирать все это каждый раз при установке портов, можно поместить эти переменные в ваше окружение. Прочтите справочные страницы по вашему командному процессору и найдите, как это сделать.
4.7.1.8. У меня нет компакт-диска с FreeBSD, но я хочу скопировать все tar-файлы вручную на мою систему, чтобы при установке порта не ждать каждый раз, когда же он скачается. Есть ли способ получить все эти файлы сразу?
Чтобы скачать все tar-файлы для коллекции портов, сделайте вот что:
# cd /usr/ports # make fetch
Чтобы скачать все tar-файлы для какого-то одного каталога из дерева портов, выполните следующее:
# cd /usr/ports/directory # make fetch
а что касается одного конкретного порта--наверное, вы уже догадались, что вам нужно сделать.
4.7.1.9. Я знаю, что, скорее всего, быстрее получится скачивать tar-файлы с одного из ближайших зеркальных серверов FreeBSD. Есть ли способ указать, что порты нужно сгружать оттуда, а не с серверов, указанных в качестве MASTER_SITES?
Да. Если вы, например, знаете, что ftp.FreeBSD.org гораздо ближе к вам, чем сайты, перечисленные в строке MASTER_SITES, то сделайте так:
# cd /usr/ports/directory # make MASTER_SITE_OVERRIDE= \ ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch
4.7.1.10. Я хочу знать, какие файлы нужно будет скачать при выполнении команды make до того, как они начнут скачиваться.
Команда make fetch-list выдаст список файлов, которые нужны для построения порта.
4.7.1.11. Есть ли способ предотвратить компиляцию порта? Я хочу немножко покопаться в исходных текстах до того, как буду устанавливать порт, однако несколько поднадоедает каждый раз следить и нажимать в нужный момент Ctrl+C .
При выполнении команды make extract процесс построения остановится после того, как будет сгружен и распакован исходный код порта.
4.7.1.12. Я пытаюсь создать собственный порт и хочу отключить компиляцию до тех пор, пока не увижу, что мои патчи работают нормально. Есть ли команда типа make extract, но работающая для патчей?
Да, make patch - это то, что вы ищете. Также вам может оказаться полезным параметр PATCH_DEBUG. И кстати, благодарим вас за ваши усилия!
4.7.1.13. Я слышал, что некоторые параметры работы компилятора могут приводить к ошибкам. Это правда? Как я могу быть уверенным, что порт компилируется с правильными параметрами?
Да, в версии 2.6.3 компилятора gcc (которая поставлялась с FreeBSD 2.1.0 и 2.1.5), параметр -O2 мог приводить к генерации ошибочного кода, если вы не использовали также опцию -fno-strength-reduce. (Большинство портов не используют параметр -O2). У вас должно получиться указание используемых параметров компилятора примерно следующим образом:
# make CFLAGS='-O2 -fno-strength-reduce' install
или посредством редактирования /etc/make.conf, но, к сожалению, не все порты это поддерживают. Самый надежный способ - это выполнить команду make configure, а затем перейти в каталог с исходными текстами и изучить файлы Makefile вручную, но это может оказаться утомительным занятием, если исходный код имеет много подкаталогов, каждый с собственными make-файлами.
Параметры компиляции по умолчанию во FreeBSD достаточно консервативны, так что если Вы их не меняли, то и проблем возникнуть не должно.
4.7.1.14. Портов так много, что трудно найти именно тот, который мне нужен. Есть ли где-нибудь список всех имеющихся портов?
Взгляните на файл INDEX в каталоге /usr/ports. Если вы хотите выполнить поиск в коллекции портов по ключевому слову, вы это тоже осуществимо. Например, вы можете найти порты, связанные с языком программирования LISP, с помощью команды:
% cd /usr/ports % make search key=lisp
4.7.1.15. Я начал устанавливать порт foo, однако система неожиданно остановила компиляцию и стала компилировать порт bar. Что, собственно, произошло?
Порту foo требуется что-то, имеющееся в порту bar -- например, если foo использует графику, в bar может присутствовать библиотека с полезными функциями обработки графики. Или bar может быть инструментом, который необходим для компиляции порта foo.
4.7.1.16. Я установил программу grizzle из портов и оказалось, что это бесполезная трата дискового пространства. Я хочу удалить ее, но не знаю, где находятся все файлы этой программы. Что посоветуете?
Нет проблем, просто наберите:
# pkg_delete grizzle-6.5
Альтернативным способом является:
# cd /usr/ports/somewhere/grizzle # make deinstall
4.7.1.17. Минуточку, вы же должны знать номер версии для использования в этой команде. Вы всерьёз полагаете, что я должен их все помнить?
Вовсе нет, вы можете выяснить это с помощью:
# pkg_info -I 'grizzle*' Information for grizzle-6.5: grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up arcade game.
Номер версии может быть также выяснен при помощи команды pkg_info или набором команды ls /var/db/pkg
4.7.1.18. Если говорить о дисковом пространстве, то каталог с портами, похоже, занимает ужасно много места. Можно ли удалять отсюда что-нибудь?
Да, если вы установили программу и достаточно уверены, что её исходные тексты вам больше не понадобятся, то хранить их вовсе не обязательно. Самый надёжный способ сделать это таков:
# cd /usr/ports # make clean
в результате чего будет сделан проход по всем подкаталогам и произойдет удаление всего, кроме скелетов каждого порта.
Tip: Тот же самый результат можно получить без рекурсивного вызова всех make-файлов. К примеру, вы можете удалить все рабочие каталоги непосредственно следующей командой:
# find /usr/ports -depth -name work - exec rm -rf {} \;
4.7.1.19. Я попробовал сделать так, но все равно все эти архивы или как там вы их называете, остались в каталоге distfiles. Могу ли я удалить и их тоже?
Да, если вы уверены, что с ними покончено, то их тоже можно удалить. Их можно удалить вручную, или командой make distclean.
4.7.1.20. Мне нравится иметь все больше и больше программ для того, чтобы поиграться с ними. Есть ли способ установить все порты за раз?
Просто сделайте вот так:
# cd /usr/ports # make install
Будьте внимательны, потому что некоторые порты могут устанавливать файлы с уже имеющимися именами. Если Вы устанавливаете два работающих с графикой приложения, и оба они устанавливают файл /usr/local/bin/plot, то у вас однозначно возникнут проблемы.
4.7.1.21. OK, я попробовал сделать это, но подумал, что этот процесс займет очень много времени, так что пошел спать, оставив все работать. Когда же я посмотрел утром на компьютер, то было откомпилировано только три с половиной порта. Что-то было сделано не так?
Нет, проблема в том, что некоторые порты задают вам вопросы, на которые мы не можем ответить за вас (например, "Хотите ли вы печатать на листы формата A4 или US letter?"), но на эти вопросы кто-то должен ответить.
OK, перед тем, как идти в кроватку/на работу/парк отдыха, сделайте вот что:
# cd /usr/ports # make -DBATCH install
При этом будут установлены все порты, которым не нужно взаимодействовать с пользователем. Затем, когда вы вернетесь, сделайте:
# cd /usr/ports # make -DINTERACTIVE install
чтобы завершить работу.
4.7.1.23. На моей работе используется программа frobble, которая есть в вашей коллекции портов, однако мы её несколько исправили, чтобы получить то, что нужно. Есть ли способ создания наших собственных пакетов для их распространения по нашим сайтам?
Нет проблем, полагая, что вы знаете, как сделать патчи с вашими изменениями:
# cd /usr/ports/somewhere/frobble # make extract # cd work/frobble-2.8 [Apply your patches] # cd ../.. # make package
4.7.1.24. Эта система портов - весьма хитрая штука. Я не могу понять, как вы это делаете. В чем секрет?
Здесь нет никакого секрета, просто взгляните на файлы bsd.port.mk и bsd.port.subdir.mk в каталоге /usr/ports/Mk/.
(Читателям, испытывающим дурноту при чтении скриптов, советуем не смотреть файлы в этом каталоге.)
Если вы встретили порт, который у вас не работает, есть несколько вещей, которые вы можете сделать, а именно:
Исправьте его! В Руководстве по созданию портов содержится подробная информация об инфраструктуре "Портов", так что вы сможете исправить иногда встречающиеся порты с ошибками или даже создать собственные!
Надавите--только по электронной почте! Сначала пошлите письмо человеку, сопровождающему порт. Наберите команду make maintainer или прочтите Makefile, чтобы найти его адрес. Не забудьте указать имя и версию порта (скопировав строчку $FreeBSD: из файла Makefile) и включите в письмо весь вывод, предшествующий возникновению ошибки. Если вы не получили ответа от этого человека, то можете воспользоваться командой send-pr для посылки сообщения об ошибке.
Сгрузите пакет с ближайшего к вам сервера. "Основная" коллекция пакетов находится на сервере ftp.FreeBSD.org в каталоге с пакетами, но первым делом проверьте местное зеркало! Это, скорее всего, будет работать, и сделать это, кроме того, будет гораздо быстрее, чем пытаться компилировать порты из исходного кода. Воспользуйтесь программой pkg_add(1) для установки пакета в вашей системе.