Starbug1をSnowLeopardにインストール
id:smegheadさんが開発されているBTS、Starbug1をMacOSX(Snow Leopard)にインストールしてみました。
バージョンは1.3.13です。
- 追記(2010-06-17): バージョン1.3.14ではビルドの問題は解消されています。
準備
事前に必要なモジュールはインストール済みです。
$ port installed wget gettext libiconv The following ports are currently installed: gettext @0.17_4 (active) libiconv @1.13_0 (active) wget @1.12_0 (active) $
また、ライブラリ関連のシンボリックリンクを作成しておきます。
$ ln -s /opt/local/include ~/usr/include # /Users/argius/usr/include $ ln -s /opt/local/lib ~/usr/lib # /Users/argius/usr/lib
追記: Xcodeはインストール済みです。以下の記事を参照してください。
ビルド
staticビルドを採用します。
前提として、makeはすべてgnumakeに変更して行います。
ビルドでは2箇所ほど変更を加えました。これは、環境設定によって異なる場合がありますが、私の環境はほぼデフォルトなので、その場合の注意点です。
変更箇所は、最後にパッチとしてまとめて掲載します。
まずコンパイルエラーが出ました。
$ gnumake INITIAL_LOCALE=ja_JP static webapp (中略) gcc -m32 -I/Users/argius/usr/include -I/usr/include -I/usr/local/include -I. -Idist/cgic205 -Idist/sqlite-3.6.23 -DVERSION=\"1.3.13\" -DCOPYRIGHT=\"Copyright\ smeghead\ 2007\ -\ 2010\" -DINITIAL_LOCALE=\"ja_JP\" -O3 -Wall -c -o hook.o hook.c In file included from hook.c:12: data.h:18: error: expected identifier before numeric constant data.h:20: error: two or more data types in declaration specifiers data.h:20: warning: useless storage class specifier in empty declaration hook.c: In function ‘create_hook_project’: hook.c:109: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘long unsigned int’ gnumake[1]: *** [hook.o] Error 1 gnumake: *** [static] Error 2 $
warningは放っておいて、errorの箇所です。
"data.h:20: error: two or more data types in declaration specifiers"の箇所は、データ型の多重定義ですね。bool型をenumで定義しています。C言語自体不慣れなので詳しくは分かりませんが、既に他のヘッダファイルでboolが定義されているのでしょう。これは条件コンパイルで回避しました。
もう一度makeを実行すると、次は、リンカのエラーです。
gcc -o index.cgi list.o simple_string.o data.o dbutil.o db_project.o db_top.o hook.o alloc.o conv.o util.o wiki.o csv.o index_project.o index_top.o index.o -m32 -L/Users/argius/usr/lib -L/usr/lib -L/usr/local/lib dist/cgic205/cgic.o dist/sqlite-3.6.23/sqlite3.o -lintl -liconv ld: warning: in /Users/argius/usr/lib/libintl.dylib, file is not of required architecture ld: warning: in /Users/argius/usr/lib/libiconv.dylib, file is not of required architecture Undefined symbols: "_libintl_gettext", referenced from: _create_project_tables in dbutil.o (後略)
"file is not of required architecture"は以前もどこかで見ましたね。gccのデフォルト?はi386なのに対して、MacPortsでインストールしたものはデフォルトではx86_64でビルドしているようなので、libintlとlibiconvがx86_64なのに本体はi386でビルドしているところに問題があるようです。
libintlとlibiconvをi386でビルドしたものを使うか、それ以外をx86_64でビルドするかすれば解決しそうです。私は後者を選択しました。本体およびcgicとsqlite3のビルド時に"-arch x86_64"をつけます。
これでビルドは成功しました。
セットアップ
ビルドされたdist/starbug1をWeb用ディレクトリ(/opt/local/www/data)に移動し、所有者を変更します。デフォルトの.htaccessを有効にします。
$ mv -i dist/starbug1 /opt/local/www/data $ cd /opt/local/www/data/ $ chown -R www starbug1 $ cp -ip starbug1/dot.htaccess .htaccess
httpd.confに以下の記述を追加しました。
※適当に書いたので、.htaccessを有効にするために"AllowOverride All"が必須なところ以外は調整して下さい。
<Directory /opt/local/www/data/starbug1> SSLRequireSSL Order allow,deny Allow from all AllowOverride All DirectoryIndex index.cgi AddType text/css .css </Directory> Alias /starbug1 /opt/local/www/data/starbug1
これでインストール完了。上手く動作しているようです。
パッチ
MacOSX Snow Leopard専用の暫定パッチです。汎用にするには、Makefileの後半が面倒な気がします。
$ diff -u Makefile{.orig,} --- Makefile.orig 2010-05-29 22:22:25.000000000 +0900 +++ Makefile 2010-06-05 00:27:14.000000000 +0900 @@ -30,6 +30,10 @@ ifneq ($(OS), Linux) LFLAGS += -lintl -liconv endif +ifeq ($(OS), Darwin) + CFLAGS += -arch x86_64 + LFLAGS += -arch x86_64 +endif export INITIAL_LOCALE #debug @@ -164,12 +168,12 @@ wget http://www.boutell.com/cgic/cgic205.tar.gz && \ tar zxf cgic205.tar.gz && \ cd cgic205 && \ - make CFLAGS=-m32 LFLAGS=-m32 cgic.o && \ + gnumake CFLAGS="-m32 -arch x86_64" LFLAGS="-m32 -arch x86_64" cgic.o && \ cd - && \ wget http://www.sqlite.org/sqlite-amalgamation-3.6.23.tar.gz && \ tar zxf sqlite-amalgamation-3.6.23.tar.gz && \ cd sqlite-3.6.23 && \ ./configure && \ - make CFLAGS=-m32 LFLAGS=-m32 sqlite3.o + gnumake CFLAGS="-m32 -arch x86_64" LFLAGS="-m32 -arch x86_64" sqlite3.o $ diff -u data.h{.bak,} --- data.h.orig 2010-02-25 00:09:24.000000000 +0900 +++ data.h 2010-06-04 23:23:04.000000000 +0900 @@ -14,10 +14,12 @@ #define LIST_COUNT_PER_LIST_PAGE 15 #define LIST_COUNT_PER_SEARCH_PAGE 30 +#ifndef bool typedef enum _bool { false = 0, true } bool; +#endif typedef struct { int id;