%#!platex emacsen-common.tex
%%%
%%% emacsen-common
%%% --- Section 1: Introduction
%%% MATSUBAYASHI 'Shaolin' Kohji <shaolin@vinelinux.org>
%%% Time-stamp: <2001/12/24 15:38:38 shaolin>


%--------8<--------8<--------8<--------8<--------8<--------8<--------

\newpage


 
\section{はじめに}

この文書は，2001年後半の VineSeed から採用し，次期 Vine Linux (2.5) で
本格的に採用予定の emacsen-common についての説明書です．



\subsection{emacsen-common 導入に至る背景}

Vine Linux 2.0 まで (ppc に関しては 2.1.5 まで) は，\BoldText{emacs-20.x} と
\BoldText{xemacs-21.1.x} という二つの emacsen がデフォルトで採用されていました．
それぞれの emacsen 用に用意する emacs lisp を収める rpm パッケージは
build 時にバイトコンパイルし，パッケージを作るというアプローチを
とっていました．

例えば良く使われる elisp のひとつである Wanderlust (wl) では，
spec ファイルの中で \BoldText{EMACS=emacs} としてバイトコンパイルし，
\BoldText{/usr/share/emacs/site-lisp/wl} にインストール，
引き続いて \BoldText{EMACS=xemacs} としてバイトコンパイルしたのちに
\BoldText{/usr/lib/xemacs/site-packages/\{etc,lisp\}/wl} にインストールし，
それぞれを \BoldText{Wanderlust}, \BoldText{Wanderlust-xemacs}
というサブパッケージにして作成していました．
\\

然しこのアプローチでは，以下の問題があります．

\begin{itemize}
 \item 用意する emacsen の種類によって
       頻繁にパッケージを修正しなければならない
 \item emacsen のバリエーションが増える度に
       サブパッケージを追加しなければならない
 \item \BoldText{emacs-20.x} $\rightarrow$ \BoldText{emacs-21.x}，
       或いは \BoldText{xemacs-21.1.x} $\rightarrow$ \BoldText{xemacs-21.4.x}
       の様に，
\\
       emacsen のメジャーバージョンがあがることは考慮されていない
 \item 同様に複数のバージョンの emacsen の共存も考慮されていない
\end{itemize}

特に3つめと4つめは重要で，
\BoldText{/usr/share/emacs/site-lisp} 以下は emacs 全バージョンで
参照/利用されますし，
\BoldText{/usr/lib/xemacs/\{xemacs,mule,site\}-packages} 以下は
xemacs 全バージョンで参照/利用されます．
ところが elisp の方では，特定の emacsen のバージョンで利用する/利用しない
機能を持っていたりするので，この path の使い方では複数の emacsen を
共存させ，それらに対応した elisp を保持することが出来ません．

ですから各 emacsen 毎に固有のパス (例えば
\BoldText{/usr/share/emacs/21.1/lisp} など)
にインストールする必要があるわけですが，そうしても結局は
先程の 1つめ 2つめの問題が生じ，emacsen のバリエーションが増える度に
elisp パッケージを修正しつづけなければいけません．



\subsection{emacsen-common とは}

こういった問題を解決する (或いは少しでも解消する助けとする) 為に作られたのが
alternatives であり emacsen-common です．
emacsen-common は，元々 Debian GNU/Linux で開発され，利用されている仕組みで，
Project Vine の武井さんが ruby を使って scratch から実装されたものが
Vine で採用されています．

複数の emacsen flavor (例えば emacs-20.7，emacs-21.1，xemacs-21.1.14 と
いった風に) を共存させ，\BoldText{/usr/bin/emacs} を実行するとどれが起動
するかを統一的に扱う仕組みは alternatives の仕事なのですが，
emacsen-common が本質的に行っていることは，

\begin{itemize}
 \item どの emacsen がインストールされているかを管理し，
 \item どの elisp がインストールされているかを管理し，
 \item emacsen や elisp が install/upgrade/uninstall された際に
       必要に応じて各 elisp を各 emacsen 用にバイトコンパイルする
\end{itemize}

という部分になります．
\\

つまり，今までの elisp パッケージの場合との違いをまとめると，

\begin{itemize}
 \item パッケージにはバイトコンパイル済ファイル (\BoldText{.elc})
       は格納されていない
 \item パッケージインストール時に動的にバイトコンパイルとインストールが
       行われる
 \item バイトコンパイルされた \BoldText{.elc} がインストールされる先は
       \BoldText{/usr/share/[emacsen flavor 名]} 以下に一元化されている
\end{itemize}

ということになります．これらの動的なコンパイルの為に使われるスクリプトを
提供しているのが emacsen-common なのです．
