4月24日にECL (Embeddable Common Lisp)の開発者メーリングリストで、メジャーリリース20.4.24版のリリースアナウンスがありました。4年ぶりくらいのリリースでおめでたいことでもあります。
https://common-lisp.net/project/ecl/posts/ECL-20424-release.html
早速ECL20.4.24のソースコードをダウンロードしてビルドしてみました。MacOS XとDebian Linux 10ではさくっとビルドできました。
当然問題なくいけるだろう、という期待のもとMaxima 5.43.2のソースコードをダウンロードして、出来立てのECL20.4.24を使ってビルドすると、、、こけます。あれ?なんで?
調べてみると、いきなり、srcディレクトリのファイルをコンパイルする前にこけてます。lisp-utilsディレクトリの中のdefsystem.lispを読み込むところです。"LISP"パッケージなんて定義されていないのに使おうとしている、というエラーメッセージです。コードを調べると1箇所、lisp:requireという記述がありました。このlisp:をcl:に直すと無事にdefsystem.lispの読み込みに成功!
あとは楽勝、と思って再度ビルドを実行すると、、、ビルドは無事に成功。早速出来上がったmaximaを実行してみると、、、こけます。(require :defsystem)というコードが処理できない、というエラーです。一体誰がmaxima実行時に(require :defsystem)なんて呼び出すのだろう、、、と調べてみるとsrc/maxima.systemというコンパイル全体を統制するファイルの中で、ECLのビルドイメージを作成する部分で、イメージ起動時に最初に実行するコード(epilogueと呼ばれます)の中にありました。
Maximaの実行時にはdefsystemは不要なはずなのでこの呼び出し部分を削除。もう一度ビルド。出来たイメージを実行してみると、今度は無事にmaximaが起動しました。テストプログラムを実行すると1万ケース以上をテストして失敗は3つ。悪くありません。
上記2つの変更は実はいずれもMaximaのソースコードの問題なので、そっちのメーリングリストに報告。Robertさんと意見交換をして、修正することに決定。
久しぶりにバグレポ書いて、コードをメインツリーからgit pullして修正してテストして、git pushしてバグレポをクローズまで行いました。
ついでにAndroid用にECLをarm cpuをターゲットにしてクロスコンパイルしてみました。欲張ってNDKを最新のr21を選択したため、ツールとsysrootの指定で悩みましたが、無事に解決! ARM版Androidで動作するECL 20.4.24を作ることができました。
次はECL20.4.24を使って、ARM版Androidで動作するMaxima 5.43.2を作ることなのですが、、、最も美しくクロスコンパイルする方法を模索中です。