-->
ラベル crossdev の投稿を表示しています。 すべての投稿を表示
ラベル crossdev の投稿を表示しています。 すべての投稿を表示

2011-06-30

クロスコンパイル

http://www.gentoo.org/proj/en/base/embedded/cross-development.xml

参考URLの内容でコンパイルできた。大体下記のような作業を行った。
crossdevをインストールする。distcc用の作業を1回以上行っていると必要なファイルが作成されているかもしれない。
/usr/powerpc-unknown-linux-gnu/etc/make.profileにリンクを貼る。
/usr/powerpc-unknown-linux-gnu/etc/portage/make.conf の CFLAGS に "-mcpu=603e -Os" を追加。
xmergeのスクリプトファイルをコピーして実行する。

sl, lv などを -B などでコンパイルして -K などでインストールする。
バージョンを指定しないとテスト版を作成している場合あり。(make.conf の ACCEPT_KEYWORDS="ppc ~ppc")
### 作成サーバー。
$ sudo sh ~/bin/xemerge --oneshot -avt -B net-misc/telnet-bsd
### インストールサーバー。
$ sudo emerge --oneshot -avt -K net-misc/telnet-bsd

/usr/portage/packagesはnfsなどでファイルを読める状態にする。もしくはファイルをコピーする。
$ mount|grep /usr/portage/packages
192.168.0.100:/usr/powerpc-unknown-linux-gnu/packages on /usr/portage/packages type nfs4 (rw,addr=192.168.0.100,clientaddr=192.168.0.150)

一部無理だった。
eix (cross comple error)
munin (/usr/lib => /usr/lib64)

作れないのがあるようなので、依存パッケージやバージョンも含めて手動で作成であれば使えそう。
作成できないだけなら良いが、間違った状態で作成に成功する場合があるので試しに使うだけにする。
なにか設定がさらに必要かもしれない。

2011-05-20

distccの設定

(1) distccクライアントで binutils, gcc, linux-headers, glibc を入っているバージョンに、手動でマスクします。
$ tail -n4 /etc/portage/package.mask
>sys-devel/binutils-2.20.1-r1
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.11.3
$ grep CHOST /etc/make.conf
CHOST="powerpc-unknown-linux-gnu"

(2) distccサーバーで同じバージョンをインストールします。
$ sudo USE="-gtk -multilib -openmp -mudflap -nptl" crossdev -t powerpc-unknown-linux-gnu --binutils 2.20.1-r1 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.11.3

(3) 確認します。
distccサーバーの/etc/conf.d/distccdにログファイルを設定します。
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug --log-file /var/tmp/distcc.log" など
distccを再起動してログを閲覧します。distccクライアントでemergeを実行します。成功の場合ログが表示されます。
$ tail -f /var/tmp/distcc.log|grep -iP "time:.*ms"
distccd[29406] (dcc_job_summary) client: 192.168.0.150:50257 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:9627ms powerpc-unknown-linux-gnu-gcc builtin/merge.c
...

crossdevの-tはdistccクライアントのCHOSTです。
distccクライアントのCFLAGSには-march=nativeを使えません。
上記は違うCPU用の設定です。



以下はメモです。

### distccホスト。
distccクライアントに合わせて作成します。
$ sudo USE="-gtk -multilib -openmp -mudflap -nptl" crossdev -t powerpc-unknown-linux-gnu --binutils 2.18-r3 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.10.1-r1
確認します。
$ emerge -pv cross-powerpc-unknown-linux-gnu/binutils cross-powerpc-unknown-linux-gnu/gcc cross-powerpc-unknown-linux-gnu/linux-headers cross-powerpc-unknown-linux-gnu/glibc
$ tail -n4 /etc/portage/package.mask

### distccクライアント。
確認します。
$ emerge -pv binutils gcc linux-headers glibc

失敗しないようにマスクします。
$ cat /etc/portage/package.mask|tail -n5
>=sys-fs/udev-146
>sys-devel/binutils-2.18-r3
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.10.1-r1

pump用の設定をします。
$ cat /etc/distcc/hosts
192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo

様子を表示します。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep 192.168.0.100

パッケージをアップデートします。
$ sudo pump emerge --update --deep --newuse --verbose --tree --with-bdeps=y --jobs=10 --load-average=20 --keep-going world 1>/var/tmp/scriptlog/emerge_`date +%Y-%m-%d_%H-%M-%S`.log 2>&1 &

この場合ロードアベレージが20以下の場合、同時に10個までインストールの動作をします。
コンパイルに失敗しても、できるだけ進みます。

pump emergeの出力を見ます。
$ tail -f /var/tmp/scriptlog/emerge_2011-05-17_00-23-39.log

