macOS VenturaにEmacsをソースコードからインストール

Macbook Pro 14インチ 2021が10月頭くらいから調子悪くて
macOSを再インストールしても変わらなかったので初期化してMontereyをインストールしてから13.0 Venturaにアップデートした
それでVenturaでEmacsをインストールしたときの記録です

emacsclientを使ったりEmacs.appを使ったりしたいのでソースからインストールしてます

macOS: Ventura 13.0
Emacs: 28.2
Emacs Patch: 9.1

参考

ほとんどこの記事のスクリプトでインストールしました。
https://note.com/5mingame2/n/na26256d3e1db

作業手順

1. 実行環境の用意

  1. Xcodeのインストール、インストール後に起動してCommand line toolsもインストールする
  2. Homebrewのインストール
  3. Homebrewで色々インストールする
  4. 作業場所を作成 ~/src を作業ルートにしたいので $ mkdir ~/src && cd ~/src

HomebrewではいろいろインストールしてるのでどれがEmacsのインストールに必要かわからないので全部転載

% brew list
==> Formulae
aom			gnutls			libogg			libxrender		rubberband
autoconf		graphite2		libpng			little-cms2		ruby-build
bdw-gc			guile			libpthread-stubs	lz4			sdl2
brotli			harfbuzz		librist			lzo			snappy
ca-certificates		highway			libsamplerate		m4			speex
cairo			icu4c			libsndfile		mbedtls			srt
cjson			imath			libsodium		mpfr			swift-format
cmocka			isl			libsoxr			nettle			swiftlint
curl			jansson			libssh2			opencore-amr		tesseract
dav1d			jpeg-turbo		libtasn1		openexr			texinfo
ffmpeg			jpeg-xl			libtiff			openjpeg		theora
flac			lame			libtool			openldap		unbound
fontconfig		leptonica		libunistring		openssl@1.1		webp
freetype		libarchive		libvidstab		opus			wget
frei0r			libass			libvmaf			p11-kit			x264
fribidi			libb2			libvorbis		pcre2			x265
gcc			libbluray		libvpx			pixman			xorgproto
gettext			libevent		libx11			pkg-config		xvid
giflib			libgccjit		libxau			rav1e			xz
git			libidn2			libxcb			rbenv			zeromq
glib			libmpc			libxdmcp		readline		zimg
gmp			libnghttp2		libxext			rtmpdump		zstd

おそらく下記でいけるのかな、たぶん。問題があったら↑の内容をいろいろインストールしてください。

brew install gcc libgccjit textinfo

2. ソースコードをダウンロード

https://www.gnu.org/software/emacs/download.html
公式から28.2最新ソースコードをダウンロード

ftp://ftp.math.s.chiba-u.ac.jp/emacs/
千葉大学からパッチのダウンロード、Emacs 28.2用は9.1でした
Finderで コマンド+K でアクセス

3. 準備

https://note.com/5mingame2/n/na26256d3e1db
参考にしたソースコードのバージョン指定を修正

下記を ~/src/emacs_build.sh として保存
ソースコードの解凍はコメントアウトしている

#!/bin/bash

EMACS_VER=28.2
MACPORT_VER=9.1

# tar xvfz emacs-${EMACS_VER}.tar.gz
tar xvfz emacs-${EMACS_VER}-mac-${MACPORT_VER}.tar.gz
cd emacs-${EMACS_VER}
patch -p 1 < ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/patch-mac
cp -r ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/mac mac
cp ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/src/* src
cp ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/lisp/term/mac-win.el lisp/term
cp nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns mac/Emacs.app/Contents/Resources/Emacs.icns

installprefix=`pwd`/build
app_dir=$installprefix/Emacs.app/Contents/Resources
compver=x86_64-apple-darwin`uname -r`

# LIBXML2 for Catalina
MACSDK=`xcrun --show-sdk-path`
export LIBXML2_CFLAGS="-I${MACSDK}/usr/include/libxml2"
export LIBXML2_LIBS="-lxml2"

set -e
./autogen.sh
./configure --without-x --without-dbus --without-xpm CC=clang CFLAGS='-Os' --enable-mac-app=$installprefix --prefix=$installprefix --enable-mac-self-contained --with-native-compilation
make
make install
set +e

echo 'Done! Find your Emacs.app at '$installprefix'.'

4. コンパイルの前に

1度インストールしてEmacs.appを実行したら

ld: warning: -undefined dynamic_lookup may not work with chained fixups

というエラーが起きた。
参考
https://fu7mu4.hatenablog.com/entry/2022/11/03/224336
https://github.com/emacs-mirror/emacs/commit/97b928ce09d6034ebcb541fb548e5d4862302add

ということで、
ソースコードを解凍しgithubの修正を直接行った。
~/src/emacs-28.2/lisp/emacs-lisp/comp.el のファイル内検索 native-comp-driver-options して修正

- (defcustom native-comp-driver-options nil
+ (defcustom native-comp-driver-options (when (eq system-type 'darwin)
+                                         '("-Wl,-w"))

5. コンパイル

$ cd ~/src/emacs-28.2
$ sh ./emacs_build.sh

あとは実行完了を待つ
成功すると ~/src/emacs-28.2/build/Emacs.app ができあがるので /Applications にコピーを作成

6. emacsclient

emacsclientは ~/bin に設置したいのでフォルダ作成してからシンボリックリンクを作成

$ mkdir ~/bin
$ ln -s /Applications/Emacs.app/Contents/MacOS/bin/emacsclient ~/bin/

補足

今回作業場所を ~/src にしたり ~/bin にemacsclientを設置しているのは
以前に /usr/local/(src|bin) などを使っていたらHomebrewに文句を言われた気がしたからです
なのでホームディレクトリ配下にしました
もちろんパスも追加しています

# .zshrc
export PATH=$HOME/bin:$PATH