スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GNUstepのWindowsバイナリをMacからクロスコンパイル

幾度とない失敗を乗り越え、ようやく成功した。

必要な物

  • GNUstep
    svnで取得する。ビルドしたのはr29897。
  • クロスコンパイラ(i386-mingw32-*)
    MacPortsで取得する。
  • GNUstepが依存するライブラリ(バージョンはビルドに使ったもの)
    • pthread-win32 2.8.0 → gnustep-baseに必要。
    • libffi 3.0.8 → gnustep-baseに必要。ローカルにあった物を使ったけど、サイトを見るといつのまにか3.0.9が出ていた件。
    • libgpg-error 1.7 → libgcryptに必要。
    • libgcrypt 1.4.5 → gnutlsに必要。
    • libtasn1 2.4 → gnutlsとgnustep-baseに必要。
    • gnutls 2.8.5 → gnustep-baseに必要。
    • libxml2 2.7.6 → gnustep-baseに必要。
    • libjpeg 8a → gnustep-guiに必要。
    • libtiff 3.9.2 → gnustep-guiに必要。
    • zlib 1.2.3 → libpngに必要。
    • libpng 1.4.1 → gnustep-guiに必要。
    • sqlite3 3.6.23 → gworkspaceに必要。
    • gmpとかiconvとかopensslもあればいいのかもしれないけどよくわからん。
  • Wine
    楽をするために必要。

手順

まず、適当なディレクトリを作って生成物の保存先にする。以後、このディレクトリを$PREFIXで参照する。

$ PATH=$PREFIX/bin:$PATH
$ mkdir $PREFIX/include
$ mkdir $PREFIX/lib
$ mkdir $PREFIX/bin
GNUstepの依存先のビルド

次に、GNUstepが依存するライブラリをビルドする。基本的には

$ ./configure --host=i386-mingw32 --prefix=$PREFIX
$ make && make install

でいけるのだが、いくつか注意が必要なライブラリがある。

  • pthread-win32

    configureがついてこない。

    $ make CROSS=i386-mingw32- clean GC-inlined
    $ cp pthread.h sched.h semaphore.h $PREFIX/include
    $ cp libpthreadGC2.a $PREFIX/lib
    $ cp pthreadGC2.dll $PREFIX/bin
  • gnutls

    OSXに付属するsedは使えないのでGNU sedを使う。MacPortsでgsedをインストールして適当にリンクを貼る。

    $ ln -s `which gsed` sed
  • libxml2

    configureに--without-pythonを渡す。

  • zlib
    $ CC=i386-mingw32-gcc AR="i386-mingw32-ar rcus" ./configure --prefix=$PREFIX
    $ make && make install
  • libpng
    $ CPPFLAGS=-I$PREFIX/include LDFLAGS=-L$PREFIX/lib ./configure --host=i386-mingw32 --prefix=$PREFIX
    $ make && make install
GNUstepのビルド

(configureで“cannot run test program while cross compiling”とか言われたらconfigureのその部分を改竄してやりましょう)

いよいよGNUstepのビルドに移る。最初にgnustep-make(core/make)をビルドする。ファイルのレイアウトはFHSとする。

$ ./configure --prefix=$PREFIX --host=i386-mingw32 --with-config-file=$PREFIX/GNUstep.conf --with-layout=fhs
$ make && make install

次にgnustep-objc(dev-libs/libobjc)をビルドする。コンパイラ付属の物とどう違うのか、要調査。

$ make && make install

gnustep-base(core/base)をビルドする。これはCocoaでいうFoundationにあたる。configureでlibffiの場所を指定する。ffcallは知らん。

$ ./configure --host=i386-mingw32 --prefix=$PREFIX --enable-libffi --with-ffi-include=$PREFIX/lib/libffi-3.0.8/include
$ make shared=yes && make install

gnustep-gui(core/base)をビルドする。CocoaでいうAppKitにあたる。

$ ./configure --host=i386-mingw32 --prefix=$PREFIX
$ make shared=yes && make install

さて、gnustep-backなどのビルドの際には、plmergeやpl2linkというコマンドラインツールが必要になる。こいつらはgnustep-baseと一緒にビルドされるのだが、当然Windows用のバイナリが生成されるので利用できない。

OSX向けにGNUstepをビルドすればOSXでも実行可能なバイナリが生成されるのだろうが、ここではWineを使ってお茶を濁す。以下の内容をplmergeとかpl2linkという名前で保存し、実行可能にする。後でmake_servicesが必要になった場合にもこの手を使う。

#!/bin/bash
wine $0.exe $*

gnustep-backをビルドする。

$ ./configure --host=i386-mingw32 --prefix=$PREFIX --enable-server=win32 --enable-graphics=winlib --without-x
$ make shared=yes && make install

これでGNUstep本体のビルドは完了。

gworkspaceをビルドする時は、gworkspaceのconfigureにsqliteを指定する。

$ ./configure --host=i386-mingw32 --prefix=$PREFIX --with-sqlite-library=$PREFIX/lib --with-sqlite-include=$PREFIX/include
$ make && make install

その他のビルドは何も考えなくても

$ make && make install

でできる。

ビルド結果のファイル

$PREFIX/
+ bin/
  - GNUstepの実行ファイル
  - GNUstepのDLL
  - 依存ライブラリの実行ファイル
  - 依存ライブラリのDLL
- GNUstep.conf
+ include/
  + フレームワーク/
  - 依存ライブラリのヘッダ
+ lib/
  + GNUstep/
    + Applications/
      - アプリケーション.app
    + いろいろ/
  + pkgconfig/
  - 各種ライブラリ
+ share/
  + GNUstep/
    + Makefiles/
      - GNUstep Makeのもろもろのファイル
  + いろいろ/
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

tag : GNUstep

コメントの投稿

非公開コメント

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。