Next: 純粋ストレージ, Up: GNU Emacsの内部 [Contents][Index]
このセクションではEmacs実行可能形式のビルドに関するステップの説明をします。makefileがこれらすべてを自動的に行うので、Emacsをビルドやインストールをするためにこの題材を知る必要はありません。この情報はEmacs開発者に適しています。
EmacsのビルドにはGNU Makeのバージョン3.81以降が必要です。
srcディレクトリー内のCソースファイルをコンパイルすることにより、temacsと呼ばれる実行可能形式ファイルが生成されます。これはbare impure Emacs(裸で不純なEmacs)とも呼ばれます。これにはEmacs LispインタープリターとI/Oルーチンが含まれますが編集コマンドは含まれません。
コマンドtemacs -l loadup
はtemacsを実行してloadup.elをロードするように計らいます。loadup
ライブラリーは通常のEmacs編集環境をセットアップする追加のLispライブラリーをロードします。このステップの後にはEmacs実行可能形式はbare(裸)ではなくなります。
標準的なLispファイルのロードには若干の時間を要するので、ユーザーが直接temacs実行可能形式を実行することは通常はありません。そのかわり、Emacsビルドの最終ステップの1つとしてコマンド‘temacs -batch -l loadup --temacs=dump-method’が実行されます。特別なオプション--temacsはtemacs
にたいして、この後に続けてEmacsを実行した際に開始がより高速になるように、標準のすべての事前ロードされるLispの関数と変数の記録方法を指示します。オプション--temacsには引数dump-methodが必要であり、以下のいずれかを指定できます:
ダンプファイル(dump
file)に事前ロードLispデータを記録する。このメソッドはEmacsの開始時にロードされることになる追加データファイルを生成する。生成されたダンプファイルは通常はemacs.pdmpと呼ばれて、Emacsのexec-directory
にインストールされる(ヘルプ関数を参照)。これはモダンなシステムにおいてセキュリティとプライバシーを強化するために使用されるさまざまなメモリーレイアウト技術を妨害する可能性のある、メモリー割り当ての特別なテクニックの使用をEmacsに要求しないので、もっとも好ましいメソッドの1つ。
‘pdump’と同様だが、以前のEmacsバイナリおよびバイトコンパイル済みLispファイル*.elcが存在しないときに、Emacsのブートストラップ(bootstrapping)の間に使用される。この場合には、生成されるダンプファイルは通常はbootstrap-emacs.pdmp。
このメソッドはすべての標準Lispファイルがすでに事前ロード済みのemacsという実行可能プログラムをtemacs
にダンプさせる(‘-batch’引数はtemacs
にその端末上のすべてのデータ初期化の試みを抑制するので、ダンプされたEmacsの端末情報テーブルは空になる)。このメソッドは実行中プロセスからプログラムファイルを生成するため、プログラムを実行(exec)してプロセスを開始することとある意味で反対なことからunexecとして知られている。このメソッドは伝統的にEmacsの状態を保存する手段だったが、今や非推奨となった。
‘dump’と同様だが、unexec
メソッドでEmacsをブートストラップする際に使用する。
インストールされるEmacsは、ダンプされたemacs実行可能形式です(pureなEmacsとも呼ばれる)。Emacsのビルドにポータブルダンパーを使用した場合には、emacs実行可能形式は実際にはtemacsの正確なコピーであり、対応機種emacs.pdmpファイルも同様にインストールされます。変数preloaded-file-list
にはダンプファイルやダンプされたEmacs実行可能形式に記録された事前ロード済みLispファイルのリストが格納されます。新たなオペレーティングシステムにEmacsをポートする際に、そのOSが何の種類のダンプも実装していなければEmacsは起動時に毎回loadup.elをロードしなければなりません。
ダンプされたemacsにはデフォルトではビルド時刻やホスト名のような詳細が記録されます。これらの詳細を抑制するためにconfigure
のオプションに--disable-build-detailsを使用すれば、同一のソースからEmacsを2回ビルドしてインストールする際に同一のEmacsのコピーが生成される可能性が高くなります。
site-load.elという名前のライブラリーを記述することにより、事前ロードするファイルを追加指定できます。追加するファイルを保持するために純粋(pure)なスペースnバイトを追加するように、以下の定義
#define SITELOAD_PURESIZE_EXTRA n
でEmacsをリビルドする必要があるでしょう。src/puresize.hを参考にしてください(十分大きくなるまで20000ずつ増加させる)。しかし追加ファイルの事前ロードの優位はマシンの高速化により減少します。現代的なマシンでは通常はお勧めしません。
loadup.elがsite-load.elを読み込んだ後にSnarf-documentation
を呼び出すことにより、それらが格納された場所のファイルetc/DOC内にあるプリミティブと事前ロードされる関数(と変数)のドキュメント文字列を探します(Accessing Documentationを参照)。
site-init.elという名前のライブラリー名に配置することにより、ダンプ直前に実行する他のLisp式を指定できます。このファイルはドキュメント文字列を見つけた後に実行されます。
関数や変数の定義を事前ロードしたい場合には、それを行うために3つの方法があります。それらにより定義ロードしてその後のEmacs実行時にドキュメント文字列をアクセス可能にします:
byte-compile-dynamic-docstrings
にnil
値を指定してsite-load.elかsite-init.elでロードする(この手法にはEmacsが毎回そのドキュメント文字列用のスペースを確保するという欠点がある)。
通常の未変更のEmacsでユーザーが期待する何らかの機能を変更するような何かをsite-load.elやsite-init.el内に配置することはお勧めしません。あなたのサイトで通常の機能をオーバーライドしなければならないと感じた場合には、default.elでそれを行えばユーザーが望む場合にあなたの変更をオーバーライドできます。要約: スタートアップ時のアクション順序を参照してください。site-load.elかsite-init.elのいずれかがload-path
を変更する場合には変更はダンプ後に失われます。ライブラリー検索を参照してください。load-path
を永続的に変更するにはconfigure
の--enable-locallisppathオプションを指定してください。
事前ロード可能なパッケージでは、その後のEmacsスタートアップまで特定の評価の遅延が必要(または便利)なことがあります。そのようなケースの大半はカスタマイズ可能な変数の値に関するものです。たとえばtutorial-directory
は事前ロードされるstartup.el内で定義される変数です。これのデフォルト値はdata-directory
にもとづいてセットされます。この変数はEmacsダンプ時ではなくスタート時にdata-directory
の値を必要とします。なぜならEmacs実行可能形式はダンプされたものなので、恐らく異なる場所にインストールされるからです。
この関数は次回のEmacs開始までsymbolの初期化を遅延する。通常はカスタマイズ可能変数の:initialize
プロパティとしてこの関数を指定することにより使用する(引数valueはフォームCustom由来の互換性のためだけに提供されており使用しない)。
custom-initialize-delay
が提供するより一般的な機能を要する稀なケースではbefore-init-hook
を使用できます(要約: スタートアップ時のアクション順序を参照)。
この関数はpdump
メソッドを使用して、Emacsのカレント状態をダンプファイルto-fileにダンプする。ダンプファイルは通常はemacs-name.dmpと呼ばれる。ここでemacs-nameはEmacsの実行可能形式ファイル名。オプション引数track-referrersが非nil
なら、ポータブルダンパーはpdump
メソッドでは未サポートのオブジェクトタイプの出所追跡の助けとなる追加情報を維持する。
多くのプラットフォームでポータブルダンパーのコードが実行可能だとしても、それが生成するダンプファイルに可搬性はない(ダンプしたEmacs実行可能形式だけがロードできる)。
すでにダンプ済みのEmacs内でこの関数を使用する場合には‘-batch’オプションでEmacsを実行しなければならない。
ダンプ済みのEmacsに‘.el’ファイルが含まれていて、かつその‘.el’ファイルには通常はロード時に実行されるコードがある場合には、ダンプ後にEmacsを起動する際にそのコードは実行されないだろう。この問題を回避するために、after-pdump-load-hook
フックに関数を配置することができる。このフックはEmacs起動時に実行される。
この関数はunexec
メソッドを使用して、Emacsのカレント状態を実行可能ファイルto-fileにダンプする。これはfrom-file
(通常はファイルtemacs)からシンボルを取得する。
この関数をすでにダンプ済みのEmacsで使用することはできない。この関数は非推奨であり、Emacsはデフォルトではunexec
サポートなしでビルドされているので利用できない。
カレントのEmacsセッションの状態がダンプファイルからリストアされると、この関数はダンプファイルに関する情報とEmacs状態のリストアに要した時間をリターンする。値は((dumped-with-pdumper . t) (load-time . time) (dump-file-name . file))
のようなalist。ここでfileはダンプファイル名、timeはダンプファイルから状態をリストアするのに要した秒数。カレントセッションがダンプファイルからリストアされたものでなければ値はnil
。