Windows上(cygwin上)でiPhone/iPod touchアプリの開発環境を構築する。iPhone OS 2.0対応の巻

iPhone OS 3.0 betaが公開されたので完全に周回遅れです。それでもやっぱりIntelMacが家にないのでWindowsで開発したいんです。1.xのときのメモが完全に役に立たない状態になってたので2.0でできないかを調べたらすごいのを見つけました。


http://www.maxhorvath.com/documents/programming_for_iphone_using_l/eclipse-iphone-cdt.pdf



あなたが神か。


eclipseで開発できる!iPhone SDKだとXcodeしばりでなかなか環境になじめず苦労するんですよね。早速この神の書を実行してみました。

Jailbreakとかの説明とかをすると説明が長くなってしまうのでここではその説明を省きます。以下の前提がある人を対象者としています。

  • 自分の使っているiPhone/iPod touchのバージョンがわかっている
  • 自力でjailbreakしてsshを追加し、有効にできる
  • cygwinやLinuxをなんとなく使ったことがあり基本的なlinuxコマンドはわかる
  • G4でLeopard買ったのにIntel縛りでiPhone SDK使えなかった人(俺のことか)

すみませんが、jailbreakとかcygwinの詳しい説明は別で調べてください。なお、この手順ではcygwinのユーザはmakoto_kwになっているのでコマンドは適宜置き換えて実行してください。またなんとなく自分の使っているfirmwareでやってみました。デバイスと同じfirmwareを使わないといけないかどうかはよく知りません。

Jailbreak
これをやらないと始まらないというか。エミュレータがないので動作確認できない。

  1. jailbreakする

    • がんばれ!
  2. OpenSSHとiPhone 2.0 toolchainを入れる

    • Cydiaから普通に
    • SSHのON/OFFやSpringBoardの再起動にはBossPrefsがおすすめ

cygwinのインストール
iPhoneにはまったく依存しない手順

  1. セットアップを落とす

  2. cygwinのインストール

    • setup.exeを実行
    • Install from Internetを選択
    • Root DirectoryはC:\cygwinで進める
    • Install ForはAll Users (デフォルトのまま)
    • Default Text File TypeはUnix / binary (デフォルトのまま)
    • Local Package Directoryは適当なところ
    • 接続はDirect Connectionで行けると思う
    • Download Siteはなんとなく資料に沿って
      http://mirrors.kernel.org
      を選択する
    • Select Packagesの画面になったらDevelを開く
    • autoconf, binutils, bison, flex, gcc-code, gcc-g++, makeを選択する
      *1
    • Develを閉じてNetを開く
    • opensshとopensslを選択する
    • Nextを押してインストールを待つ
  3. cygwin起動してみる

    • C:\cygwin\Cygwin.batを実行しhomeディレクトリをつくっておく

      • C:\cygwin\home\makoto_kw


iPhone 2.0 Toolchainに必要なファイルをかき集める

共通のtoolchainを取得・展開し、firmwareに含まれるソースを抜き出して追加するという作業。

  1. iPhone 2.0 Toolchainを入れる


    • http://www.pjtrix.com/iphone/articles/eclipse-cdt/iphone-2.0-toolchain.tgz

      を落とす
    • C:\cygwin\home\makoto_kw\iphone-2.0-toolchain.tgzに置く
    • 資料では好きな解凍ツールで解凍してね。と書いてあったが探すのが面倒なのでcygwin上で下記を実行し展開する(ブラウザによっては拡張氏がgzになることもあるのでファイル名の指定に注意)

      • cd ~tar xzvf iphone-2.0-toolchain.tgz
  2. iPhone 2.0のfirmwareからファイルを抜き出す

    • iPhoneのfirmwareからシステムファイルを抜き出すという悪い手順。firmwareは使っているマシンのローカルにあったり
      *2
      、ネットにあったりする
      *3
    • とりあえず今使っているiPod touch 1Gの2.1のfirmwareを使う(iPod1,1_2.1_5F137_Restore.ipsw)
    • firmwareの拡張子のipswをzipに変更し解凍する。中にいくつか.dmgファイルが出てくるが対象は一番ファイルサイズが大きいのが対象のはず
    • dmgは暗号化されているのでiphone-2.0-toolchainの中にあるvfdecrypt.exeを使って暗号化を解く
      *4
      。これには暗号化キーが必要だが、firmwareごとにキーが異なるので注意
      *5

      chmod u+x ~/iphone-2.0-toolchain/src/vfdecrypt.exe
      ~/iphone-2.0-toolchain/src/vfdecrypt.exe -i ~/018-4116-2.dmg -o ~/decrypted.dmg -k \
      9714f2cb955afa550d6287a1c7dd7bd0efb3c26cf74b948de7c43cf934913df69fc5a05f
  3. dmgファイルの中を抜き出すツールとしてPowerISOを使う
    *6

    • PowerISOを起動しdecrypted.dmgを開く、3つのディレクトリをiphone-2.0-toolchainへコピーする
    • decrypted.dmg/usr/lib
    • を下記にD&D

      • C:\cygwin\home\makoto_kw\iphone-2.0-toolchain\iphone-fs\usr
    • decrypted.dmg/System/Library/Frameworks
    • decrypted.dmg/System/Library/PrivateFrameworks
    • を下記にD&D

      • C:\cygwin\home\makoto_kw\iphone-2.0-toolchain\iphone-fs\System\Library


