Emacs 27 で load-history-filename-element: Wrong type argument: stringp, (require . info)

Emacs 27でDDSKKを有効にしたりorg-modeを起動したりするときに、以下のようなエラーが出た。

load-history-filename-element: Wrong type argument: stringp, (require . info)

環境は、macOS Catalina + emacsformacosx で配布していたバイナリ (27.0.91)

追記: emacsformacosxのバイナリは 27.1-1 で修正された模様

調査と対応

とりあえずemacsを起動したあと、 toggle-debug-on-errorデバッグを有効にする。そしてエラーが出る操作をする (orgファイルを開く、skk-mode 実行など)。

# skk-mode を実行したとき
Debugger entered--Lisp error: (wrong-type-argument stringp (require . info))
  string-match("\\(\\`\\|/\\)skk-jisx0201\\(\\.elc\\|\\.el\\|\\.so\\)?\\(\\.gz\\..." (require . info))
  load-history-filename-element("\\(\\`\\|/\\)skk-jisx0201\\(\\.elc\\|\\.el\\|\\.so\\)?\\(\\.gz\\...")
  eval-after-load("skk-jisx0201" #f(compiled-function () #<bytecode 0x1fe14e6e526d>))
  byte-code("\306\10\307\"\20\306\11\310\"\21\n\311\33\211\34\203!\0\f@\23\312\13\15\"\25\fA\211\24\204\22\0*\313\211\36\25\311\33\211\34\203>\0\f@\23\312\13..." [skk-downcase-alist skk-set-henkan-point-key skk-act-unnecessary-base-rule-list str --dolist-tail-- skk-rom-kana-base-rule-list append ((34 . 39) (58 . 59)) (34 58 81 88) nil skk-del-alist ("hh" "mm") add-to-list skk-rom-kana-rule-list eval-after-load "skk-jisx0201" #f(compiled-function () #<bytecode 0x1fe14e6e526d>) run-hooks skk-act-load-hook provide skk-act del-list skk-act-additional-rom-kana-rule-list rule] 4)
  require(skk-act)
  skk-mode-invoke()
  skk-mode(nil)
  funcall-interactively(skk-mode nil)
  call-interactively(skk-mode nil nil)
  command-execute(skk-mode)

load-history-filename-element とか load-history とか見てみたけど原因はよくわからず。 eval-after-load "skk-jisx0201" ... で失敗しているようなので、 skk-mode する前に (require 'skk-jisx0201) したらエラーは出なくなった。

他の回避方法としては、自分でビルドしたEmacs 27 では問題は発生しなかった。使うパッケージごとにエラーが出るかもしれず一々対応してられないので自分で ビルドしたものを使うことにした。初めて自分でビルドしてみたけどすんなりできてびっくりした。

brew install autoconf automake pkg-config gnutls texinfo jansson

git clone git://git.sv.gnu.org/emacs.git
cd emacs
git checkout emacs-27.1

./autogen.sh
./configure CC=clang --without-x --with-ns --with-modules
make bootstrap -j
make install -j

slackのemacs-jpで話題になっていたので、そういえばそんな事もあったなと思い、メモを書き起こしてみた。