%#!platex emacsen-common %%% %%% emacsen-common %%% --- Section 4: How to create emacsen-common-aware elisp packages %%% MATSUBAYASHI 'Shaolin' Kohji %%% Time-stamp: <2001/12/24 15:38:55 shaolin> %--------8<--------8<--------8<--------8<--------8<--------8<-------- \newpage \section{emacsen-common 対応 elisp パッケージの作成方法} 現在 VineSeed や VineSeedPlus に残っている旧方式による elisp パッケージを emacsen-common 方式に対応させる,あるいは新規で emacsen-common 対応 パッケージを作成するのに必要な情報を書いています. パッケージの構成は基本的には次の通りです. \begin{description} \item[\BoldText{/usr/share/emacs/site-lisp/[パッケージ名]}] \ \\ \BoldText{.el} ファイルと,バイトコンパイルに必要となる その他のファイル (Makefile や *-MK, *-CFG その他) が収まります. \item[\BoldText{/usr/lib/emacsen-common/packages/\{install,remove\}/[パッケージ名]}] \ \\ そのパッケージがインストールされたときにバイトコンパイル/インストールする 為のスクリプトと,パッケージがアンインストールされた時に実行されるスクリプト が収められます. \item[\BoldText{\%docdir/[パッケージ名]}] \ \\ そのパッケージに附属するドキュメント等が収められます. これは従来と全く同様です. \end{description} \subsection{spec ファイルでの記述方法} 前のセクションで述べた通り,パッケージを build する際には バイトコンパイルをしなくなりますので,spec ファイルもかなりすっきり したものになります. 以下,Wanderlust (パッケージ名は現在は \BoldText{wl-el}) の spec ファイルを参考に説明します. \BoldText{\%\{origname\}} というのはここでは \BoldText{wl} と 読みかえて下さい. \subsubsection{\%build セクション} まず,パッケージ作成時のバイトコンパイルはなくなりますので, \BoldText{\%build} セクションはなくなります. \subsubsection{\%install セクション} 続いて \BoldText{\%install} セクション. ここでは単純に,必要なディレクトリを作成しているだけです. \begin{verbatim} %install [ "${RPM_BUILD_ROOT}" != "/" ] && rm -rf ${RPM_BUILD_ROOT} [ "${RPM_BUILD_ROOT}" != "/" ] && mkdir -p ${RPM_BUILD_ROOT} mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/emacs/site-lisp/%{origname}/etc/icons mkdir -p ${RPM_BUILD_ROOT}%{_libdir}/emacsen-common/packages/install mkdir -p ${RPM_BUILD_ROOT}%{_libdir}/emacsen-common/packages/remove mkdir -p ${RPM_BUILD_ROOT}%{_infodir} \end{verbatim} 次に,バイトコンパイル及び実際のインストールの際に必要なファイルを コピーしています. \begin{verbatim} # # install el files # cp -a WL-* Makefile wl \ ${RPM_BUILD_ROOT}%{_datadir}/emacs/site-lisp/%{origname} cp -a utils elmo \ ${RPM_BUILD_ROOT}%{_datadir}/emacs/site-lisp/%{origname} cp etc/icons/* \ ${RPM_BUILD_ROOT}%{_datadir}/emacs/site-lisp/%{origname}/etc/icons \end{verbatim} 附属の info ファイルは今まで通り make して該当場所にインストールするだけです. \begin{verbatim} # # build & install info # make EMACS=emacs info make EMACS=emacs INFODIR=${RPM_BUILD_ROOT}%{_infodir} install-info \end{verbatim} 最後に,elisp をバイトコンパイル/インストールしたり,削除したりする スクリプトを該当場所にインストールします.ここで出てくるマクロを 予め定義しておく必要があります (VineSeed 最新の rpm では既に定義されています). このマクロは,パッケージ作成時に展開されます. \begin{verbatim} # # install script( bytecompile el and install elc , remove ) # %_installemacsenscript %{origname} %{SOURCE1} %_removeemacsenscript %{origname} %{SOURCE2} \end{verbatim} \subsubsection{\%post セクション} 次に,このパッケージが実際にインストールされた際に実行されるスクリプトで ある \BoldText{\%post} セクションをみていきます. ここでも予め定義された rpm マクロが多分に使われていますので注意して下さい. まず最初に,\BoldText{\$1 = 2} の場合,即ちパッケージのアップグレードの 場合,既にバイトコンパイルされてインストールされている \BoldText{.elc} 等を削除する為のスクリプトを実行します. \begin{verbatim} %post # # bytecompile and install # if [ "$1" = 2 ]; then %_emacsenPackageRemove %{origname} fi \end{verbatim} 続いて,この elisp パッケージを emacsen-common に登録します. \\ 即ち,\BoldText{/var/lib/emacsen-common/installed-elisp} に \BoldText{wl} が 書き込まれます. \begin{verbatim} %_addemacsenlist %{origname} \end{verbatim} そして,現在インストールされている emacsen の flavor それぞれについて, バイトコンパイルとインストールを行うスクリプトを実行します. \begin{verbatim} %_emacsenPackageInstall %{origname} \end{verbatim} 最後に,今までと同様に,附属の info ファイルをインストールします. \begin{verbatim} /sbin/install-info %{_infodir}/wl-ja.info.gz %{_infodir}/dir \ --section="Message User Agent" /sbin/install-info %{_infodir}/wl.info.gz %{_infodir}/dir \ --section="Message User Agent" \end{verbatim} \subsubsection{\%preun セクション} 今度は逆にパッケージがアンインストールされる際に実行される \BoldText{\%preun} セクションです. アップグレードによる古いバージョンのアンインストールの場合には 何もしない様,本当にアンインストールの際だけに実行される様に \BoldText{\$1 = 0} で判定しています. その後,実際にバイトコンパイルとインストールされた \BoldText{.elc} ファイル等を削除し (\BoldText{\%\_emacsenPackageRemove}), 続いて \BoldText{/var/lib/emacsen-common/installed-packages} から wl を抜き (\BoldText{\%\_removeemacsenscript}), 最後に info ファイルをアンインストールしています. \begin{verbatim} if [ "$1" = 0 ]; then %_emacsenPackageRemove %{origname} %_removeemacsenlist %{origname} /sbin/install-info --delete %{_infodir}/wl-ja.info.gz %{_infodir}/dir \ --section="Message User Agent" /sbin/install-info --delete %{_infodir}/wl.info.gz %{_infodir}/dir \ --section="Message User Agent" fi \end{verbatim} \subsection{ここまでのまとめ} 実際にこの様に作られた elisp パッケージをインストールした際の 挙動について例を使って説明します. 既に emacs-20.7 と xemacs-21.1.14 がインストールされている環境で wl-el がインストールされた場合にどのような流れになるか追っていきましょう. \begin{itemize} \item wl-el パッケージがインストールされる \item wl-el パッケージがアップグレードである場合, \BoldText{\%\_emacsenPackageRemove wl} が実行され, 既にバイトコンパイルされているファイル/ディレクトリが削除される. \\ この例では \begin{itemize} \item \BoldText{/usr/share/emacs-20.7/site-lisp/wl} \item \BoldText{/usr/share/xemacs-21.1.14/\{etc,lisp\}/wl} \end{itemize} が削除される. \item \BoldText{\%\_addemacsenlist wl} が実行され, \BoldText{/var/lib/emacsen-common/installed-elisp} に wl というエントリが追加される \item \BoldText{\%\_emacsenPackageInstall wl} が実行され, 現在インストールされている emacsen それぞれに対して バイトコンパイルとインストールが行われる. \\ この例では \begin{itemize} \item \BoldText{/usr/share/emacs-20.7/site-lisp/wl} \item \BoldText{/usr/share/xemacs-21.1.14/\{etc,lisp\}/wl} \end{itemize} にそれぞれインストールされる. \end{itemize} \subsection{install,remove スクリプトの書き方} 先程から何度か出てきたマクロ \BoldText{\%\_emacsenPackageInstall wl} と \BoldText{\%\_emacsenPackageRemove wl} は,実際にはそれぞれ \BoldText{/usr/lib/emacsen-common/\{install,remove\}/wl} を 実行しています. このスクリプトは各 elisp パッケージに附属させておくものなので, スクリプトも用意しておかなければなりません. 幸い,既に VineSeed や VineSeedPlus には emacsen-common 対応にされた elisp パッケージがいくつも存在していますので,実際にはそちらを見てもらえば おおよそどういったことを行っているか分かるかと思います. これらのスクリプトの引数には emacsen の flavor が渡されますので, どの flavor の場合はどの様にバイトコンパイルしてどこにインストールするか, をこのスクリプトに記述しておくわけです. つまり,先程の wl の例では, \BoldText{\%\_emacsenPackageInstall wl} という行で, \begin{itemize} \item \BoldText{/usr/lib/emacsen-common/packages/install/wl emacs-20.7} \item \BoldText{/usr/lib/emacsen-common/packages/install/wl xemacs-21.1.14} \end{itemize} という 2つのスクリプトが実行されていることになります. \subsubsection{install スクリプト} (現在書いてる途中) \subsubsection{remove スクリプト} (現在書いてる途中)