%#!platex emacsen-common.tex %%% %%% emacsen-common %%% --- Section 1: Introduction %%% MATSUBAYASHI 'Shaolin' Kohji %%% 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 なのです.