PostgreSQL Client Library (libpq) for iPhone/iPad

iPhone/iPadアプリでPostgreSQLサーバに接続するためにライブラリをビルドしたときのメモです。開発環境はXcode 3.2.3 and iOS SDK 4.0.1を使用しています。とにかくライブラリを使いたいだけという人はここからダウンロードしてください。

libpqソースコードのダウンロード

libpqPostgreSQL本体のソースコードに含まれていて、2010/8/6現在のバージョンは8.4.4です。postgresql-8.4.4.tar.bz2からダウンロードして解凍しておきます。

libpqのビルド

libpqは以下のようにconfigureからダイレクトにarm用にmakeすることも可能ですが、ここではXcodeのプロジェクトを作成してビルドすることにします。

#!/bin/bash

DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
SDKROOT=$DEVROOT/SDKs/iPhoneOS3.2.sdk
PATH=$DEVROOT/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
DARWIN=arm-apple-darwin10
ARCH="-arch armv6 -arch armv7"
./configure --host=arm-apple-darwin --without-readline --disable-ipv6 CC=$DEVROOT/usr/bin/gcc-4.2 \
CPPFLAGS="-I$SDKROOT/usr/lib/gcc/$DARWIN/4.2.1/include/ -I$SDKROOT/usr/include/" \
CFLAGS="$CPPFLAGS $ARCH -pipe -no-cpp-precomp -isysroot $SDKROOT" CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" \
LD=$DEVROOT/usr/bin/ld && make -C src/interfaces/libpq

ライブラリに必要なファイルの一覧を得るためにosx用にビルドします。ターミナルを起動し、postgresql-8.4.4フォルダに移動して以下のコマンドを実行します。

./configure
make -C src/interfaces/libpq
ar -t src/interfaces/libpq/libpq.a

この結果、必要なファイルは以下のものであることがわかります。

fe-auth.o  fe-connect.o  fe-exec.o  fe-misc.o  fe-print.o  fe-lobj.o  fe-protocol2.o
fe-protocol3.o  pqexpbuffer.o  pqsignal.o  fe-secure.o  libpq-events.o  md5.o  ip.o
wchar.o  encnames.o  noblock.o  pgstrcasecmp.o  thread.o
Xcodeプロジェクトの作成

Xcodeを起動し、新規プロジェクトを作成します。テンプレートはiPhone OSのLibraryから"Cocoa Touch Static Library"を選び、「選択...」ボタンをクリックして"pq"という名前を付けて適当な場所に保存します。この時できたpqフォルダ配下にpostgresql-8.4.4フォルダを入れておきます(別にどこにあってもよいのですが、相対パスで指定しておいてまとめて移動可能にするためです)。
以下はフォルダ名とその中にあるファイルのリストです。すべてプロジェクトに追加してください。

postgresql-8.4.4/src/interfaces/libpq
fe-auth.c  fe-connect.c  fe-exec.c  fe-misc.c  fe-print.c  fe-lobj.c  fe-protocol2.c
fe-protocol3.c  pqexpbuffer.c  pqsignal.c  fe-secure.c  libpq-events.c
postgresql-8.4.4/src/backend/libpq
md5.c  ip.c
postgresql-8.4.4/src/backend/utils/mb
wchar.c  encnames.c
postgresql-8.4.4/src/port
noblock.c  pgstrcasecmp.c  thread.c

プロジェクトメニューから「プロジェクト設定を編集」を選び、ビルドタブで「ユーザヘッダ検索パス」に以下のパスを追加し、「再帰的」にチェックを入れておきます。

$(SRCROOT)/postgresql-8.4.4/src/

pq_Prefix.pchに以下の1行を追加します。

#define FRONTEND 1

もちろんプロジェクト設定の「その他のCフラグ(OTHER_CFLAGS)」に"-DFRONTEND=1"を指定してもかまいません。ここまででライブラリがビルド可能になっているはずです。

ユニバーサルバイナリの作成

構成をReleaseにしてDeviceとSimulatorの両方でビルドした後、pqプロジェクトフォルダ内でターミナルから以下のコマンドを実行してユニバーサルバイナリを作成します。

lipo -create build/Release-iphone*/libpq.a -output libpq.a

ビルドフェーズとしてスクリプトの実行を追加してもよいでしょう。このプロジェクト自体を使用するアプリケーションのプロジェクトに登録して依存関係を設定する場合は、自動的に必要なバイナリがビルド/リンクされるので気にしなくてもかまいません。
このライブラリを使う場合に使用するヘッダは以下の2つです。

postgresql-8.4.4/src/interfaces/libpq/libpq-fe.h
postgresql-8.4.4/src/include/postgres_ext.h
●プロジェクトのダウンロード

以下の場所に設定済みプロジェクトを置いてあります。
http://www1.axfc.net/uploader/Si/so/81229.zip&key=libpq