Daydreaming in Brookline, MA

Rokcy LinuxとM1 MacBook上でemacsをソースからビルドしてみる

1 はじめに

最新のRocky Linux 9.4にdnfで入れられるemacsは27.1で、これだといくつか使えない機能があるんです。そこで、ついに重い腰を上げてemacsをソースからビルドしてみることにしました。以前チャレンジした時はエラーが出たら機能を削っていき、結局はターミナルでしか使えないものになりましたが、今回はGUI版が使えるように頑張ります。

2 先人の情報を探す

ひたすらググってみて、見つけたのは Building Emacs from Source with pgtk のブログ記事でした。しかし残念ながらこれはUbuntuのもので、Rocky Linuxとはパッケージ名が色々と違ってきます。ドンピシャなサイトは見つからなかったので、これを参考にトライアンドエラーで試してみます。

3 ビルドしてみる

まずはemacsのソースコードを入手します。

git clone git://git.sv.gnu.org/emacs.git

さすがに巨大プロジェクトだけあって、時間がかかります。

つぎは、必要なパッケージを入れたいところですが、いきなり build-essential が Rocky Linuxにはありません。。。仕方がないので、

cd emacs
./autogen.sh
./configure --with-native-compilation --with-native-json --with-pgtk

で出たエラーをググりながらつぶしていきます。上記の参考ブログによると、./configureで出るエラーを見て必要なものを入れていくのが普通のやり方なようです。素人には少し敷居が高いですね。。。ちなみに --with-pgtk は Rocky Linux等RedHat系のデフォルトWayland (X11でなく)をGUIモードで使うオプションらしいです。今回はこれとネイティブコンパイルのオプションがメインの目的です。

入れたのは以下です。ここが試行錯誤するところです。

sudo dnf install make automake gcc gcc-c++ kernel-devel
sudo dnf install texinfo
sudo dnf install gtk3-devel
sudo dnf install gnutls-devel
sudo dnf lnstall libgccjit libgccjit-devel

で、最終的に

./configure --with-native-compilation --with-native-json --with-pgtk
make bootstrap

で曲りなりにビルドできたみたいです。

インストールします。

sudo make install

4 動かしてみる

起動すると、すでにインストール済みのパッケージでエラーが出るので、M-x list-packages でインストール済みパッケージを全ていったん消して、最初からやりなおしたところ、意外とすんなりと既存 init.elが使えてしまいました。

いろいろwarningが出ているようでですが、見なかったことにします。以前出ていたTLSで接続できない問題も、知らない間に解決していたようです。gnutls-develがうまく認識できていなかったのかな。

せっかくなので以下をinit.elに追記します。

(pixel-scroll-precision-mode)

曲りなりにemacsがGUI/ターミナル版ともに使えているように見えます。。。ちなみに入ったのは emacs 31.0.50 でした。新しいと喜んで使っていたMacのemacsが29.3なので、更に新しいです。少しうれしい。

5 M1 MacBook Proでもビルドしてみる

調子に乗って、M1 MacBook Proでもネイティブコンパイル版の最新emacsが入るか試してみました。 当然ググるところから始めます。なんと、いきなりよい記事を見つけました。 macOSにネイティブコンパイル対応のEmacs29を導入する

この記事の通りに入れてみます。

brew install autoconf texinfo gnutls pkgconfig gcc libgccjit
git clone --depth 1 https://git.savannah.gnu.org/git/emacs.git
cd emacs
./autogen.sh
./configure --with-native-compilation=aot --with-ns --without-x
make -j8
make install

そして emacs/nextstep に作成されたEmacs.appをApplicationにコピーして起動したところ、

libgccjit.so: error: error invoking gcc driver

というエラーが出ました。一通りパッケージを消して入れ直してもだめです。libgccjit.soが見つからないのかな。解決策を探すと早速見つかりました。warning - libgccjit.so: error: error invoking gcc driver ここのコメントによると、 LIBRARY_PATH をearly-init.elで設定するとよいとあります。

以下のような.emacs.d/early-init.elを作成したところうまくいきました。

(setenv "LIBRARY_PATH" "/opt/homebrew/opt/gcc/lib/gcc/14:/opt/homebrew/opt/libgccjit/lib/gcc/14:/opt/homebrew/opt/gcc/lib/gcc/14/gcc/aarch64-apple-darwin22/14")

上記で、14や22等の数字は、実際に入っているもので置き換えてください。

6 最後に

意外にも数時間しか試行錯誤せず、emacsをソースからビルドすることに成功してしまいました。うれしいです。

肝心のネイティブコンパイルの威力は、言われると体感的に速くなったような気もしますが、わざわざそのために自分でビルドするという茨の道を行くほどのことも無いかもしれません。しばらく使ってみると、また感じ方が変わってくるかもしれませんが。