======Wok и инструментарий======
=====Обзор=====
[[http://hg.slitaz.org/cookutils/raw-file/tip/doc/cookutils.en.html|CookUtils]] используется для компиляции и создания (приготовления) пакетов в соответствии с инструкциями, находящимися в рецепте. Он помещает скомпилированные файлы в папку и вызывает TazPkg для упаковки указанной папки в пакет. Рецепт, полученный вами из wok, отличается своей «нижней половиной» от рецепта в TazPkg; рецепт CookUtils содержит правила как для компиляции, так и для упаковки (которые он передает в TazPkg), в то время как TazPkg занимается только упаковкой.
CookUtils — одна из многих небольших утилит проекта SliTaz, используемая для автоматической пересборки дистрибутива из исходников. В проекте вы также найдете архив [[ru:cookbook:slitaztools|утилит]], содержащий различные небольшие инструменты, примеры и файлы конфигурации. Генератор дистрибутивов [[http://hg.slitaz.org/tazlito/raw-file/tip/doc/tazlito.en.html|TazLiTo]] предназначен для пользователей и разработчиков; он может извлекать и реконструировать ISO-образ LiveCD и создавать редакцию дистрибутива (flavor) на основе списка пакетов, файла конфигурации и описания. Все утилиты распространяются в виде исходников, а также установлены по умолчанию в SliTaz.
Разработчики и будущие участники могут обратиться к странице [[http://www.slitaz.org/ru/devel/forge.php|разработки]], которая содержит информацию об управлении проектом SliTaz.
===Структура и организация Wok===
//Wok// — это структура каталогов, в которой размещаются все доступные пакеты. Каждый каталог содержит по меньшей мере один рецепт, по которому можно скачать, распаковать, скомпилировать и создать пакет. Кроме того CookUtils необходимо создать папку для хранения загруженных исходников (//$SOURCES_REPOSITORY//, обычно ///home/slitaz/src//) и репозитория генерируемых пакетов (//$PACKAGES_REPOSITORY//, обычно ///home/slitaz/packages//); эти значения могут быть переопределены в файле ///etc/slitaz/cook.conf//.
Существует более одного Wok в [[http://hg.slitaz.org|репозиториях Mercurial]]:
* **wok-undigest**: //вклады, ожидающие тестирования и исправления ошибок перед помещением в нестабильный Wok//
* **wok**: //пакеты для нестабильного релиза, Cooking//
* **wok-stable**: //пакеты для стабильного релиза SliTaz//
Изначально, любые вклады направляются в репозиторий //undigest//. Когда становится видно, что пакет прошел достаточное тестирование, не провалив автоматическую сборку, он может быть перемещен в Wok.
=====Подготовка=====
В [[http://www.slitaz.org/ru/devel/forge.php|уголке разработчика]] вы найдете бесценную начальную информацию. Вы должны прочитать и понять это, прежде чем продолжить.
Перед началом работы с Wok вы должны уже установить [[http://hg.slitaz.org/cookutils/raw-file/tip/doc/cookutils.en.html|CookUtils]] и основные инструменты разработки (Binutils, компилятор, библиотеки разработчика, make). Для этого достаточно установить мета-пакет //slitaz-toolchain//:
# tazpkg recharge
# tazpkg get-install slitaz-toolchain
Чтобы получить доступ к репозиториям SliTaz, установите пакет //mercurial//:
# tazpkg get-install mercurial
Более подробная информация по использованию Mercurial CVS доступна на его [[http://mercurial.selenic.com/|сайте]] и в "[[http://hgbook.red-bean.com/|Hg Book]]".
===Клонирование Wok===
Если вы хотите создавать пакеты для включения в репозитарии SliTaz, сначала необходимо получить текущий Wok с помощью Mercurial. Это называется //клонировать// Wok — процедура, которая загрузит весь Wok со всей своей историей в рабочую папку. **Если вы хотите использовать CookUtils только для сборки пакетов для личного пользования, в этом нет необходимости.** Вместо этого смотри ниже главу [[#Создание персонального Wok|Персональный Wok]].
Обычное расположение клона Wok — это ///home/slitaz/wok//:
# cook setup --wok
Эта загрузка может занять некоторое время; по окончании у вас будет полная структура рабочих каталогов [[http://hg.slitaz.org/wok/|Cooking wok]].
Wok является одним из многих проектов, размещенных в [[http://hg.slitaz.org|репозиториях Mercurial]]. Отдельные пакеты сгруппированы в большие проекты (Wok, Wok-Stable и Wok-Undigest); каждый пакет не имеет своего собственного суб-проекта, а лишь подкаталог; Mercurial не может (пока) клонировать отдельные части проекта, таким образом, вы не можете клонировать только индивидуальный пакет.
===Создание персонального Wok===
Если ваши пакеты предназначены только для персонального использования и вы не планируете включать их в репозитории SliTaz, можно создать wok с нуля.
# cook setup
=====Компиляция и сборка пакетов=====
Для того, чтобы собрать ваш первый пакет, CookUtils должен знать, где располагается ваш рабочий каталог. По умолчанию путь к нему ///home/slitaz/wok//, но вы можете его изменить или переименовать wok, который вы хотите скачать.
Вкратце, процесс создания пакета SliTaz из исходников заключается в следующем: [[http://www.tuxfiles.org/linuxhelp/softinstall.html#s2|настроить]], [[http://www.tuxfiles.org/linuxhelp/softinstall.html#s3|скомпилировать]] и [[http://linux.die.net/man/1/strip|очистить]].
Мы не используем последний шаг «//make install//»; созданные файлы не устанавливаются в систему, они остаются в выходной папке ($DESTDIR), готовые к упаковке.
Желательно, чтобы создавая ваш первый пакет, вы [[http://doc.slitaz.org/en:cookbook:devcorner#kiss-comply-to-standards|не усложняли]] его и создавали пакет без изменения его рецепта или поиска зависимостей. M4 является идеальным кандидатом для наших целей:
# cook m4
После того, как CookUtils соберет M4, готовый пакет будет помещен в папку, указанную в файле конфигурации (по умолчанию ///home/slitaz///packages). Если все прошло хорошо, вы можете установить пакет на хост-систему или использовать его для создания дистрибутива LiveCD с помощью TazLiTo!
Если вы знакомы с [[ru:cookbook:receipt|рецептами]] и процессом компиляции, вы можете использовать следующую команду, чтобы интерактивно создать рецепт нового пакета:
# cook new имя_пакета --interactive
Обязательно прочитайте документацию по возможностям, предоставляемым [[ru:cookbook:receipt|рецептами]] и [[ru:guides:tazwoktips|советы TazWok]], чтобы избежать разочарований!
===Использование списка===
CookUtils может скомпилировать несколько пакетов с помощью одной команды. Это достигается с помощью //списка приготовления//, текстового файла по одному пакету на строке. CookUtils может принять список приготовления с командой list; например, для приготовления списка //mypkgs//:
# cook list mypkgs.cooklist
=====Параметры компиляции пакета=====
Хотя вы можете использовать любые нужные параметры, необходимо соблюдать [[http://ru.wikipedia.org/wiki/FHS|«Стандарт иерархии файловой системы»]], следовать документации в ///usr/share/doc// и стандартам FreeDesktop (.desktop).
===Специфичные параметры===
Параметры, специфичные для каждого пакета, вы должны определить самостоятельно; например, можно отключить поддержку XML, чтобы уменьшить размер бинарников PHP и избавиться от libxml2, но в случае с PHP, это того не стоит, т.к. будет потеряна функциональность. Если у вас есть сомнения, посмотрите на рецепты и параметры компилятора в //compile_rules//.
===Оптимизация===
Официальные пакеты SliTaz оптимизируются для **i486**. Настроить аргументы оптимизации можно в файле **/etc/slitaz/cook.conf**, находятся они в переменной $CONFIGURE_ARGS. Если вы хотите собрать пакет с другими аргументами, вы можете изменить файл конфигурации CookUtils:
CONFIGURE_ARGS="--build=i486-pc-linux-gnu --host=i486-pc-linux-gnu"
====Файлы для включения/исключения====
Как правило, базовые пакеты не содержат ни файлов //man//, //info// и //doc//, ни статических библиотек; для них следует создавать дополнительные пакеты с именами пакет-doc или пакет-dev. Обратите внимание, что SliTaz не намерен использовать команды man или info, поэтому и нет руководств или информационных файлов GNU. Создание пакетов, содержащих документацию действительно необязательно. В отличие от этого, больше ценится написание документации в Handbook, т.к. он широко доступен и легко может быть обновлен и улучшен.
С точки зрения конфигурации, цель состоит в том, чтобы предложить основные файлы конфигурации для непосредственного запуска пакета. В особых случаях, как например, с веб-сервером //LightTPD//, SliTaz поставляет файлы конфигурации и запуска скриптов в ///etc/init.d// (описано в Handbook). Для нового пакета, вы свободны в выборе конфигурации по умолчанию в зависимости от того, что вы считаете лучшим для конечного пользователя. В папке ///usr/share/examples// имеются примеры конфигураций и другая полезная информация.
=====Категории пакетов=====
Категории пакетов используются только в информационных целях и не являются неизменными. Идея состоит в том, чтобы классифицировать пакеты, так что веб-страница, которая восстанавливает данные в рецепте пакета, может быть создана каждую ночь. Короче говоря, помещайте пакеты разработчиков в категорию «devel», Xorg — в «x-window», и различные новые пакеты в «extra».
=====Структура пакета Wok=====
Структура пакетов в Wok всегда должна соблюдаться для того, чтобы CookUtils смог найти нужные файлы и папки. Возможное содержимое пакета (обратите внимание на папку taz/, создающуюся во время приготовления):
* **stuff/**: Материалы, используемые для настройки, компиляции и создания пакетов (патч(и), Makefile, псевдо-ФС и т.д.);
* **receipt**: Вездесущий [[ru:cookbook:receipt|рецепт]];
* //**description.txt**: (может отсутствовать) Описание пакета включается в окончательный пакет, оно копируется в его корень. После установки TazPkg определяет этот файл как описание и может отобразить его с помощью //tazpkg desc имя_пакета//.//
* //**taz/**: Дерево каталога, содержащее создаваемый пакет tazpkg; сжатый пакет хранится в каталоге, указанном в переменной $PACKAGES_REPOSITORY в файле конфигурации CookUtils.//
Cookutils автоматически вызывает TazPkg для упаковки папки //taz//. Он также перенаправляет любые указания по упаковке, изложенные в рецепте.
=====Структура tazpkg=====
The SliTaz packages are cpio archives containing files and a file-system compressed with gzip:
* **fs/**: //Псевдо-файловая-система, содержащая все файлы, которые будут установлены.//
* **receipt**: //[[ru:cookbook:receipt|рецепт]].//
* **files.list**: //Список файлов, имеющихся в пакете.//
* //**description.txt**: Описание пакета (необязательное).//