Let's write β

プログラミング中にできたことか、思ったこととか

Oz(Mozart)環境をMacOSX 10.8でセットアップした

Ozという言語マルチパラダイム言語があるようで、あまり僕の周囲にはユーザーがいないように
見えるのですが、それでもOzはすごいすごいと聞くので、体験してみねばという事で開発環境の
整備をしました。

最近iOS関連の開発をする事になってMacOSXを使っているのでMacOSX上の開発環境を整備しようとしました。(Ubuntuのほうはサクサク完了した)

Ozの環境としてはMozartというのが代表的というかデファクトスタンダードなようで、この環境を整備する必要があります。公式にgithubのリポジトリがあり、その中でソースをチェックアウトしてコンパイルする方法が掲載しているのですが、そちらは

Configure error on OS X 10.8.1 when following github instructions

こちらと同様の症状(flexのバージョン番号がちゃんとパースされない)がでてこちらのMLでも解決方法がのっていないので、最初は自分でバージョン番号のパースのロジックを修正しようとかおもっていたのですが、さすがにそれは面倒だと思い、途方に暮れていたところ

そういえば公式になにやらMacOSXようのパッケージがあるなぁと思いだしました。当初はリリースが2012年となっており、どうせなら最新の物をgithubからおとそうとおもっていたのですが、こうなってはパッケージにたよるしかありません。

MacOSX Packages for Mozart 1.4.0

ここからパッケージをダウンロードするとMozart.appという物がダウンロードされます。
起動してみるとAquaEmacs.appが起動してきました。MozartはEmacsと連携している事はドキュメントを読んで知っていたので、Emacsが起動するのは良いのですが普段つかっているHomebrew経由のEmacs.appでないのはちょっといただけません。

そこで、Mozart.appの中の物を改造してしまえば起動するEmacsを変えられるのではないかとターミナルでMozart.appの中にもぐりこみます。

appは起動する時にContents/MacOS/の中の物を起動するので、行ってみるとscriptというファイルがありました。名前から何かのシェルスクリプトとかかなとおもったのですがファイルタイプを確認してみるとバイナリです。さすがにバイナリを書きかえる労力をはらうのはダルいなあとおもって、別の策を模索しはじめます。

次にContents/Resourcesに入ってみると色々とbinやらincludeやらなにやら見なれたファイル構造。binの中には案の定ozのバイナリやらが入っています。念のためozを起動してみるとcuiemacsの中で起動しました。という事は特段AquaEmacs.appに決め打ちでハードコードされているわけではないようだなぁと思いました。

次にResourcesを見てみると何やらscriptというファイルが、先程のbinのファイルと同名というのも、ただ普通にころがっているのも怪しいです。

開いてみると、普通のshellscriptで何やらAquaEmacs.appを探して起動したりなんなりとビンゴです。

このファイルをさっきのMacOS以下のファイルとさしかえれば良いのでは?とおもい、さっそく編集にかかります。

#!/bin/bash

OZHOME=`pwd`/../Resources
CD="$OZHOME/CocoaDialog.app/Contents/MacOS/CocoaDialog"
#CD="Mozart.app/Contents/Resources/CocoaDialog.app/Contents/MacOS/CocoaDialog"


detectAquamacs()
{
    if [ ! -e "/Users/hoge/Applications/Emacs.app" ]; then
	`$CD ok-msgbox --no-cancel --icon info --timeout 20 --title "Aquamacs not found" --text "This application is needed to run Mozart" --informative-text "You can download it from http://aquamacs.org/"`
	exit 2
    fi
}

detectAquamacs

AQUAMACS=""
if [ -e "/Users/hoge/Applications/Emacs.app" ]; then
    AQUAMACS="/Users/hoge/Applications/Emacs.app/Contents/MacOS/Emacs"
else
    AQUAMACS="/Users/hoge/Applications/Emacs.app/Contents/MacOS/Emacs"
fi

######################################################################
# you should not edit below this line

# where Oz resides:


export OZHOME

GEC_LIBS="$OZHOME/Framworks"
EXT_LIBS="$OZHOME/Framworks"
: ${OZPLATFORM=`"$OZHOME/bin/ozplatform"`}
: ${OZEMULATOR="$OZHOME/platform/$OZPLATFORM/emulator.exe"}
: ${OZVERSION="1.4.0"}
: ${OZ_DOTOZ="$HOME/.oz/$OZVERSION"}
: ${OZ_LD_LIBRARY_PATH="$OZ_DOTOZ/platform/$OZPLATFORM/lib:$OZHOME/platform/$OZPLATFORM/lib${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"}
: ${OZ_DYLD_LIBRARY_PATH="$OZ_DOTOZ/platform/$OZPLATFORM/lib:$OZHOME/platform/$OZPLATFORM/lib${DYLD_LIBRARY_PATH:+:}${DYLD_LIBRARY_PATH}:$GEC_LIBS:EXT_LIBS"}


LD_LIBRARY_PATH="$OZ_LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
DYLD_LIBRARY_PATH="$OZ_DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH

# set OZPATH & PATH
if test -z "${OZ_PI}"
then
  # where Oz searches for files:
  if test -z "${OZPATH}"
  then
     OZPATH=.
  fi
  OZPATH="${OZPATH}:${OZHOME}/share"
  export OZPATH
  # increment path
  PATH="${OZHOME}/bin:${PATH}"
  export PATH
  OZ_PI=1
  export OZ_PI
fi

exec "$AQUAMACS" --eval '(setq load-path (cons "'$OZHOME'/share/elisp" load-path))' -l oz.elc -f run-oz $2 &

適当に書きかえた結果がこれだよ!(めちゃめちゃ適当で決め打ちです、しかし書きかえるべき箇所はなんとなくわかってもらえるはずです)

で、こいつを先程のscriptバイナリをscript.orgとリネームしてMacOS以下にコピーしました。

そしてMozart.appを再び起動してみるとビンゴ!無事普段つかっているEmacs.appが起動して中でOz Compilerが起動していました。

つたない記事ですが、誰かの参考にすこしでもなればと。