iPhone 2.0 Toolchainのコンパイル

一番トラブルが起こりそうなところ

  1. make-toolchainを編集

    • cygwin上でもwindows上(改行コードはLFのみにすること)でも良いのでC:\cygwin\home\makoto_kw\iphone-2.0-toolchain\make-toolchainをテキストエディタで開く
    • SUDO変数を設定しているところをコメントアウトする(19~24行目あたり)
      *7

      #case "${OSTYPE}" in
      #*win32*)
      #*cygwin*)
      #  export SUDO='echo "";'
      #  ;;
      #esac
    • $SUDOを削除する(6カ所)
      *8
      )
    • symlinkを追加する
      *9

      ln -sf libstdc++.6.0.4.dylib libstdc++.dylib

      の下に以下を追加(45行目あたり)

      ln -sf ../../System/Library/Frameworks/IOKit.framework/Versions/A/IOKit libIOKit.A.dylib
      ln -sf libIOKit.A.dylib libIOKit.dylib
      ln -sf libSystem.B.dylib libSystem.dylib
      ln -sf ../../System/Library/PrivateFrameworks/Accelerate.framework/Frameworks/vecLib.framework/libBLAS.dylib libblas.dylib
      ln -sf libbz2.1.0.4.dylib libbz2.1.0.dylib
      ln -sf libbz2.1.0.4.dylib libbz2.dylib
      ln -sf libSystem.dylib libc.dylib
      ln -sf ../../System/Library/PrivateFrameworks/Accelerate.framework/Frameworks/vecLib.framework/libBLAS.dylib libcblas.dylib
      ln -sf libcharset.1.dylib libcharset.1.0.0.dylib
      ln -sf libcharset.1.dylib libcharset.dylib
      ln -sf ../../System/Library/PrivateFrameworks/Accelerate.framework/Frameworks/vecLib.framework/libLAPACK.dylib libclapack.dylib
      ln -sf libncurses.5.dylib libcurses.dylib
      ln -sf libSystem.dylib libdbm.dylib
      ln -sf libSystem.dylib libdl.dylib
      ln -sf libedit.2.dylib libedit.2.9.dylib
      ln -sf libedit.2.dylib libedit.dylib
      ln -sf libexslt.0.dylib libexslt.dylib
      ln -sf libform.5.4.dylib libform.dylib
      ln -sf libiconv.2.dylib libiconv.2.4.0.dylib
      ln -sf libiconv.2.4.0.dylib libiconv.dylib
      ln -sf libicucore.A.dylib libicucore.dylib
      ln -sf libSystem.dylib libinfo.dylib
      ln -sf libipsec.A.dylib libipsec.dylib
      ln -sf ../../System/Library/PrivateFrameworks/Accelerate.framework/Frameworks/vecLib.framework/libLAPACK.dylib liblapack.dylib
      ln -sf libSystem.dylib libm.dylib
      ln -sf libncurses.5.dylib libncurses.dylib
      ln -sf libobjc.A.dylib libobjc.dylib
      ln -sf libSystem.dylib libpoll.dylib
      ln -sf libSystem.dylib libproc.dylib
      ln -sf libSystem.dylib libpthread.dylib
      ln -sf libresolv.9.dylib libresolv.dylib
      ln -sf libSystem.dylib librpcsvc.dylib
      ln -sf libsqlite3.0.dylib libsqlite3.0.8.6.dylib
      ln -sf libsqlite3.0.dylib libsqlite3.dylib
      ln -sf libstdc++.6.0.4.dylib libstdc++.6.dylib
      ln -sf libtidy.A.dylib libtidy.dylib
      ln -sf libutil1.0.dylib libutil.dylib
      ln -sf libxml2.2.dylib libxml2.dylib
      ln -sf libxslt.1.dylib libxslt.dylib
      ln -sf libz.1.2.3.dylib libz.1.dylib
      ln -sf libz.1.2.3.dylib libz.dylib
      ln -sf libz.1.dylib libz.1.1.3.dylib
  2. make-toolchainを実行

    • cd ~/iphone-2.0-toolchain
      ./make-toolchain
    • 神の書では2時間くらいかかるかもと書いてあり自分の環境では1時間くらいかかった


