понедельник, 18 октября 2010 г.

HDX BD-1. Как сделать дистрибутив ipkg

Что такое формат .ipk?


Файлы в формате .ipk являются архивами tar, сжатыми gzip (.tar.gz), которые содержат три части:
  • ./data.tar.gz: содержит собственно сами файлы, составляющие пакет. При установке эта часть распаковывается в корневой каталог /. То есть, имена файлов и каталогов, входящие в этот архив, должны начинаться с ./usr или ./opt.

  • ./control.tar.gz: содержит метаданные и скрипты пакета. Он должен содержать файл с названием control. Также он может содержать следующие файлы: conffiles, preinst, postinst, prerm, postrm. Кроме этого, в него могут входить другие файлы и каталоги, нужные для установки, но это не будет особо полезным в настоящее время. См. секцию 3 “Скрипты Ipk”.

  • ./debian-binary: в настоящее время игнорируется ipkg. Это должен быть текстовый файл, содержащий единственную строку: “2.0”

Сборка ipk


Ниже приведен пример как собрать пакет с названием foobar, который помещает файл myprog в каталог /opt/bin на HDX BD-1. Вам понадобится скрипт ipkg-build.sh.

  1. Создайте структуру каталогов и файлов, как они должны быть расположены в системе. Для нашего примера мы создадим каталог foobar, который будет считаться корневым. С точки зрения ipk любой файл внутри foobar будет в /, таким образом, /foobar/opt/bin/myprog будет установлен в /opt/bin/myprog на HDX BD-1.
    /foobar/opt/bin/myprog

  2. На верхнем уровне иерархии создайте каталог с именем CONTROL.
    /foobar/opt/bin/myprog
    /foobar/CONTROL/

  3. Внутри каталога CONTROL создайте файл под названием control, в который запишите необходимые данные в формате “Поле: значение”. В файле должны присутствовать следующие поля: Package, Version, Architecture, Maintainer, Section и Description. Опционально можете включить следующие поля: Priority и Depends.
    /foobar/opt/bin/myprog
    /foobar/CONTROL/control
    Вот пример этого файла, который вы можете использовать в качестве шаблона:
     ### Begin CONTROL/control example
     Package: foobar
     Priority: optional
     Section: Misc
     Version: 0.1
     Architecture: mipsel
     Maintainer: Familiar User famuser@foo.org
     Depends: libc6
     Description: foo is the ever-present example program -- it does
    everything foo is not a real package. This is simply an example.
    .
    Значения полей в файле CONTROL/control:
    • Package: название пакета, которое может состоять из строчных символов английского алфавита, цифр и дефиса (т.е. совпадать со следующим регулярным выражением: [[a-z0-9.+-]+)

    • Version: версия, должна содержать по крайней мере одну цифру и совпадать с регулярным выражением [[a-zA-Z0-9.+]*. Версия также может содержать в конце номер ревизии (ревизия должна сообтветствовать регулярному выражению ”-fam![[0-9]\+”. Ревизия должна увеличиваться каждый раз, когда пакет изменяется, а версия – нет (a packaging tweak). Она может сбрасываться (или просто опускаться) каждый раз, когда увеличивается номер версии.

    • Architecture: это поле должно специфицировать архитектуру, под которую собран пакет. Допустимые значения: “arm” и “all”.

    • Maintainer: должно содержать имя и адрес электронной почты ответственного за этот пакет (не обязательно автора самой программы).

    • Description: короткое (до 80 символов) описание программы. Оно также может включать длинное описание на следующих строках (каждая с отступом в один пробел). Пустые строки в длинном описании могут быть заданы как строки, состоящие из одного пробела и точки (т.е. ” .”).

    • Priority: должно быть одно из следующих значений: required, standard, important, optional или extra. Большинство программ должны использовать optional.

    • Section: категория, которой соответствует пакет:
      • Games (игры)
      • Multimedia (графика, видео, аудио, mp3-плеер)
      • Communications (коммуникации, эл. почта и т.п.)
      • Settings (утилиты резервного копирования, программа настройки беспроводной сети, короче, все, что модифицирует саму систему)
      • Utilities (база паролей, калькулятор) - чаще всего небольшие приложения
      • Applications (остальные приложения, не попадающие в другие категории)

      • Не имеют собственной закладки, но нуждаются в категоризации:
        • Console (fdisk, kismit, perl, boa, apache, smb и т.д.)
        • Misc (если невозможно отнести ни к какой другой категории, как например, Zaurus faq)
        Например:
        SeverManager должен быть в секции Settings
        Boa должен быть в секции Console


    • Depends: указывает пакеты, которые должны быть установлены, чтобы данная программа работала. Пакеты должны быть перечислены в одной строке через запятую.

      Некоторые не обязательные, но рекомендованные секции:

    • Installed-Size: указывает примерный размер пакета после установки. Позволит пользователю оценить, сколько свободного места понадобится для установки данного паекта (например, 150KB).
    • Cardinst: Параметр, показывающий возможна ли корректная работа пакета после установки его на внешние карты памяти. Например, пакет, содержащий в себе модули ядра будут корректно работать только при установки в основную напять. Возможные значения: yes, no.
  4. Если пакет имеет конфигурационные файлы, создайте файл CONTROL/conffiles, содержащий список таких файлов с указанием абсолютного пути для каждого (как они будут расположены в системе после установки). Тогда система управления пакетами не будет автоматически перезаписывать эти файлы когда пользователь будет обновлять пакет.

  5. Если требуется запустить скрипт в начале или конце установки, см. секцию 3 “Скрипты Ipk”.

  6. Теперь можно создать новый пакет: $ ipkg-build.sh directory [destination_directory] где
    directory – каталог, который должен быть создан.
    destination_directory является опциональным и если опущен, считается равным текущему каталогу.

    Скрипт ipkg-build.sh производит некоторые проверки целостности и правильности данных в каталоге пакета и должен помочь вам справиться с возможными проблемами.

Скрипты Ipk


Если нужно, пакет может включать скрипты, которые будут вызваны системой управления пакетами. Вызов скрипта возможен непосредственно перед установкой пакета, после установки, перед удалением пакета и после удаления. Эти скрипты называются, соответственно, preinst, postinst, prerm и postrm, и должны располагаться в каталоге CONTROL. Они должны возвращать 0 в случае успешного завершения (ненулевое значение, возвращаемое preinst отменяет установку пакета – иногда это может быть полезным). Поэтому рекомендуется явно вызывать exit 0 в конце пакета, иначе наружу будет передан код возврата последней выполненой команды, а он может быть и не нулевым. Типичный пример - вызыв команды depmod, которая может отработать нормально, но при этом выдать несколько предупреждений.

Эти скрипты не должны полагать, что доступен tty, т.е. они не должны ничего запрашивать у пользователя.

Переменная PKG_ROOT указывает на корневой каталог пакета, и может быть использована для ссылок на установленное содержимое пакета.


Дополнительные скрипты по управлению пакетами


Существует еще один скрипт, “mkipks”, но с ним могут быть проблемы, поэтому его не рекомендуется использовать.

Так же в Cacko feed (репозиторий для Zaurus) есть пакет ipkg-tools, который помимо скритпа ipkg-build содержит в себе другие необходимые инструменты для работы с IPK, такие как ipkg-expand (скрипт, для “разборки” пакета) и ipkg-make-index (генерация индекса для feed).

Данная статья с небольшими правками, учитывающими особенности HDX BD-1, взята отсюда http://oramezo.org/ru/man/ipk-howto.
Оригинал можно найти здесь: http://www.oesf.org/index.php?title=IPKG_Howto

Дополнительную информацию и более детальные объяснения можно найти по адресу http://handhelds.org/moin/moin.cgi/Ipkg