GNU Emacs 29.2 以降の Emacs Mac port をソースからビルドする
パッケージマネージャーでも Emacs Mac port はインストールできます。
brew
brew tap railwaycat/emacsmacport
brew install --cask emacs-mac
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
brew で autotools
等のプログラムをインストールします。
# 他にもあったかも
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