2009年11月30日月曜日

debian-emacs-policyのポイント

ざっとポイントをまとめた。
これ以上理解するには、perlを多少勉強せねばならない。
うーん。どうしたものか。


* debian-emacs-policyのポイント
- debian-emacs-policyでは、debian systemにてemacs
関連のpackagesを作成/管理するためのpolicyが規程
されている。
- 簡明にまとまっている文書なので、メモ化する必要は
ないのだが、確実な理解のためにあえてメモを作成す
る。
- policyの所在
- emacsen-common:
/usr/share/doc/emacsen-common/debian-emacs-policy.gz
- またはWeb。debian.org。

** policyにおける用語
- <emacs>

emacs
xemacs21
emacs21
emacs22

- <flavor>

xemacs21
emacs21
emacs22

- すなわち、<emacs> - 'emacs'。

** policyが求めるload-path
- load-path
- debian emacs policyでは、最低、次の場所が次の
順(優先度が高い順)にload-pathに含まれることを求めている。
これはどのemacsenにおいても、である。

/etc/<flavor>
/etc/emacs
/usr/local/share/emacs/<upstream>/site-lisp
/usr/local/share/emacs/site-lisp
/usr/share/emacs/<flavor>/site-lisp
/usr/share/emacs/site-lisp

- ここで、<upstream>は、'22.2'などのupstream
version number。

** emacsen-common package
- emacsen-commonパッケージは、debian emacs policy
に従ったemacs packagesの管理のためのfacilityを提
供している。
- 提供物一覧

~ $ apt-file list emacsen-common
emacsen-common: /etc/emacs/site-start.d/00debian-vars.el
emacsen-common: /etc/emacs/site-start.el
emacsen-common: /usr/lib/emacsen-common/emacs-install
emacsen-common: /usr/lib/emacsen-common/emacs-package-install
emacsen-common: /usr/lib/emacsen-common/emacs-package-remove
emacsen-common: /usr/lib/emacsen-common/emacs-remove
emacsen-common: /usr/lib/emacsen-common/generate-install-list
emacsen-common: /usr/lib/emacsen-common/packages/install/emacsen-common
emacsen-common: /usr/lib/emacsen-common/packages/remove/emacsen-common
emacsen-common: /usr/share/doc/emacsen-common/changelog.gz
emacsen-common: /usr/share/doc/emacsen-common/copyright
emacsen-common: /usr/share/doc/emacsen-common/debian-emacs-policy.gz
emacsen-common: /usr/share/emacs/site-lisp/debian-startup.el
~ $

- /etc/emacs/site-start.el
- これはpackageに含まれてはいるが、local admin
が中身を管理するもの。

*** 提供物の概要
**** /usr/lib/emacsen-common/emacs-install
- perl script。
- コメント。

# Call emacsen-common/packages/install/* install-flavor other-flavor ...
# for every installed emacs add-on package.

**** /usr/lib/emacsen-common/emacs-remove
- emacs-installの別名。

**** /usr/lib/emacsen-common/emacs-package-install
- perl script。
- コメント。

# Was this called because we're installing/removing a new emacs
# flavor? This should probably be handled with getopt and a command
# line opt, but it's freeze time, and I'm tired...

**** /usr/lib/emacsen-common/emacs-package-remove
- emacs-package-installの別名。

**** /usr/lib/emacsen-common/generate-install-list
- perl script。
- ライブラリ。
- コメント。

# depends on: dpkg, tsort, perl

# This script should be handed a list of add-on packages on stdin, and
# it will sort them according to their dependencies. It will also add
# in other add-on packages that aren't mentioned, but are needed.

# Test code
# my @input_packages = <STDIN>;
# my @result = generate_add_on_install_list(@input_packages);
# print " " . join("\n ", @result);

**** /usr/lib/emacsen-common/packages/install/emacsen-common
- shell script。
- 使い方。
- /usr/lib/emacsen-common/packages/remove/emacsen-common <flavor>
- emacsen-commonパッケージが提供しているelファイ
ルについて、flavor用バイトコンパイルを実施する。
**** /usr/lib/emacsen-common/packages/remove/emacsen-common
- shell script。
- 使い方。
- /usr/lib/emacsen-common/packages/remove/emacsen-common <flavor>
- emacsen-commonパッケージが提供しているelファイ
ルのflavor用バイトコンパイルを削除する。

