Как построить свой мир

Алексей Федорчук
[email protected]

Построение мира начинается с настройки файла /etc/make.conf. После установки системы в минимальной комплектации вполне возможно, что такового и не обнаружится. В таком случае следует отыскать пример его в каталоге /usr/share/examples/etc и скопировать в /etc:

$ cp /usr/share/examples/etc/make.conf /etc/

В файле /etc/make.conf определяются глобальные переменные сборки не только базового комплекта FreeBSD (операция make world), но и ядра, а также всех собираемых из портов приложений.

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

Первыми идет несколько опций, относящихся к оптимизации под процессор:

#CPUTYPE?=i686
#NO_CPU_CFLAGS=	true	# Don't add -march=<cpu> to CFLAGS automatically
#NO_CPU_COPTFLAGS=true	# Don't add -march=<cpu> to COPTFLAGS automatically

Смысл опции CPUTYPE понятно - это имя наличного процессора. Возможные значения ее определяются текущей версией компилятора gcc, и для принятой во FreeBSD 5.1 STABLE (gcc 3.2.1) могут быть следующими (для x86 архитектуры):

athlon-mp athlon-xp athlon-4 athlon-tbird athlon k6-3 k6-2 k6 k5
p4 p3 p2 i686 i586/mmx i586 i486 i386

Сборка gcc для FreeBSD несколько отличается от канонической GNU'той (за деталями следует обратиться к документации - man gcc). Поэтому тут мы не увидим поддержки процессоров типа VIA (Cyrix) и еще некоторых.

Сама по себе опция CPUTYPE предписывает gcc простановку флагов оптимизации march=cpu_type и mcpu=cpu_type. Обсуждение их смысла далеко выходит за рамки настоящей заметки. Скажу только, что программа, собранная с флагом mcpu=cpu_type, будучи оптимизированной под указанный тип процессора, может быть запущена и на более младшем, тогда как march=cpu_type позволяет запуск только на данном (и более страшем) процессоре.

Опции NO_CPU_CFLAGS= и NO_CPU_COPTFLAGS= как раз и запрещают автоматическую простановку флагов march и mcpu в командной строке запуска gcc.

Следующие две строки

#CFLAGS= -O -pipe

и

#CXXFLAGS+= -fmemoize-lookups -fsave-memoized

позволяют детализировать флаги оптимизации (и не только оптимизации - а также отладки, выдачи сообщений и прочего) для компилятора gcc при сборке программ на Си и Си++, соответственно. Символ + в строке CXXFLAGS+= означает, что к флагам Си++ должны быть "приплюсованы" Си-флаги (эквивалентно форме CFLAGS=$CXXFLAGS).

Здесь следует отметить несколько важных моментов. Во-первых, в комментариях к /etc/make.conf настоятельно не рекомендуется использовать уровни оптимизации выше -O (он же -O1) при сборке world. Мой опыт свидетельствует, что при указании флага -O3 лпервция make world просто не проходит (рано или поздно следует сообщение об ошибке). Относительно уровня -O2 - не знаю, не пробовал. С умолчальным же уровнем -O1 все проходит нормально.

Во-вторых, сборка gcc, как уже говорилось, отличается от того, что используется в большинстве дистрибутивов Linux. В частности, в документации man (1) gcc не найти упоминаний о флагах типа sse, 3dnow, sse2 - так что их использовать не следует.

Ну и в третьих, замечание общего порядка: прежде чем проставлять всякие не очень часто используемые флаги оптимизации, сверьтесь с документации по gcc именно из комплекта FreeBSD.

# MAKE_SHELL controls the shell used internally by make(1) to process the # command scripts in makefiles. Three shells are supported, sh, ksh, and # csh. Using sh is most common, and advised. Using ksh *may* work, but is # not guaranteed to. Using csh is absurd. The default is to use sh. #

Строка

#MAKE_SHELL?=sh

определяет стиль скриптинга в make-файлах. Собственно, для чего она нужна - мне не вполне ясно. Очевидно, что умолчальное значение - практически единственно возможное. В комментарии сказано, что может пройти (а может и не пройти) значение ksh (но кто же использует первозданный шелл Корна в свободных системах?). Ну а третье теоретически допустимое значение (csh) резонно отмечено как абсурдное.

Строка

#BDECFLAGS=	-W -Wall -ansi -pedantic -Wbad-function-cast -Wcast-align
#		-Wcast-qual -Wchar-subscripts -Winline
#		-Wmissing-prototypes -Wnested-externs -Wpointer-arith
#		-Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings

устанавливает флаги отладки и выдачи сообщений для FreeBSD-developer'ов. Не будучи таковым, в смысл ее не вникал.

А вот эта строка устанавливает флаги оптимизации при сборке ядра. Рекомендации те же, что и при make world: более жестких флагов, чем умолчальные, не ставить.

#COPTFLAGS= -O -pipe

Смысл опции

#WANT_FORCE_OPTIMIZATION_DOWNGRADE=1

не очень понимаю - буду признателен за разъяснения.

Опция

#INSTALL=install -C

предписывает выполнить сравнение перед инсталляцией.

Опция

#MTREE_FOLLOWS_SYMLINKS= -L

останется пока без комментариев.

Опция

#PPP_NOSUID=	true

предназначена для установки нормальных прав доступа для ppp-соединения. В чем-то аналогичен смысл опций

#ENABLE_SUID_SSH=	true
#ENABLE_SUID_NEWGRP=	true

Точнее сказать затрудняюсь.

Большая группа опций предназначена для исключения сборки отдельных компонентов базовой системы из процесса make world. Дело в том, что если установить не все исходники базовой системы (а очевидно, что для большинства настольных пользователей все они и не нужны), а потом дать команду

$ make world

неизмеюно последует сообщение об ошибке, как только процесс дойдет до первой же недостающей части. И потому состав исходников в /usr/src должен соответствовать опциям нижеследующей секции - дабы не было и попытки собирать ненужное. Чтобы исключить сборку какого-либо из компонентов, следует снять комментарий с соответствующей строки. Смысл опций следующий (в меру моего разумения, знаки комментариев сняты с тех опций, которые резонно включить при сборке на настольной машине, относительно прочих - однозначного мнения не имею):

#NO_CVS=	true	# не собирать CVS;
#NO_CXX=	true	# не собирать C++ (как компонент gcc);
#NO_BIND=	true	# не собирать BIND;
NO_FORTRAN=	true	# не собирать Fortran (копонент gcc);
#NO_GDB=	true	# не собирать GDB;
NO_I4B=	true	# не собирать пакеты, связанные с isdn4bsd (а оно у нас нужно?);
NO_IPFILTER=	true	# не собирать пакеты IP-фильтрации;
NO_KERBEROS=	true	# не собирать и не устанавливать систему безопасности Kerberos;
#NO_LPR=	true	# не собирать систему печати;
#NO_MAILWRAPPER=true	# не собирать mailwrapper;
#NO_MODULES=	true	# не собирать модули вместе с ядром (подробности чуть ниже);
NO_OBJC=	true	# не собирать Objective C (часть gcc);
#NO_OPENSSH=	true	# не собирать OpenSSH
#NO_OPENSSL=	true	# не собирать OpenSSL (без нее не устанавливается links в умолчальном виде);
NO_SENDMAIL=	true	# не собирать sendmail;
#NO_SHAREDOCS=	true	# не собирать документацию проекта 4.4BSD (включать эту опцию не следует, в ней много разумного, доброго, вечного);
#NO_TCSH=	true	# не собирать умолчальный шелл суперпользователя - /bin/csh (каковой на деле есть tcsh);
NO_X=		true	# не собирать консольные программы с поддержкой оконной системы X (я всегда и везде включаю эту опцию);
NOCRYPT=	true	# не собирать кримптографию;
NOGAMES=	true	# не собирать игры;
NOINFO=	true	# не собирать документацию в системе info (я, например, ей не пользуюсь);
#NOLIBC_R=	true	# не собирать libc_r (re-entrant version of libc);
#NOMAN=		true	# не собирать документацию в формате man-pages (включать не нужно - ИМХО, без нее неуютно);
NOPROFILE=	true	# не собирать профильные библиотеки (вероятно, нужны только разработчику);
#NOSHARE=	true	# do not go into the share subdir

