%#!platex emacsen-common
%%%
%%% emacsen-common
%%% --- Section 4: How to create emacsen-common-aware elisp packages
%%% MATSUBAYASHI 'Shaolin' Kohji <shaolin@vinelinux.org>
%%% 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 スクリプト}

(現在書いてる途中)
