2016/07/09(Sat)CYGWIN x64にarm-none-linux-gnueabi-gccクロスコンパイラとdistcc 3.1で快適ビルド環境を用意する

はてブ数 2016/07/09 16:39 計算機な日記 つーさ

このサイト「つーさのくーかん」は、TS-219P+というQNAPというメーカのNASでホストしているのだが、
CPUがARM@1.6 GHz と非力なため、何かを更新するたびにソースをとってきてからのmakeがつらい。
そうだ、distccによる クロスコンパイル環境を復活させて、ソースのコンパイルをデスクトップPCでやろう。

arm-none-linux-gnueabi へのクロスコンパイラをCygwin64の上に用意する。

u-n, yokuwakaran!

export CC='ccache gcc'
export TARGET=arm-none-linux-gnueabi
export PREFIX=/opt/cross
export PATH=$PATH:$PREFIX/bin

tar xf binutils-2.19.1
mkdir build.binutils
cd    build.binutils
../binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX --disable-nls --disable-werror

make -j
make install

tar xf  gcc-4.2.3.tar.bz2
mkdir build.gcc
cd    build.gcc
mv /usr/bin/makeinfo{,x}
CFLAGS='-fgnu89-inline -O3' ../gcc-4.2.3/configure --target=$TARGET --prefix=$PREFIX \\
  --disable-nls --disable-shared --without-headers --enable-languages=c \\
  --disable-multilib --disable-libmudflap --disable-libssp -disable-libgomp

mv /usr/bin/makeinfo{x,}

make -j
make install

makeinfoのバージョン違いのせいで、docのビルドで止まるのでmakeが通らないので makeinfoを見えなくした。

適当に .c を作って arm-none-linux-gnueabi-gcc hoge.c すると、crti.o がないといわれる。
ターゲットにすでにある /opt/arm-none-linux-gnueabi/lib/ の辺から、$PREFIX/arm-none-linux-gnueabi/lib/ に持ってくる。

再度。
/opt/cross/arm-none-linux-gnueabi/lib/gcc/arm-none-linux-gnueabi/4.2.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lc

まぁ、完璧なクロス環境ではないけど、
arm-none-linux-gnueabi-gcc -c hoge.c はできるし、distccには困らないから放置しよう。

……*1


*1 : C++はコンパイルできんなぁ

distcc 3.1 を cygwin 64bit で make できない。

2.18のころはコケた記憶なかったけどなぁ。できるようにしよう。

config.guess に x64 の cygwin が登録されてないので --build=x86_64-pc-cygwin と直接指定。
exec.c のコンパイルが通らないので-DWIN32_LEAN_AND_MEAN

./configure --build=x86_64-pc-cygwin CFLAGS='-DWIN32_LEAN_AND_MEAN'

githubのmaster (3.2rc1)では直ってるが、
現時点で最新のリリースファイルの distcc 3.1 の時点では、
https://github.com/distcc/distcc/blob/master/popt/popthelp.c#L687
が、

685     if (str == NULL) {
686         memset(s, 0, sizeof(s));
687         str = s;
688     }

になっているので、なおすしてから、--disable-Werror で make 通る。

できた。

動かす

t8-cygwin$ distccd --listen 0.0.0.0 -a 172.16.0.0/12 --log-stderr --no-detach -j 16
target$ export DISTCC_HOSTS=t8
target$ export DISTCC_POTENTIAL_HOSTS=$DISTCC_HOSTS
target$ export CC='distcc arm-none-linux-gnueabi-gcc'
target$ ./configure
target$ make -j 16

うごいた。

apache 2.4.23 のビルドにかかる時間をはかってみた。

参考。どのくらいはやくなるのか?


NAS単体: CC=gcc time make -j

real 15m1.825s
user 13m22.810s
sys 0m35.320s

NAS+デスクトップCYGIWN: CC='distcc arm-none-linux-gnueabi-gcc' time make -j 20

real 3m23.911s
user 2m9.190s
sys 0m27.510s

さらにcchace: CC='ccache distcc arm-none-linux-gnueabi-gcc' time make -j 20

real 2m52.147s
user 1m43.560s
sys 0m26.040s

cchaceの代わりにpumpモード: CC='distcc arm-none-linux-gnueabi-gcc' time pump make -j 20

real 2m46.454s
user 0m55.390s
sys 0m13.400s

pump モードは、ヘッダがターゲットと同じ場所にないといけないので、
ln -s /opt /share/HDA_DATA/.qpkg/Optware して、
ここにターゲットの /opt/includeの中身を置いておく必要がある。

おわりに

クロス環境復活を思いたったはいいが、なんかぜんぜんうまくいかなくて、一週間もかかってしまった。
distccじゃない、普通のクロスコンパイル環境を目指した方が早かったかもしれない。
そもそもARMのNAS(で、サイトをホストするのを)やめればいいのでは

記事を書いたのでもう触らないぞ(


おわりのむこう (7月13日追記)

なんかもーちょっとな気がするんだよ。

ターゲットの /lib,/usr/lib,/opt/include,/opt/lib を cygwin側の /nasroot にコピーして、次のオプションで作り直す。

export SYSROOT=/nasroot

# bunutils
../binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT --with-lib-path=$PREFIX/lib --disable-nls --disable-werror
make -j
make install

# gcc
CFLAGS='-fgnu89-inline -O3' ../gcc-4.2.3/configure --target=$TARGET --prefix=$PREFIX \\
  --disable-nls --disable-shared --without-headers --with-sysroot=$SYSROOT --enable-languages=c,c++ \\
  --with-local-prefix=$SYSROOT/opt --with-native-system-header-dir=$SYSROOT/opt/include \\
  --disable-multilib --disable-libmudflap --disable-libssp -disable-libgomp --disable-libvtv
make -kj
make -k install

で強引に入れたところ、

/* a.c */
#include <stdio.h>
int main()
{
  printf("hello world!\\n");
  return 0;
}

arm-none-linux-gnueabi-gcc a.c -L /opt/lib -Xlinker -rpath-link -Xlinker /nasroot/lib -o a.linux.exe

で、 a.linux.exe ができて、scpでターゲットに持っていって

$ ./a.linux.exe
hello world!

おお、はろーわーるど!!!

なんか、久しぶりに、ハロワで感動した。

まだ -L と -Xlinker をつけないと動かないので、ググって

cd build-binutils/ld
make -j clean
make -j LIB_PATH=$SYSROOT/opt/lib:$SYSROOT/usr/lib:$SYSROOT/lib
cd ..
make install

したところ、

arm-none-linux-gnueabi-gcc a.c -o a.linux.exe

で、はろーわーるど できた。

わーい(*´▽`*)わーい

使わないんだけど、たぶん。