naoya_t:MacOSX:Gauche.frameworkを作ろう

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で渡りそうなものなのだけれどうまくいかないので手動で書き換え。

対象はとりあえず

"-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 の変更

*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")

自分でビルドするのが面倒くさいひとは


Gauche.frameworkの使い方

naoya_t:MacOSX:Gauche.frameworkを使おう

More ...