CocoaでYAML

はじめに

MacOSX上のCocoaでYAMLを読み込む必要が出て来た。 そこでgoogle先生に伺った所、何種類かライブラリが出て来た。トップ表示されていたSyckライブラリを使う事にした。

SyckにはCocoa用ラッパーのフレームワークが入っており、コレをビルド出来ればCocoaから簡単に使う事が出来る。

この文書はその時のビルド方法のメモです。なお、iOS上での動作確認はしてません。

開発環境

開発環境は以下の通りです

MacOSX:10.8.2
XCode:4.5.2
Syck:0.7(commit 2656dcc9e879a26e0d7c36ae45f22150d2692ad0)

ビルド方法

https://github.com/indeyets/syck”から圧縮ファイルをダウンロード解凍する

そのままbootstrapファイルを実行するとエラーになるので一部修正する。 理由は”libtoolize”が見つからないため。

私の環境では”/opt/local/bin/glibtoolize”にMacPortsで入れていたのでlibtoolizeの代わりにglibtoolizeを使うよう以下のように変更した。

#! /bin/sh

set -x
aclocal
autoheader
autoconf
# libtoolizeをglibtoolizeに変更
glibtoolize
automake --foreign --add-missing --copy

この変更を行えばlibsyck.aの生成まで以下のコマンドで行えます。

$ cd 解凍後のディレクトリへのパス
$ ./bootstrap
$ ./configure
$ make

その後、./ext/cocoaにあるYAML.xcodeprojの変更を行う。 修正箇所は3カ所。

  1. “YAML_Prefix.pch”をResourcesフォルダーにコピーしないようにする

おそらく何らかの操作ミスで、コピーする項目に入ってしまったのだろう。以下の図の様にコピー対象から外す。

../../../_images/yaml-PCH-before.tiff

外すとこうなります。

../../../_images/yaml-PCH-after.tiff
  1. Info.plsitの”Bundle ID”を修正する。

“Bundle ID”がプロジェクト作成時の初期設定のままの”com.apple.yourcocoaframework”なので変更する。 ここで、IDは制作者に敬意を払い、”net.thimbleby.will.yaml.in.cocoa”とする。

元の設定が以下のようになっているのを

../../../_images/yaml-InfoPlist-before.tiff

この様に変更する。

../../../_images/yaml-InfoPlist-after.tiff
  1. GSNSDataExtensions.mで配列の容量が足らない気がするので追加

これは非常に簡単。

file:ext/cocoa/src/Base64 NSData code/GSNSDataExtensions.m
line:200

の配列outbufの長さをを3から4に変えただけ。

unsigned char         inbuf [4], outbuf [3];

unsigned char         inbuf [4], outbuf [4];

に変えた。

アドレスを他にも、32bitから64bitへ移行したので、NSLogやprintfの%dを%ldに変える必要があるらしいが、詳しい事が判らないのでパス。

最後にビルドする。ここではDeploymentビルドを手軽にコピーしたいのでxcodebuild経由でビルドしています。

$ xcodebuild -configuration Deployment -sdk macosx10.8

これで”ext/cocoa/build/Deployment”にYAML.frameworkが出来ます。

../../../_images/yaml-framework.tiff

参考文献

Cocoa Wapperを書いた人のサイト http://will.thimbleby.net/yaml-in-cocoa/

多分Syckの公式サイト https://github.com/indeyets/syck