トップ «前の日記(2014-11-05) 最新 次の日記(2015-01-05)» 編集

Route 477



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