Hello World!

  1. 神の書を便りにhelloworldのコードを作成する

    • とりあえずまとめました、
      これ(sourcecode)
      をC:\cygwin\home\makoto_kwにおいてください。

      *10

  2. cygwinでmakeる

    • cd ~/helloworld
      make clean
      make
  3. iPhone/iPod touchに転送する

    • cygwinで下記を実行
    • iPHONE_IPはiPhoneのIPに置き換える。パスワードを聞かれたらalpineと打つ。

      ldid
      は署名をつけるツールでiPhone 2.0 Toolchainでインストールされる。署名しないとiPhone 2.0上ではアプリは起動しない。

      export IPHONE_IP=192.168.0.1
      cd ~/helloworld
      scp -r HelloWorld.app root@${IPHONE_IP}:/Applications/
      ssh root@${IPHONE_IP}
      ldid -S /Applications/HelloWorld.app/HelloWorld
  4. HelloWorldを実行する

    • アプリをコピーしてもiPhoneを再起動しないと表示されなったりする
    • BossPrefsなら、Power->Fast ReSpringでSpringBoardを再起動できる

    • helloworldを実行



      天才すぎる!(自画自賛時につかうおたけび)

つかれたのでeclipse + CDTのセットアップはまた今度にします。すごく手順を変更している気がするんだけど神はMacOSXでやってないか?(dmgの抜き出しのキャプチャとかどうみてもMac)最後にVMWareで実行しただけなんじゃないか疑惑。


*1
神の書ではmakeが入ってなかったけどtoolchainのコンパイルで必要だったので追加

*2

iTunesでfirmwareを更新している場合、Windowsなら場合%APPDATA%\Apple Computer\iTunes\、Tigerなら~/Library/iTunes/iPod Software Updatesになる

*3

http://www.felixbruns.de/iPod/firmware/
とか

*4

神の書ではvfdecryptをコンパイルする手順だったがうまくコンパイルできなかった。vfdecrypt.exeがあったのでそのまま使った

*5

各firmwareのDMG暗号化キーはここにまとまっている
http://theiphonewiki.com/wiki/index.php?title=VFDecrypt_Keys

*6

神の書ではツールとしてPowerISOがTransmacが記載されており、Transmacは15日試用期間、PowerISOは未登録だとファイル作成ができない、300MB以上のファイルは編集できないという制限がある。decrypted.dmgが300MB以下だったのでPowerISOを選択
http://www.poweriso.com/download.htm

*7
winodwsであればsudoを実行しないようにするという分岐処理なのだが以下のようなエラーになったので

./make-toolchain: line 21: syntax error near unexpected token `)'
./make-toolchain: line 21: `*cygwin*)'

*8

なんかexport SUDO=’echo "";’のこしても$SUDO …を実行したときにそのコマンド1行全体がechoになっているように見えたので・・・不安要素はなくす

*9

どう考えてもdmgからWindowsのファイルシステムにコピーした瞬間にsymlink消えています。ありがとうございました。symlinkしてないとHelloWorldAppのコンパイルで以下のエラーがでる

/usr/local/bin/arm-apple-darwin9-ld: /usr/local/iphone-sysroot/usr/lib/libobjc.dylib truncated or malformed object (mach header extends past the end of the file)
/usr/local/bin/arm-apple-darwin9-ld: /usr/local/iphone-sysroot/usr/lib/libz.1.dylib truncated or malformed object (mach header extends past the end of the file)
/usr/local/bin/arm-apple-darwin9-ld: /usr/local/iphone-sysroot/usr/lib/libstdc++.6.dylib truncated or malformed object (mach header extends past the end of thefile)

*10

神の書ではHelloWorldApp.hがなかったので作成、画像がないとmakeで怒られるのでSDKのサンプルからpng画像を拝借