** emacsen main packages
- 'emacs22'とか'xemacs21'とか、emacsen本体を提供
するパッケージのこと。
*** 必須作法
**** メンテナスクリプト
- postinst
- postinstに記述するもの。
- "/usr/lib/emacsen-common/emacs-install <flavor>"
- この記述によってemacs-installは次のものを実
行する。
- "/usr/lib/emacsen-common/packages/install/<pkg> <flavor> <others>"
- prerm
- prermに記述するもの。
- "/usr/lib/emacsen-common/emacs-remove <flavor>"
- この記述によってemacs-removeは次のものを実
行する。
- "/usr/lib/emacsen-common/packages/remove/<pkg> <flavor> <others>"
**** バイナリシムリンク
- /usr/bin/<package-name>から
/usr/bin/<emacs-binary>へのsymbolic linkが必須。
- というのはadd-on packagesがinstall/removeすると
き、/usr/bin/$ARGV[0]を使ってバイトコンパイルな
どをするから。
**** 依存関係 "Provides: emacsen"
- emacsen main packageは、debian packageとして
controlファイルにおいて、"Provides:"に
"emacsen"と記述する。
- 例:emacs22

Provides: editor, emacsen, info-browser, mail-reader, news-reader

** add-on packages
*** 基本作法
- 必須な作法は少い。
- 何故かというと、もしadd-onしようとしている機能に
ついて、バイトコンパイルが不要であったり、インストー
ル時の調整(emacs毎)も不要であったりするならば、
単にそのadd-on packageは、しかるべき場所にしか
るべきファイルを置くだけで目的をはたせるからだ。
- ここでは必須なものを含めて基本的なものを書く。
**** 設置場所
- add-on packagesが設置できる場所はつぎのとおり。
/etc/<emacs>/site-start.d
/usr/share/<emacs>/site-lisp/<package-name>
- これは必須作法である。
**** load-path
- add-on packagesはload-pathをいじってはいけない。
- これは必須作法である。
**** 依存関係
- 'emacsen-common'をdependsするべきではない。その
かわりに、'emacsen'をdependsするか、対応している
flavorsをdependsする。
**** 初期化ファイルの中身
- site-start.dなどにおく初期化ファイルでは、load
ではなくautoloadを使うべし。

*** 応用作法
- 「バイトコンパイルが必要」など、flavorに依存した
install/remove処理が必要なものの作法。

**** メンテナスクリプト
- まず、次のファイルをパッケージにて提供すべし。

/usr/lib/emacsen-common/packages/install/<pkg>
/usr/lib/emacsen-common/packages/remove/<pkg>

- サンプル
- 仮想的なfooというパッケージに対するもの。
- flavor毎にバイトコンパイルをするもの。
- install

#!/bin/sh
# /usr/lib/emacsen-common/packages/install/foo
# [ This particular script hasn't been tested, so be careful. ]
set -e

FLAVOR=$1
echo install/foo: Handling install of emacsen flavor ${FLAVOR}

byte_compile_options="-batch -f batch-byte-compile"
el_files="some-file.el some-other-file.el etc.el"
el_dir=/usr/share/emacs/site-lisp/foo/
elc_dir=/usr/share/${FLAVOR}/site-lisp/foo/

if [ ${FLAVOR} != emacs ]
then
echo install/foo: byte-compiling for ${FLAVOR}

[ -d ${elc_dir} ] || mkdir ${elc_dir}

# Copy the temp .el files
(cd ${el_dir} && cp ${el_files} ${elc_dir})

# Byte compile them
(cd ${elc_dir} \
&& ${FLAVOR} ${byte_compile_options} ${el_files} 2> /dev/null)

# remove the redundant .el files
# presumes that any .el files in the <flavor> dir are trash.
rm ${elc_dir}/*.el
fi
exit 0;

- remove

#!/bin/sh
# /usr/lib/emacsen-common/packages/remove/foo
# [ This particular script hasn't been tested either, so be careful. ]
set -e

FLAVOR=$1
elc_dir=/usr/share/${FLAVOR}/site-lisp/foo

echo remove/foo: Handling removal of emacsen flavor ${FLAVOR}

if [ ${FLAVOR} != emacs ]
then
echo emacsen-common: purging byte-compiled files for ${FLAVOR}
rm -f ${elc_dir}/*.elc
[ -d ${elc_dir} -a `ls -la ${elc_dir}|wc -l` -gt 3 ] && rmdir ${elc_dir}
fi
exit 0;

- その上で、メンテナスクリプトは次のようにすべき。
- postinst
- /usr/lib/emacsen-common/emacs-package-install <pkg>
- prerm
- /usr/lib/emacsen-common/emacs-package-remove <pkg>


こつこつ。

0 件のコメント: