Построение мира начинается с настройки файла /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=to CFLAGS automatically #NO_CPU_COPTFLAGS=true # Don't add -march= 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
цель которой совмещает оба действа. Второй вариант проще, первый - лучше с точки зрения отслеживания возможных ошибок.