🔨

GNU Emacs 29.2 以降の Emacs Mac port をソースからビルドする

2024/06/11に公開

パッケージマネージャーでも Emacs Mac port はインストールできます。
brew

brew tap railwaycat/emacsmacport
brew install --cask emacs-mac

MacPorts

sudo port install emacs-mac-app-devel

ここではソースからビルドするお話です。
29.1 まではここのFTPサーバで
ftp://ftp.math.s.chiba-u.ac.jp/emacs/
パッチファイルをダウンロードできたのですが、29.2以降のパッチはアップロードされてません。
しかしながら YAMAMOTO Mitsuharu 氏の git リポジトリから work ブランチのソースを取得してビルドが可能です。

前準備

Xcode を App Store で入手して、コマンドラインツールをインストールします。

xcode-select --install

brewautotools 等のプログラムをインストールします。

# 他にもあったかも
brew install autoconf automake libtool texinfo pkg-config gnutls

ソースの取得

以下のURLにて work ブランチの zip・gz・bz2 からいずれかをダウンロードしましょう。bz2 なら40MBくらい。
https://bitbucket.org/mituharu/emacs-mac/downloads/?tab=branches
git clone すると500MBくらいダウンロードすることになって時間かかります。

ビルド手順

# 29.4 を例にした場合
curl -O "https://bitbucket.org/mituharu/emacs-mac/get/7cc5e67629363d9e98f65e4e652f83bb4e0ee674.tar.bz2"
# curl -O ではなくブラウザ等でダウンロードした場合はファイル名がmituharu-*になる
# tar xf mituharu-emacs-mac-7cc5e6762936.tar.bz2
tar xf 7cc5e67629363d9e98f65e4e652f83bb4e0ee674.tar.bz2
cd mituharu-emacs-mac-7cc5e6762936
# configure ファイルの生成
./autogen.sh
# --enable-mac-app はインストール先を /Applications にする
# --enable-mac-self-contained は関連ファイルを全て Emacs.app 内に収める
# --enable-mac-self-contained を使わない場合は --prefix=DIR で適当なディレクトリを指定する
./configure --enable-mac-app --enable-mac-self-contained
make
make install

環境変数に各種パスを追加する

zsh の例。 --enable-mac-self-contained でビルドした場合。
~/.zshenv ~/.zprofile ~/.zshrc 等どれか一つに以下を追加。

# -U オプションは重複を避ける
typeset -U PATH path
path=("/Applications/Emacs.app/Contents/MacOS/bin" "${path[@]}")
export PATH

# -T オプションはINFOPATH(スカラ変数)とinfopath(配列)を連動する。PATHとMANPATHにはデフォルトで設定済み
typeset -T INFOPATH infopath
typeset -U INFOPATH infopath
infopath=("/Applications/Emacs.app/Contents/Resources/info" "${infopath[@]}")
export INFOPATH

typeset -U MANPATH manpath
manpath=("/Applications/Emacs.app/Contents/Resources/man" "${manpath[@]}")
export MANPATH

端末から emacs -nw で使う場合はシンボリックリンクを作るとか alias を設定する等する。

# シンボリックリンクの例。
ln -s /Applications/Emacs.app/Contents/MacOS/Emacs.sh /Applications/Emacs.app/Contents/MacOS/bin/emacs

私の場合

ビルド手順

# Emacs で有効にしたいライブラリをインストール
brew install gnutls mailutils jansson tree-sitter libgccjit
# GNU Emacs 29.4 Mac port
curl -O "https://bitbucket.org/mituharu/emacs-mac/get/7cc5e67629363d9e98f65e4e652f83bb4e0ee674.tar.bz2"
tar xf 7cc5e67629363d9e98f65e4e652f83bb4e0ee674.tar.bz2
cd mituharu-emacs-mac-7cc5e6762936
./autogen.sh
# configure オプション
# ./configure --help で詳細表示
#
# Mac portでは画像表示にmacOSのAPIを使うので --with-imagemagick は不要
# rsvg, webp 等も無効にしても表示可能
# brewでインストールしたライブラリ(librsvg, libwebp等)にリンクしてしまうのが嫌なので無効にした
./configure --enable-mac-app --enable-mac-self-contained \
 --with-mailutils --with-json --with-tree-sitter \
 --with-native-compilation --with-xwidgets \
 --without-rsvg --without-webp --without-lcms2 --without-compress-install

make -j4
make install
ln -s /Applications/Emacs.app/Contents/MacOS/Emacs.sh /Applications/Emacs.app/Contents/MacOS/bin/emacs

ビルドした Emacs の configure オプションと有効になった機能を確認する

/Applications/Emacs.app/Contents/MacOS/Emacs -nw -q --batch --eval '(message "%s\n%s" system-configuration-options system-configuration-features)'

–enable-mac-app –enable-mac-self-contained –with-mailutils –with-json –with-tree-sitter –with-native-compilation –with-xwidgets –without-rsvg –without-webp –without-lcms2 –without-compress-install
ACL GMP GNUTLS JSON LIBXML2 MODULES NATIVE_COMP NOTIFY KQUEUE PDUMPER SQLITE3 THREADS TOOLKIT_SCROLL_BARS TREE_SITTER XIM XWIDGETS ZLIB

brew で入れた依存ライブラリを表示する

これらのライブラリを消したり、バージョンが上がってファイル名が変更されたりするとEmacsが起動しなくなる。

otool -L /Applications/Emacs.app/Contents/MacOS/Emacs | grep /opt/

/usr/local/opt/gnutls/lib/libgnutls.30.dylib (compatibility version 69.0.0, current version 69.0.0)
/usr/local/opt/jansson/lib/libjansson.4.dylib (compatibility version 19.0.0, current version 19.0.0)
/usr/local/opt/gmp/lib/libgmp.10.dylib (compatibility version 16.0.0, current version 16.0.0)
/usr/local/opt/libgccjit/lib/gcc/current/libgccjit.0.dylib (compatibility version 0.0.0, current version 26.0.26)
/usr/local/opt/tree-sitter/lib/libtree-sitter.0.dylib (compatibility version 0.0.0, current version 0.0.0)

Discussion