[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:45699] クロスコンパイル環境の構築について



はじめまして。山本と申します。


ここ数日程、sarge (i386) 上にクロスコンパイル環境の構築しようとして悩ん
でおります。
最終的にはできる限りのクロスコンパイル環境を構築したいのですが、
とりあえず現在自分が所有する powerpc 機用のバイナリパッケージを
i386 機で作ることを目標としております。
まず、「おちゅ〜しゃ」と言う、libglib2.0-dev、libgtk2.0-dev、gettext、
libxml2、libssl-dev
などに依存するアプリケーションを buildpackage することを第一目標としました。
これは i386 機、powerpc 機共にセルフコンパイルおよび buildpackage できて
います。
(~/ochusha/ochusha-0.5.8.2/debian に debian ディレクトリが有るものと仮定
させて下さい)

そのために、下記の apt-line を追加してbinutils-cross、gcc-boot-cross
(buildpackage
の時のみで、gcc-cross-3.3 のインストールと入れ換えに purge しました)、
glibc-cross、
gcc-cross-3.3のバイナリパッケージおよびソースからの buildpackage を試し
たのですが、
どちらの場合でも次のような現象に悩まされております。

クロスコンパイラの apt-line
deb http://debian.speedblue.org ./
deb-src http://debian.speedblue.org ./
(依存関係は sarge の公式パッケージのもので間に合っております。)

公式パッケージ
debhelper 4.2.32
dpkg-cross 1.24
dpkg-dev 1.10.28
など、sarge のもの。

dpkg-cross のインストールに伴って、/etc/dpkg-cross/cross-compile ファイルに
crossdir = /usr/powerpc の行を追加しております。

libgtk2.0-dev、gettext、libxml2、libssl-dev などに依存するパッケージは、
# dpkg-cross -apowerpc -b (powerpc 用パッケージ)
で、ダミーパッケージ、バーチャルパッケージ、および libc6、libc6-dev、
linux-kernel-headers
以外全て変換し、インストールしました。
(ダミーパッケージ、バーチャルパッケージ、および libc6、libc6-dev、linux-
kernel-headers は
すべてダミーパッケージを equivs で作り、依存関係を解消しております)

この状態で「おちゅ〜しゃ」を
~/ochusha/ochusha-0.5.8.2$ dpkg-buildpackage -apowerpc -rfakeroot
コマンドで buildpackage しようとすると、PATH_MAX の未定義エラーが出ました。
そこで、/usr/powerpc/include/linux/limits.h で定義されていることを確認し、
次のような、セルフコンパイル時にはエラーが出ないソースをクロスコンパイル
しました。

ソース名:PATH_MAX.c
#include <stdio.h>
#include <limits.h>
void main(void)
{
printf("PATH_MAX = %d\n", PATH_MAX);
printf("NAME_MAX = %d\n", NAME_MAX);
}

コマンド:$ /usr/powerpc/bin/powerpc-linux-gcc PATH_MAX.c -o PATH_MAX

このソースでも PATH_MAX の未定義エラーが出ましたので、<limits.h> を
<linux/limits.h>
に書き換えたところ、意図する通りのバイナリができることを確認しました。
ちなみに、クロスコンパイル時に使われる limits.h ヘッダファイルは
/usr/powerpc/include/linux/limits.h であることは確認しております。

ここで第一の質問ですが、セルフコンパイル時には #include <limits.h> でエ
ラーが出ないのに
クロスコンパイル時にはエラーが出るのでしょうか?
何か powerpc-linux-gcc のコンパイル時に include/linux ディレクトリを特別
に指定するような
ことが有るのでしょうか?

そこで、まず、/usr/powerpc/include/limits.h ヘッダファイルに
/usr/powerpc/include/linux/limits.h
ヘッダファイルをマージして「おちゅ〜しゃ」を buildpackage してみました
が、やはり PATH_MAX
の未定義エラーが出ました。
これは #ifndef および #endif を外したものもマージして試し、同じエラーが
出ることを確認しております。
また、デフォルトの設定で問題ないはずですが、一応、/etc/dpkg-cross/cross-
compile ファイルに
crossinc = /usr/powerpc/incrude の行を追加しても変化は有りませんでした。

ここで第二の質問ですが、$ /usr/powerpc/bin/powerpc-linux-gcc コマンドで
は /usr/powerpc/include
ディレクトリがインクルードされていたのに ~/ochusha/ochusha-0.5.8.2$
dpkg-buildpackage -apowerpc -rfakeroot
コマンドでは何故インクルードされていないのでしょうか?

次に、全く根本的な解決ではありませんが、確実にインクルードされるように
debian/rules ファイルに記述の有る、
~/ochusha/ochusha-0.5.8.2/oniguruma ディレクトリに limits.h ヘッダファイ
ルをコピーして、
PATH_MAX の未定義エラーを回避しました。
すると、今度は debian/rules ファイルで使用されるようになっている、
dh_shlibdeps コマンドが
以下のようなエラーを出しました。

dh_shlibdeps
dpkg: /usr/powerpc/lib/libochusha.so.0 not found.
dpkg: /usr/powerpc/lib/libmodifiedghttp.so.1 not found.
dpkg: /usr/powerpc/lib/libmodifiedgtk2.so.0 not found.
dpkg: /usr/powerpc/lib/libtsengine.so.0 not found.
dpkg-shlibdeps: failure: dpkg --search gave error exit status 1
dh_shlibdeps: command returned error code 256
make: *** [binary-arch] エラー 1

これは、本来 ~/ochusha/ochusha-0.5.8.2/lib/.libs ディレクトリ以下のファ
イルを読みに行くところが、
/usr/powerpc/lib 以下を読みに行って、エラーとなったものです。
これについては、dh_shlibdeps コマンドに
-l$(CURDIR)/debian/ochusha/usr/lib -Lochusha
オプションを付けることにより回避可能なことを教わりました。

ここで第三の質問ですが、これはクロスコンパイルの時には必ず書き換えないと
いけないものなのでしょうか?
つまり、dh_shlibdeps コマンド (debhelper パッケージ) は dpkg-cross パッ
ケージに対応してはいないのでしょうか?
もし、dh_shlibdeps コマンドにパッチするなどで回避可能でしたら、大変便利
かと存じます。

これらの回避方法で出来上がった「おちゅ〜しゃ」パッケージは powerpc 機上
で動いていますので、
/usr/powerpc/include/atk-1.0 ディレクトリ、/usr/powerpc/include/glib-2.0
ディレクトリ、
/usr/powerpc/include/libxml2 ディレクトリ、/usr/powerpc/include/gtk-2.0
ディレクトリ、
/usr/powerpc/include/openssl ディレクトリなどはインクルードされているも
のと思われ、
/usr/powerpc/include ディレクトリ、/usr/powerpc/include/linux ディレクト
リなどが
インクルードされないのが不思議でなりません。

/usr/bin/dh_shlibdeps や、dpkg-cross で置換された
/usr/bin/dpkg-buildpackage、
require される /usr/share/perl5/dpkg-cross.pl、それに
/usr/bin/dpkg-cross 自身が
perl プログラムであることは分かりましたが、perl は全く読めなくて難儀して
おります。


どうか宜しくお願い申し上げます。

----------
yama1066@xxxxxxxxxxxxxxx