Следующая группа опций относится к сборке модулей и требует некоторого пояснения. Во FreeBSD, в отличие от Linux, сборка и установка модлей ядра не требует какого-либо конфигурирования. Все опции, поддержка которых доступна в модульной форме (а некоторые опции, насколько я знаю, в виде модулей реализоваы быть не могут), и которые не включены непосредственно в ядро, собираются и устанавливаются в процессе компиляции и инсталляции ядра. Это может быть не всегда желательно: некоторые пользователи (в их числе и автор этих строк) предпочитают все нужное жестко встраивать в ядро, а все ненужное - исключать (на то оно и ненужное). И вот для этого и предусмотрены опции - NO_MODULES= true, приведенная выше, а также

#MODULES_WITH_WORLD=true

которая запрещает сборку модулей при перекомпиляции ядра. Если при этом какие-то модули все же необходимы, их можно в явном виде перечиселить в строке

#MODULES_OVERRIDE=	linux ipfw

или, если требуется модульная поддержка файловой системы Linux - ext2fs (раньше, помнится, ее требовалось обязательно встраивать в ядро), включить строку

#WANT_EXT2FS_MODULE=yes

Опция

#MAKE_IDEA=	YES	# IDEA (128 bit symmetric encryption)

имеет отношение к безопасности и OpenSSH (точнее не знаю).

Опция

#NOMANCOMPRESS=	true

предписывает установку man-страниц в несжатой форме (по умолчанию они существуют в виде файлов *.gz).

Следующая группа опций, в отличие от большинства остальных, имеет "разрешительный" смысл. А именно, разрешает сборку и установку библиотек совместимости с ранними версиями FreeBSD:

#COMPAT1X=	yes
#COMPAT20=	yes
#COMPAT21=	yes
#COMPAT22=	yes
#COMPAT3X=	yes
#COMPAT4X=	yes

Опция, определяющая формат документации в зависимости от типа принтера. В примере - PostScript, второе возможное значение - ascii.

#PRINTERDEVICE=	ps

Опции, определяющие время ожидания реакции пользователя перез загрузкой ядра при старте системы:

#BOOTWAIT=0
#BOOTWAIT=30000

Несколько опций, определяющих параметры консоли на последовательном порту. Думаю, неактуально.

#BOOT_COMCONSOLE_PORT=	0x3F8
#BOOT_COMCONSOLE_SPEED=	115200

Поддержка загрузки ядра по FTP??

#LOADER_TFTP_SUPPORT= YES

Что-то относящееся к Kerberos, точнее не знаю:

#ENABLE_SUID_K5SU=	yes
#KRB5_HOME=		/usr/local

Опции, относящиеся к апдейту по CVS.

#SUP_UPDATE=     yes
#
#SUP=            /usr/local/bin/cvsup
#SUPFLAGS=       -g -L 2
#SUPHOST=        cvsup.uk.FreeBSD.org
#SUPFILE=        /usr/share/examples/cvsup/standard-supfile
#PORTSSUPFILE=   /usr/share/examples/cvsup/ports-supfile
#DOCSUPFILE=     /usr/share/examples/cvsup/doc-supfile

Без комментариев.

#TOP_TABLE_SIZE= 101

Языки, для которых собирается документация (правда, русской я что-то не видел).

#DOC_LANG=	en_US.ISO8859-1 ru_RU.KOI8-R

Все прочие опции относятся к сборке Sendmail, и говорить о них я не буду.

По завершении редактирования /etc/make.conf остается выполнить три простые действа: перейти в каталог /usr/src, выполнить команду

$ make buildworld

а затем - команду

$ make world install

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

$ make world

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