ECL Readlineを有効化した状態でのCFFI-LIBFFIのコンパイルエラーについて
はじめに
インストールしているパッケージのコンパイルキャッシュを全て削除してプログラムをビルドしようとしたところ、GROVEL-ERROR
というものが発生して途中で止まってしまいました。
根本的な原因はわかっていませんが、ECL Readlineを使用している環境だとこの問題が発生する感じです(途中でECL Readline環境にしたため、気付かなかった)
環境
- Debian GNU/Linux buster
- ECL 16.1.3
- ECL Readline 0.4.1
cffi-libffiのエラー
CFFIパッケージに含まれるcffi-libffiのコンパイルで次のようなエラーが出ます。
CL-USER[1]> (asdf:load-system :cffi-libffi)
; pkg-config libffi --cflags
; gcc -o /home/hiro/.cache/common-lisp/ecl-16.1.3-unknown-linux-x64/home/hiro/deepspace/share/deepspace/quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types__grovel-tmpUWNGR0DC.o -c -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -g -O2 -fdebug-prefix-map=/build/ecl-IeawtT/ecl-16.1.3+ds=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_THREAD_SAFE -Dlinux -fPIC -I/home/hiro/deepspace/share/deepspace/quicklisp/dists/quicklisp/software/cffi_0.20.1/ /home/hiro/.cache/common-lisp/ecl-16.1.3-unknown-linux-x64/home/hiro/deepspace/share/deepspace/quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types__grovel.c
Condition of type: GROVEL-ERROR
:INPUT argument to RUN-PROGRAM does not have a file handle:
#<two-way stream 000055be22c0e5a0>
INPUT argument to RUN-PROGRAM does not have a file handle〜
と出るんですが、何か悪いのかわからない状態で、ひとまず--norc
オプションで何も設定ファイルを読み込まないECLだと問題なくcffi-liffiをコンパイルできることがわかりました。
使用しているeclrcを確認して色々試していると、ECL Readlineの有効化によってこの問題が発生していることがわかりました。
使用しているeclrc
(defparameter *deepspace-home* (si:getenv "DEEPSPACE_HOME"))
(load (concatenate 'string *deepspace-home* "/lib/asdf.lisp"))
(require 'asdf)
(setf asdf:*asdf-verbose* nil)
(setf *load-verbose* nil)
(asdf:initialize-source-registry
`(:source-registry
(:tree ,(concatenate 'string *deepspace-home* "/share/deepspace/quicklisp/dists/quicklisp/software"))
(:tree ,(concatenate 'string *deepspace-home* "/lib/"))
(:tree ,(namestring *default-pathname-defaults*))
(:tree ,(concatenate 'string (namestring *default-pathname-defaults*) "lib"))
:inherit-configuration))
(asdf:initialize-output-translations
'(:output-translations
:enable-user-cache
:ignore-inherited-configuration))
(asdf:load-system :ecl-readline)
(ecl-readline::enable)
この中で、ECL Readlineを有効化している(ecl-readline::enable)
を一時的にコメントアウトしREPLを起動し、その上でcffi-libffiをロードすると、問題なくコンパイルされることを確認済です。