成功している場合distccmon-textでファイル名が表示されます。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep 192.168.0.100
 20970  Preprocess  huffman.c                                 192.168.0.100[2]
 20970  Preprocess  huffman.c                                 192.168.0.100[2]
 20970  Preprocess  huffman.c                                 192.168.0.100[2]
 21492  Preprocess  crctable.c                                192.168.0.100[1]
 21492  Preprocess  crctable.c                                192.168.0.100[1]
 21492  Preprocess  crctable.c                                192.168.0.100[1]
...

distccホストで確認します。
$ sudo tcpdump port 3632
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 68 bytes
01:07:34.635882 IP 192.168.0.150.34107 > amdgentoo.distcc: S 1412879801:1412879801(0) win 5840 <mss 1460,[|tcp]>
01:07:34.635929 IP amdgentoo.distcc > 192.168.0.150.34107: S 2709116734:2709116734(0) ack 1412879802 win 5792 <mss 1460,[|tcp]>
01:07:34.636101 IP 192.168.0.150.34107 > amdgentoo.distcc: . ack 1 win 6 <nop,nop,timestamp[|tcp]>
01:07:34.861439 IP 192.168.0.150.34107 > amdgentoo.distcc: P 1:263(262) ack 1 win 6 <nop,nop,timestamp[|tcp]>
...

distccホストでログを取ります。修正後、再起動します。
$ rcsdiff distccd,v /etc/conf.d/distccd
===================================================================
RCS file: distccd,v
retrieving revision 1.4
diff -r1.4 /etc/conf.d/distccd
24,25c24,25
< DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
< #DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug --log-file /tmp/distcc.log"
---
> #DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
> DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug --log-file /var/tmp/distcc.log"

ログを表示します。
$ tail -f /var/tmp/distcc.log|grep -iP "time:.*ms"
distccd[29406] (dcc_job_summary) client: 192.168.0.150:50257 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:9627ms powerpc-unknown-linux-gnu-gcc builtin/merge.c
distccd[25088] (dcc_job_summary) client: 192.168.0.150:50259 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:6624ms powerpc-unknown-linux-gnu-gcc builtin/merge-file.c
distccd[19439] (dcc_job_summary) client: 192.168.0.150:50260 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:6900ms powerpc-unknown-linux-gnu-gcc builtin/merge-index.c
...

### distccの再設定
gcc, linux-headers をそのままにした。他を更新。
distccクライアントでdistccを無効にしなくてもbinutils,glibcの更新はエラーにならなかった。

### distccクライアント
package.maskは手動で追加した。
$ tail -n4 /etc/portage/package.mask
>sys-devel/binutils-2.20.1-r1
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.11.3

入ったバージョンの確認。
$ eix -c "^(binutils|gcc|linux-headers|glibc)$"
[I] sys-devel/binutils (2.20.1-r1@2011年05月19日): Tools necessary to build programs
[I] sys-devel/gcc (4.3.4(4.3)@2011年05月18日): The GNU Compiler Collection
[I] sys-kernel/linux-headers (2.6.27-r2@2010年01月14日): Linux system headers
[I] sys-libs/glibc (2.11.3(2.2)@2011年05月20日): GNU libc6 (also called glibc2) C library
Found 4 matches.

### distccサーバー
CHOSTとそれぞれのバージョンを合わせてcrossdevを実行する。
$ sudo USE="-gtk -multilib -openmp -mudflap -nptl" crossdev -t powerpc-unknown-linux-gnu --binutils 2.20.1-r1 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.11.3

入ったバージョンの確認。
$ eix -C cross-powerpc-unknown-linux-gnu -cI
[I] cross-powerpc-unknown-linux-gnu/binutils [1] (2.20.1-r1(powerpc-unknown-linux-gnu)@2011年05月20日): Tools necessary to build programs
[I] cross-powerpc-unknown-linux-gnu/gcc [1] (4.3.4(powerpc-unknown-linux-gnu-4.3)@2011年05月16日): The GNU Compiler Collection
[I] cross-powerpc-unknown-linux-gnu/glibc [1] (2.11.3(powerpc-unknown-linux-gnu-2.2)@2011年05月20日): GNU libc6 (also called glibc2) C library
[I] cross-powerpc-unknown-linux-gnu/linux-headers [1] (2.6.27-r2(powerpc-unknown-linux-gnu)@2011年05月16日): Linux system headers
...

自動で追加される。
$ grep cross-powerpc-unknown-linux-gnu /etc/portage/package.mask
>cross-powerpc-unknown-linux-gnu/binutils-2.20.1-r1
>cross-powerpc-unknown-linux-gnu/gcc-4.3.4
>cross-powerpc-unknown-linux-gnu/linux-headers-2.6.27-r2
>cross-powerpc-unknown-linux-gnu/glibc-2.11.3