iOSアプリをXcodeのGUIなしでビルドしてみた等々
プログラマの渡辺です。
独自のtoolchainを作りたいというわけでもない人には誰得感があるのですが、mobiruby-iosをベースにiOSのアプリをXcodeのGUIなしでビルドするのを仕事の合間に試していました。
そもそも・・・
本当は、mobiruby-iosを現在のXcodeに対応してあげたかったのですが、プロジェクト自体止まっているので当然諸々開発環境から置いて行かれて辛かったのでやめました。
なので、ベースをmobiruby-iosに、XcodeのGUIいじるのがだるいので、RakefileでXcodeのGUIなしでiOSのアプリを吐けるようにと試していました。
個人的に、テキストでいじれないビルドシステムは、扱いたくなかったのも大きいです。
余談
そもそもiOSアプリをRubyで開発できてうれしいのか問題は、スクリプトをいじっている間ずっと考えていました。
なぜかというと、Swiftという新しい言語で、iOSアプリの開発が大分楽になりましたし、補完がつらいRubyでApple社製のフレームワークとかつらいだけでしょとか、色々Rubyの出る幕じゃない感があります。
興味だけでやっても仕方ないところはあるので、誰かrsenseさんを救ってあげたらいいんじゃないかなー?とか思います。
とりあえずGithubへ
成果物はGitHubに上げてあります。
色々欠けているファイルがいっぱいあるので雰囲気だけ掴んでいただければと思います。
(mruby-cocoaは今回触るのがほとんど初めてなので欠けが顕著だったりします。)
それから、実は実行ファイル生成の一歩手前で、若干頓挫していたりします。(タイトルの”みかん”は、冬なのでみかん食べたいのもありますが、進捗状況だったりします。)
ちなみに、内部のmrubyは1.2.0にアップデートしてあります。
バージョン選ぶ過程で知ったのですが、2016年内でのリリースは結局なかったんですね。
現在のGitHubにある最新版への対応には、個人的に対応に苦慮しそうなPull Requestがとりこまれてしまったので、当面なかったりします。
文句は、とりこんだ人に言うべきな気がします。(そもそもリリース計画がまともにない開発資源が乏しそうなOSSに文句を言うのもお門違いな気もしますが。)
今の課題
現在、行き詰まっているところは、build-exports.rbというスクリプトです。
何をするスクリプトなのかというと、構造体・列挙型・定数それぞれの情報をmruby-cocoaで読める形式のデータをCのコードで生成するものみたいです。
今回の問題は、そこから呼んでいるgen_bridge_metadataというプログラムに問題があって止まっています。そのスクリプト自体が10年ほど歴史があったり、途中でAppleの手が入っていたりで、理解するのに骨が折れそうな感じはあるんですが、要約するとiOSというかクロス環境向けに使うには不向きだったようです。
そもそも、Xcodeのディレクトリ構造自体が複雑でxcrunというプログラムを使わないと、つらいので仕方ない感じはあります。
元のコードとかを読むと、clangを利用してコードを読み込んでいたりするのですが、結局パス解決などに失敗してソースの読み込みなどに失敗していてとてもつらい感じだったりします。
考えている解決策は、もとのBridgesupportのコードをいじるか、いっそffi-clangなどで自前のコード生成をプログラムを書くか、くらいです。
前者はXcodeのディレクトリ構造がつらいのでやりたくないので、後者が有力な気がします。
生成するコード自体は難しくないのですが、構造体のメンバなどの型情報はObjective-CのType Encodingに従っているらしく若干めんどうそうです。
また、まだ検証していないのですが、ABIが違う場合、各ビルドごとにコード生成をしないといけないので、ビルドプロセスが更に複雑になりそうでつらいです。まあ、ループ自体は既存のを流用したりできるのでコード生成部よりかは楽かとは思います。
それはそうと、iOSでRubyといいますと、RubyMotionの方がメジャーです。(そもそもmobiruby自体、開発が止まっているので比較対象にもなりませんが。)
参考になるかと中の人のインタビューの前後編を読んだりしたんですが、そもそも方式が異なるので、今のところ参考にならなさそうでした。
それでも、話自体は面白かったです。
Rubyの実装に関わったことがある人のあるあるが多くて興味深いと思います。
どうして、こうも最適化しづらい言語が未だに使われているのか、ホントつらいです。
大きく異なる点としては、RubyMotionは独自仕様のRubyをLLVMでコンパイルしているので、仮想マシンとコンパイラを搭載するmrubyとはかなり違いました。
また、運営方法も違います。RubyMotionは、開発が部分的に非公開ですが、mrubyはほぼすべてOSSです。
それでも、開発資源の確保などのために一部を非公開にしているそうなので、公開されてる部分はしっかり利用させていただこうかと思います。
会いたい人たち
そんな感じでいじっていましたがつらいので、できることならmobiruby-iosの作者である@masuidriveさんや、RubyMotionの開発者の@watson1978さん(RubyMotionの中の人インタビューでも触れられていた人)や、RubyPicoの作者の@ongaeshiさん話してみたいなーと、思う昨今です。
(画像参照:blog.livedoor.jp)