2014-12-09
■ [types] MacでSML#を動かす
ちょっと手元でSML#を動かしたかったのだけど、オフィシャルにはMacPortsのパッケージしかなかった。 そこでhomebrewと組み合わせて自前でのコンパイルを試みた。
brew + コンパイル
SML# 2.0.0のコンパイルにはLLVM 3.4が必要である。普通にbrew install llvmすると3.5が入ってしまうので、何らかの工夫が必要になる。 brewで古いバージョンを入れる方法はいろいろあるようだが、ここではhomebrew-versionsを使ってみた。
$ brew install homebrew/versions/llvm34
$ cd /usr/local/opt/llvm34/bin/
$ ln -s llvm-config-3.4 llvm-config
$ cd ~/somewhere/smlsharp-2.0.0
$ ./configure --with-llvm=/usr/local/opt/llvm34 --enable-native=x86-darwin && make
(中略)
g++ -L/usr/local/Cellar/llvm34/3.4.2/lib/llvm-3.4/lib \
src/runtime/smlsharp_entry.o \
precompiled/x86.o \
src/llvm/main/llvm_support.o src/llvm/main/SMLSharpGC.o \
src/runtime/libsmlsharp.a \
-ldl -lgmp -lm -lLLVMLTO -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMMCDisassembler -lLLVMMCParser -lLLVMInstrumentation -lLLVMInterpreter -lLLVMMCJIT -lLLVMJIT -lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMExecutionEngine -lLLVMTarget -lLLVMMC -lLLVMObject -lLLVMCore -lLLVMSupport -lz -lpthread -lffi -lcurses -lm \
-o minismlsharp
ld: warning: ignoring file precompiled/x86.o, file was built for i386 which is not the architecture being linked (x86_64): precompiled/x86.o
Undefined symbols for architecture x86_64:
"__SMLmain", referenced from:
_main in smlsharp_entry.o
"__SMLstackmap", referenced from:
_sml_control_init in libsmlsharp.a(control.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [minismlsharp] Error 1
うーん、うまく行かない。
Ubuntuを試す
VMWare上にUbuntuの環境があるので、そっちも試してみた。
- Ubuntu 14.04 trustyを使っている
- smlsharp-2.0.0-2_ubuntu-amd64.debを入れようとするとlib32gmp-devが必要と言われる
- そのようなパッケージは見つからない
ということで
ちょっと触りたいだけならDockerで動かすのが一番簡単っぽい。
$ docker run -i -t mzpi/smlsharp /bin/bash
(イメージのダウンロード部分は中略)
root@528ee3cd7f3e:/# smlsharp
SML# 2.0.0 (2014-04-04 11:47:08 JST) for i686-unknown-linux-gnu with LLVM 3.4
# 1;
val it = 1 : int