PQI Air Card向けにPythonをクロスコンパイルしてみた

この記事はこのページで解説されている内容を執筆時点で行う方法を書いたものです。

環境はUbuntu 16.04 64bitで、マシンはVenue 11 Pro 7140を使いました。

発端

PQI Air Cardを使ってデジカメで撮影した画像をowncloudに自動同期したいと思い立ち、自動同期に必要なcurlをPQI Air Card向けにクロスコンパイルする方法を調べました。

その課程でPythonのクロスコンパイル方法を解説したサイトにたどり着き、クロスコンパイルの流れを確認するためにPythonも導入することにしました。

上記サイトの解説ではうまく行かない部分もあったので、そのあたりも含め書いていきます。

なお、curlをコンパイルする記事は新しい記事にあります。

ツールチェーンのダウンロード

PQI Air Card向けのバイナリをコンパイルするにはARM向けのツールチェーンが必要ですが、ダウンロード先を探すのに苦労しました。

Arch LinuxのWikiのリンクが生きていましたので、ここからダウンロードしました。

しかし、公式サイトでは公開停止になっているので何故ダウンロードできるか(また、ダウンロードしていいのか)は不明です。

私も探して無かったら諦めようと思っていました。

展開してパスを通す

これは、上のサイトとほぼ同じ作業になります。

$ tar xf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ mv arm-2014.05 ~/arm-dev-sc
$ ln -s ~/arm-dev{-sc,}
$ echo 'export PATH=$PATH:~/arm-dev/bin' >> ~/.bashrc
$ source ~/.bashrc

ディレクトリ名がちょっと変わっていますね。なんでだろうか。。

これでビルドするためのツールにパスが通ったので、次に進みます。

Pythonにパッチを当てる

ビルド用のPythonをダウンロードし、パッチを当てます。

$ wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
$ wget https://raw.githubusercontent.com/sjkingo/python-arm-xcompile/master/files/Python-2.7.3-xcompile.patch

パッチのリンクが切れていたので、検索してgithubにあった物を使わせていただきました。

普通にビルドしてから、パッチを当てます。

$ tar xf Python-2.7.3.tar.bz2 && cd Python-2.7.3
$ ./configure
$ make python Parser/pgen
$ mv python buildpython
$ mv Parser/pgen buildpgen
$ make distclean
$ patch -p1 < ../Python-2.7.3-xcompile.patch

いよいよ、ARM向けにビルドします。

ARM向けにビルド

まずはconfigureですね。

$ CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib BASECFLAGS=-mcpu=arm926ej-s \
./configure --host=arm-none-linux-gnueabi --build=x86_64-linux-gnu --prefix=/usr

しかし、ここでエラー。

configure.logを見てみると、次の1文が。。

/home/sakaki/arm-dev-sc/bin/arm-none-linux-gnueabi-gcc: No such file or directory

あるぇ・・・ls -laとかすると普通にファイル自体はあるんですけどね。。

しかし、実行するとNo such file or directoryのエラーが出ます。

$ ls /home/sakaki/arm-dev-sc/bin/arm-none-linux-gnueabi-gcc
/home/sakaki/arm-dev-sc/bin/arm-none-linux-gnueabi-gcc
$ /home/sakaki/arm-dev-sc/bin/arm-none-linux-gnueabi-gcc
/home/sakaki/arm-dev-sc/bin/arm-none-linux-gnueabi-gcc: No such file or directory

あっ、そういえばtoolchainのファイル名にi686ってありましたよね。。

これ32bit向けのバイナリじゃないですか。

というわけで、ここを参考に32bit向けのバイナリを実行できるようにします。

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

これで./configureしたら無事に通ったので、makeします。

あとは先人のサイトと全く同じ手順で問題ありませんでした。

$ make HOSTPYTHON=./buildpython HOSTPGEN=./buildpgen CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes HOSTARCH=arm-none-linux-gnueabi BUILDARCH=x86_64-linux-gnu
$ make install HOSTPYTHON=./buildpython CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes prefix=`pwd`/_install
$ cp -rf _install{,_strip}
$ ls -1 _install_strip/lib/python2.7/lib-dynload/*.so | xargs -n1 arm-none-linux-gnueabi-strip

これでビルドは完了です。

手元にPQI Air Cardが無いのでバイナリの転送は後で行いますが、PQI Air Cardで動作する物をコンパイルできる事が確認できました。

さーて、次はいよいよcURLをコンパイルするぞ!!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする