2016/07/09(土)CYGWIN x64にarm-none-linux-gnueabi-gccクロスコンパイラとdistcc 3.1で快適ビルド環境を用意する
このサイト「つーさのくーかん」は、TS-219P+というQNAPというメーカのNASでホストしているのだが、
CPUが[email protected] 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。
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
で、はろーわーるど できた。
わーい(*´▽`*)わーい
使わないんだけど、たぶん。