☠️

macOSにネイティブコンパイル対応のEmacs29を導入する(Orgファイル/Makefileで管理)

2023/10/03に公開

はじめに

普段はVSCode使いですがやっていきます。

以下はこれまでの調査と試行を自分なりにまとめたものになりますが、より良い方法がありましたらご教授いただけると嬉しいです。

環境はVentura13.4.1です。
OSをクリーンインストールしたばかりのほぼまっさらな状態にHomebrewを入れてスタートしています。

準備

ネイティブコンパイル対応のEmacsをインストールするにはソースからビルドするしかなさそうです。

当方の環境では事前準備として以下が必要でインストールしました。

$ brew install autoconf texinfo gnutls pkgconfig gcc libgccjit

ソースをダウンロードする

公式からgit cloneします。
https://savannah.gnu.org/git/?group=emacs

$ git clone --depth 1 --branch emacs-29 https://git.savannah.gnu.org/git/emacs.git

ビルド

落としたリポジトリの第一階層にINSTALL.REPOという名前のファイルがあります。
ここにビルドする手順が記されているのでこれを参考にビルドします。

$ cd emacs

$ ./autogen.sh

$ ./configure --with-native-compilation=aot --with-ns --without-x

$ make -j9

$ make install

makeのオプションはマシンのコア数に応じて適宜変更してください。
macOSの場合、左上のリンゴマーク > このMacについて > 詳細情報 > システムレポート > ハードウェア > コアの総数から調べられます。

インストール

ビルドによってemacs/nextstepディレクトリにEmacs.appが生成されます。
これをアプリケーションフォルダにコピーします。

つづいて、~/.zshrcに以下を追加します。
ファイルがない場合は新規作成します。

.zshrc
alias emacs='/Applications/Emacs.app/Contents/MacOS/Emacs'

以下を実行します。

$ source ~/.zshrc

emacsコマンドで起動できることを確認します。

$ emacs

ネイティブコンパイル対応になっているかはscratchバッファで以下を実行することにより確認できます。
実行方法はコードの終端でC-jです。
M-x describe-variableもしくはM-:から実行することでも確認できます。

**scratch**
(describe-variable 'system-configuration-features)

NATIVE_COMPと表示されればインストール成功です。

Orgファイルで設定を管理する

~/.emacs.dMakefileinit.orgを用意します。

Makefile
EMACS = /Applications/Emacs.app/Contents/MacOS/Emacs
EMACS_BATCH = $(EMACS) -Q --batch

.PHONY: byte-compile
byte-compile:
	$(EMACS_BATCH) --eval "(progn (require 'ob-tangle) (org-babel-tangle-file \"./init.org\" \"./init.el\" \"emacs-lisp\"))"
	$(EMACS_BATCH) -f batch-byte-compile init.el

init.orgの内容については適宜となりますが、ここでは組み込みのテーマを設定してみます。

init.org
#+begin_src emacs-lisp
  (use-package emacs
    :config
    (load-theme 'modus-vivendi)
    :bind ("<f5>" . modus-themes-toggle))
#+end_src

以下を実行します。

$ cd ~/.emacs.d

$ make

~/.emacs.dinit.elinit.elcが生成されれば成功です。

ネイティブコンパイルを試す

scratchバッファで以下を実行してみます。

**scratch**
(native-compile-async "~/.emacs.d/init.el")

~/.emacs.d/eln-cache/29_x_xx-xxxxxxxxの中にinitで始まるelnファイルが生成されていれば成功です。

Discussion