naoya_t:MacOSX:Gauche.frameworkを作ろう
いまのGaucheだと
% ./configure --enable-framework % make framework
で Gauche.framework が出来ます。
framework.sh にあるとおり、こうして出来る Gauche.framework はアプリケーションバンドル(OS Xのアプリケーション形式、ほげほげ.app みたいなやつ)内にただコピーするだけで、プライベートフレームワークとして利用できます。Gaucheがインストールされていないマシンにもアプリケーションバンドルを単純にコピーできるのが利点です。(共有フレームワークは Gauche ではサポートの予定がないようです)
但し、こうして出来るのはビルドした環境用のライブラリのみです。
以下、OSX 10.4以降 Intel/PowerPC 両環境で動くフレームワークを作ってみるメモ。もっと簡単かつ確実な方法がありましたら教えてください。
◎svn trunk(svn co https://gauche.svn.sourceforge.net/svnroot/gauche/Gauche/trunk で貰えます。最初に ./DIST gen する必要があります)なのでgcが(6.8でなく)7.1です。
1. libgauche.dylib (Intel用)
% CFLAGS="-arch i386" ./configure --host=i386-apple-darwin8 --enable-framework
Makefileの書き換え
configure時にCFLAGSで渡りそうなものなのだけれどうまくいかないので手動で書き換え。
対象はとりあえず
- src/Makefile
- CFLAGS
- libgauche_LDFLAGS
- gc/Makefile
- CFLAGS
- CCASFLAGS
- ext/Makefile.ext
- CFLAGS
- gc/libatomic_ops/Makefile
- CFLAGS
- gc/libatomic_ops/src/Makefile
- CFLAGS
- gc/libatomic_ops/src/atomic_ops/Makefile
- CFLAGS
- gc/libatomic_ops/src/atomic_ops/sysdeps/Makefile
- CFLAGS
- gc/libatomic_ops/doc/Makefile
- CFLAGS
- gc/libatomic_ops/tests/Makefile
- CFLAGS
"-arch i386" ないし "-arch ppc" の直後に -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 を挿入。
(注: dylib1.10.5 とか crt1.10.5 をシンボリックリンクで作るやり方は、ビルドは通るが特定のOSバージョンで動作しない場合があることが判明。-mmacosx-version-min=10.4 を全てのコンパイルの際に追加することでこれらが不要になる(-isysroot /Developer/SDKs/MacOSX10.4u.sdkだけでは足りない - 2008/07/29 20:46:03 PDT naoya_t)
その他
DEFS = ....
の中から -DHAS_X88_THREAD_STATE32___EAX=0 を抜く。 これは gc/include/private/gc_priv.h にある THREAD_FLD の定義で、構造体メンバ名の先頭に __ を付けたり付けなかったりするフラグ。ifdef で見てるので ..=0 じゃダメ
ビルド
% make framework
Gauche.framework が出来る。Gauche.framework.intel などにリネームしておく。
2. libgauche.dylib (PowerPC用)
% CFLAGS="-arch ppc" ./configure --host=powerpc-apple-darwin8 --enable-framework % make clean
Makefileの書き換え
Intel用と同様。
ソースの書き換え
DEFS = ....
の中から -DHAS_PPC_THREAD_STATE___R0=1 を抜く。 これは gc/include/private/gc_priv.h にある THREAD_FLD の定義で、構造体メンバ名の先頭に __ を付けたり付けなかったりするフラグ。ifdef で見てるので ..=0 じゃダメ
ビルド
% make framework
Gauche.framework が出来る。
3. libgauche.dylibの統合 - Universal binary化
// koguroさんに教えてもらいました。どうもありがとうございます。→ http://macwiki.sourceforge.jp/wiki/index.php/UniversalBinary
% cd Gauche.framework/Versions/Current/lib % mv libgauche.dylib libgauche.dylib.powerpc % cp ../../../../Gauche.framework.intel/Versions/Current/lib/libgauche.dylib libgauche.dylib.intel % lipo -create libgauche.dylib.intel libgauche.dylib.powerpc -output libgauche.dylib % rm libgauche.dylib.intel libgauche.dylib.powerpc
Gauche.framework/libgauche.dylib は Versions/Current/lib/libgauche.dylib へのシンボリックリンクなので何もしなくてよい
あと
% cp -R ../../../../Gauche.framework.intel/Versions/Current/lib/gauche/0.8.13/i386-apple-darwin8 ./gauche/0.8.13/ % cd ../bin % for f in gosh gauche-config % do % mv $f $f.orig % lipo -create ../lib/gauche/0.8.13/i386-apple-darwin8/$f ../lib/gauche/0.8.13/powerpc-apple-darwin8/$f -output ./$f % done
4. gauche/config.scm の変更
- Gauche.framework/Versions/Current/share/gauche/0.8.13/lib/gauche/config.scm
*configurations* の設定を (gauche-architecture) を利用して環境に応じたものに動的に設定
DO NOT EDITって書いてあるけどとりあえず気にせずに・・・
変更箇所は (define *configurations* ...) の部分。quote を quasiquote に変えました。
;; Generated by genconfig. DO NOT EDIT
(define-module gauche.config
(use gauche.process)
(use file.util)
(use srfi-13)
(export gauche-config))
(select-module gauche.config)
(define (gauche-config param)
(cond ((assoc param *configurations*) => cadr)
(else (error "unknown configuration parameter name" param))))
(define *configurations*
(let* ((arch-triplet (gauche-architecture)) ;; {i386|powerpc}-apple-darwin8
(arch (if (eq? #\i (string-ref arch-triplet 0)) "i386" "ppc")))
(quasiquote
(("-V" "0.8.13")
("-I" "-I@/lib/gauche/0.8.13/include")
("-L" ,#`"-L@/lib/gauche/0.8.13/,|arch-triplet| ")
("--ac" "@/share/gauche/0.8.13/")
("-l" "-lgauche -lm -lpthread")
("--cc" "gcc -std=gnu99")
("--reconfigure" ,#`"./configure '--enable-framework' '--host=,|arch-triplet|' 'host_alias=,|arch-triplet|' 'CFLAGS=-arch ,|arch|' '--enable-multibyte=utf-8'")
("--prefix" "@")
("--sysincdir" "@/lib/gauche/0.8.13/include")
("--siteincdir" "@/lib/gauche/site/include")
("--pkgincdir" "${libdir}/gauche/site/include")
("--syslibdir" "@/share/gauche/0.8.13/lib")
("--sitelibdir" "@/share/gauche/site/lib")
("--pkglibdir" "${datadir}/gauche/site/lib")
("--sysarchdir" ,#`"@/lib/gauche/0.8.13/,|arch-triplet|")
("--sitearchdir" ,#`"@/lib/gauche/site/0.8.13/,|arch-triplet|")
("--pkgarchdir" ,#`"${libdir}/gauche/site/0.8.13/,|arch-triplet|")
("--mandir" "@/share/man")
("--infodir" "@/share/info")
("--arch" ,arch)
("--local-incdir" "")
("--local-libdir" "")
("--default-cflags" ,#`"-arch ,|arch|")
("--object-suffix" "o")
("--executable-suffix" "")
("--rpath-flag" "")
("--so-suffix" "so")
("--so-cflags" "-no-cpp-precomp -fPIC -fno-common")
("--so-ldflags" "-bundle -flat_namespace -undefined suppress -o")
("--so-libs" "")
("--dylib-suffix" "dylib")
("--dylib-ldflags" "-framework CoreFoundation -dynamiclib -o")
("--libgauche-so" "libgauche.dylib")
))))
(provide "gauche/config")
自分でビルドするのが面倒くさいひとは
- 拙作Quicksilverプラグインに入ってるやつを使うとよいです。無保証です。