argius note

プログラミング関連

Starbug1をSnowLeopardにインストール

id:smegheadさんが開発されているBTS、Starbug1MacOSX(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;