2007-10-21

Tcl 拡張パッケージのクロスコンパイル

SourceForge.net Logo
案だった、Tcl の拡張パッケージのクロスコンパイルに成功しました。この週末に試行錯誤を重ねましたが、結局 configure スクリプトで生成した Makefile の内容の一部を perl で置換するという妥協的な方法に落ち着きました。

例として、Thread パッケージをビルドするスクリプトを紹介します。

#!/bin/sh

export INSTDIR=${HOME}/mingw/build

# constants
export ver_tcltk="8.5b1"
export ver_major="85"
export ver_major2="8.5"
export ver_thread="2.6.5"

export prefix_tcltk=""

export target=i386-mingw32
export CC=${target}-gcc
export AR=${target}-ar
export LD=${target}-ld
export RANLIB=${target}-ranlib
export RC=${target}-windres

# remove old sources
echo "### Removing old sources & binaries"
rm -fR thread${ver_thread}

# extract sources
echo "### Expanding sources to build"
tar zxvf thread${ver_thread}.tar.gz

# build Thread extension
echo "### build Thread Extension"
export PATH=/usr/local/${target}/bin:$PATH

cd thread${ver_thread}
./configure --prefix=${prefix_tcltk} --host=${target} \
--enable-threads --with-tcl=../tcl${ver_tcltk}/win
perl -i.bak -p -e 's/Unix/Win/g;' Makefile
perl -i.bak -p -e 's/unix/win/g;' Makefile
perl -i.bak -p -e 's/\-fPIC//ig;' Makefile
perl -i.bak -p -e 's/libthread2\.6\.5\.so/thread265\.dll/g;' Makefile
perl -i.bak -p -e 's/libthreadstub2\.6\.5\.a/libthreadstub265\.a/g;' Makefile
perl -i.bak -p -e 's/^DEFS\t\t=/DEFS\t\t= \-DBUILD_thread=1/g;' Makefile
make
perl -i.bak -p -e 's/libthread2\.6\.5\.so/thread265\.dll/g;' pkgIndex.tcl
make DESTDIR=${INSTDIR}/thread${ver_thread} install
cd ..

# remove man directory
rm -fR ${INSTDIR}/thread${ver_thread}/man

今回わかったことは、WINE をインストールしていると configure スクリプトは、クロスコンパイルだと認識してくれないということです。これは configure スクリプトが、小さなプログラムをコンパイルして、それを実行できなければクロスコンパイルだと判定するのですが、WINE がインストールされていると実行できてしまうため、いくら --host--build オプションで指定してもクロスコンパイルだとは判定されないのです。

しかしながら、configure スクリプトがクロスコンパイルだと判定したところで、大したことはしてくれません。CC などで i386-mingw32-gcc を前もって指定しなくとも、gcc などに --host で指定した名前をプレフィックスとして付加してくれるぐらいです。これも ar などに付けてくれないなど抜けが出ます。変更しなければならないMakefile の内容はそれほど多くはないので、perl で置換することにしました。なお pkgIndex.tcl に記述されているパッケージ名の修正も必要です。

10 月 26 日に、Tcl/Tk 8.5b2 がリリースされる予定なので、今度の週末にでも拡張パッケージを加えたクロスコンパイル版 Tcl/Tk 8.5b2 を公開しようと思います。

4 件のコメント:

匿名 さんのコメント...

オー、オー。(声援と感嘆をもって)
おめでとうございます。 ご苦労様でした。 本当に大変でしたね。

このへんの情報が皆無に等しいので、貴重な情報です。 情報公開に感謝します。 チャンスがありましたら、まとめた形の情報公開も、ぜひお願いします。 

一時はどうなるかと思いました。(bitWalkさんにできないことが、俺にできるかああああ、、などと開き直りつつありましたが)、、、

まずは、お祝いまで。

bitWalk さんのコメント...

koji さん、いつもコメントをありがとうございます。

結局、泥臭いやり方になってしまいました。もっとスマートな方法がないか改善は続けます。

なお、試行錯誤した情報は、英文になりますが、いずれ MinGW Cross Compiler のプロジェクトサイトにまとめて掲載しようと考えています。

匿名 さんのコメント...

bitwalkさん>> いずれ MinGW Cross Compiler のプロジェクトサイトにまとめて掲載しようと考えています。

それは、好いですね。 

できた段階でTcl拡張パッケージ作成者に「お知らせメール」すると、それを機会に作成者がクロスコンパイルまで考慮するようになる、、とか。 そうすると、将来、皆さん幸せになれるかも、、とか。

そういえば、Tcl/TkのWikiだったかで、「クロスコンパイルについて書いてくださる方を求む。」などとあったような記憶が。 そちらにもお知らせメールすると、よいかもしれませんね。

仕事を増やすようなコメントになってしまいました。 

bitWalk さんのコメント...

Tcl には TEA (Tcl Extension Architecture) という規格みたいなものが定められていて、Tcl の拡張パッケージは TEA に沿って、configure や Makefile を生成するよう推奨されています。

http://www.tcl.tk/doc/tea/

主要な Tcl の拡張パッケージは、この TEA に準拠しています。ですから、TEA がクロスコンパイルをもっと意識した仕様になればいいわけですね。しかし、需要を考えると、そんなに力を入れる必要があるかは疑問です。まあ、時間をかけて働きかけることにしましょう。

ちなみに、The Tcler's Wiki には次のようなクロスコンパイルに関連した項目があります。

http://wiki.tcl.tk/3102

クロスコンパイルの実績を積んだら、このページに書き込んでみましょうか。