Linux版squeakvmの作成

これはSmalltalk Advent Calendar 2017の記事です。穴が空きそうだったので、あわてて作りました。

Ubuntu Linuxなどでパッケージ配布されているScratchのVMでは、ScratchSourceCodeのイメージで起動することができません。(真っ白な画面が表示されてフリーズします)
ScratchのVMは実際にはSqueak SmalltalkのVMですが、どうやらバージョン4系のVMはどれもScratchSourceCodeのイメージで起動できないようです。
そこでSqueak-3.9-8のVMをビルドして使うことにします。32bit版を作るため、普段使っている64bit版のUbuntuではなく、32bit版のUbuntuでビルドします。私はVirtualBox上のlinuxBeanを使ってビルドしました。

64bit版のUbuntuでもビルド可能ですが、i386パッケージを大量にインストールする必要があるので、あえて32bit版をインストールしてビルドしました。

必要なパッケージの入手

VMをビルドするために必要なパッケージをインストールしておきます。

$ sudo apt-get install cmake g++ xorg-dev
$ sudo apt-get install libcairo2-dev libpango1.0-dev
$ sudo apt-get install uuid-dev libpulse-dev libasound2-dev libffi-dev libdbus-1-dev

ソースの入手

Squeak-3.9-8のVMのソースは以下のURLから入手できます。
http://files.squeak.org/3.9/unix-linux/
Squeak-3.9-8.src.tar.gz をダウンロードして、適当なフォルダに展開します。

$ tar xzf Squeak-3.9-8.src.tar.gz
$ cd Squeak-3.9-8

パッチを当てる

このままビルドしてもコンパイルエラーが発生します。原因はソース中にちりばめられている dprintf というマクロが再定義されているからです。新しいVMでは debugf という名前に変えられているので、こちらもそのように変更します。
私はsedを用いてdprintfを含むソースをすべて変換しました。

sed -i".orig" -e "s/dprintf/debugf/g" *.c

せっかくなので、関係するソースをすべて変更するパッチファイルを提供します。
squeak-3.9-8.patch
上記ファイルをダウンロードしたら、ソースを展開したフォルダ内でパッチを適用します。

$ patch -p1 < squeak-3.9-8.patch_.txt
patching file platforms/unix/vm/sqUnixExternalPrims.c
patching file platforms/unix/vm/dlfcn-dyld.c
patching file platforms/unix/vm/debug.c
patching file platforms/unix/vm/debug.h
patching file platforms/unix/vm/sqUnixMemory.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDev.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDevKeyboard.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDevMouseADB.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDevFramebuffer.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDevMousePS2.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDevKeymap.c
patching file platforms/unix/vm-display-fbdev/sqUnixFBDevMouse.c

ビルドする

$ mkdir bld
$ cd bld
$ ../platforms/unix/config/configure --prefix=`pwd`/target CFLAGS="-Wno-unused-result"
$ make
$ make install

targetにVMやプラグインが格納されるので、適当なフォルダ(例えば /usr/local/ 以下)にコピーして使います。
これでUbuntu Linux環境でも問題なくScratchSourceCodeのイメージを起動できるはずです。