ocaml3.PNG

(OCaml toplevel on Androidより)

OCaml トップレベル on Android ソース

http://bitbucket.org/keigoi/ocaml-toplevel-android/

  • 下の OCaml on Android が必要

O'Caml on Android 3.12 版

  • NO WARRANTY - 無保証

バグ

  • ネイティブの実行形式を作成できない(共有ライブラリなら可)
    • そのうちパッチを更新します

このビルドでできること

  • Androidネイティブの実行形式を生成できる
    • ただし、Androidアプリ(.apk)からの呼び出しは(rootedでないと)できない
    • Androidのターミナル (adb shellやTerminal Emulatorなど) から起動可能
    • たとえば ocamlトップレベルが adb shellから起動できる(後述)。
  • .soファイルを生成できる。やり方は普通のOCamlと同じ。 C共有ライブラリの作成 を参照
    • 適切なスタブを用意すれば AndroidアプリからOCamlコードを呼び出せる(はず)

パッチのダウンロード

準備

  1. Android NDK r7 をダウンロードしてどこかに展開する.
  2. 重要 stdlib.h から #include<memory.h> の行を削除する(memory.hは空なので問題ない)。

ビルド

  1. ocaml-3.12.1をダウンロードし、ホストのocamlrunとocamlyaccをビルド. 注意:32bit版をビルドすること
    • 32bit版のビルド方法は http://caml.inria.fr/pub/distrib/ocaml-3.12/notes/INSTALL を参照
      tar jxf ocaml-3.12.1.tar.bz2
      mv ocaml-3.12.1 ocaml-host
      cd ocaml-host
      ./configure -cc "gcc -m32" -as "as -arch i386" -aspp "gcc -m32 -c" # Snow Leopardの場合。
      pushd . && cd byterun && make all && cp ocamlrun ../.. && cd ../yacc && make all && cp ocamlyacc ../.. && popd
  2. 別のocaml-3.12.1のツリーを展開し、パッチをあてる
    tar jxf ocaml-3.12.1.tar.bz2
    mv ocaml-3.12.1 ocaml-target
    cd ocaml-target
    patch -p1 <../ocaml-android-3.12.1.diff
  3. Makefileを修正する
    vi config/Makefile
  4. ターゲットのocamlrunとocamlyaccをビルドして、退避させ、ホストのものに置き換える
    pushd . && cd byterun && make all && mv ocamlrun ocamlrun.target && cd ../yacc && make all && mv ocamlyacc ocamlyacc.target && popd
    cp ../ocamlrun byterun/ && cp ../ocamlyacc yacc/
  5. makeする (configureしてはいけない)
    make world
    make opt

インストール

make install

テスト

  • ここでは /data/local/tmp/ocaml に置いて起動を確認するが、実行可能属性を付加できないファイルシステム (/sdcardなど) では動かない
    adb shell mkdir /data/local/tmp/ocaml
    adb push byterun/ocamlrun.target /data/local/tmp/ocaml
    adb push ocaml /data/local/tmp/ocaml
    for FILE in stdlib/*.cm[ia]; do adb push $FILE /data/local/tmp/ocaml; done
  • 実行してみる
    adb shell
    cd /data/local/tmp/ocaml
    ./ocamlrun.target ./ocaml
    
             Objective Caml version 3.12.1
    
    # 1. +. 1.;;
    - : float = 2.
    #

履歴

  • ocamloptで生成したバイナリが動作しない不具合を修正(MKEXEにリンカオプションが渡されていなかった) (2010/12/7 23:35)
  • 共有ライブラリが一応ビルドできるようになった (2010/12/8 0:16)
  • OCaml 3.12.1 / Android NDK r7 に対応 (2012/2/3), unisonもビルドできるようだ

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-02-03 (金) 03:44:52 (1851d)