I think I became a little too crazy over cross compiling. For reasons now unknown to me, I decided that I wanted Python 3 on my Beaglebone. Having just learned how to cross-compile, I was perhaps a bit ambitious. In the end, I believe I cross-compiled successfully, but I have issues actually running Python 3 on the BB (perhaps due to PYTHONPATH issues?). Anyway, I’m a bit overloaded with other projects at the moment so I don’t think I can see this through. But I figured I’d write a post showing at least how to compile.
First I found a great site on how to cross-compile. Unfortunately, it appears offline now. A cached page is here and the real page, which is broken, is here. In his example he shows to cross-compile Nano and the key line is where he shows how to run configure:
./configure --host=arm-angstrom-linux-gnueabi --prefix=/home/vmplanet/gccexamples/nano/nano_out/
The host parameter tells configure to setup for arm-angstrom and the prefix parameter will be the root folder when you run make install
. This allows you to easily copy that directory to your Beaglebone for installation.
Apparently, prior to Python 3.3.1, one must patch the Python source to allow for cross-compiling. But, new to Python 3.3.1, this is no longer the case. You can now pass --build
and --host
parameters to configure (like above). For more information on this, see the Python 3.3.1 what’s new and look at the build section. Or, see the python checkin mailing list for the issue resolutions here and here.
The final incantation that worked for me was (I’m not sure if the CC
parameter is needed):
CONFIG_SITE=config.site ./configure CC="arm-angstrom-linux-gnueabi-gcc" --build=x86_64-ubuntu-linux --host=arm-angstrom-linux-gnueabi --disable-ipv6 --prefix=~/beaglebone/
I was using Ubuntu and you need to change the build parameter if you have a different architecture. The CONFIG_SITE was another hack I made. Configure grumbled about these missing lines in the config.site file and this was the easiest (but perhaps not the correct) way to silence its grumblings. Essentially, I created a config.site
file in the root of the source directory with the following lines:
ac_cv_file__dev_ptmx=no
ac_cv_file__dev_ptc=no
I then ran make
and make altinstall
to make sure all the Python 3.3 stuff with have the suffix 3.3. I sftp’ed the files to the Beaglebone and exploded the tar file in the root directory of the file system, but when I run python3.3
I get the following error:
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to [:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Aborted
beaglebone:~$
I tried various PYTHONPATH
tweaks, but none seem to do the trick. So, I’m using Python 2.7.2 for the time being. If you happen to successfully get Python 3.3.1 installed, I’d love to hear about it 🙂
This is really fascinating, Josh. I look forward to future posts. Please try to put them in English (or German, if you prefer).
Du kannst meine Seite auf Deutsch hier lesen.
Vielleicht dann wirst meine Website dann verstehen… 😉
Thanks for your work.
I got it to work with some changes. Here ist what i’ve done:
export TOOL_PREFIX=path/to/your/cross/compiler
export CXX=$TOOL_PREFIX-g++
export CPP="$TOOL_PREFIX-g++ -E"
export AR=$TOOL_PREFIX-ar
export RANLIB=$TOOL_PREFIX-ranlib
export CC=$TOOL_PREFIX-gcc
export LD=$TOOL_PREFIX-ld
export READELF=$TOOL_PREFIX-readelf
export CCFLAGS="-march=armv6 -mfpu=vfp -mfloat-abi=softfp" #you maybe have to change the flags
echo ac_cv_file__dev_ptmx=no > ./config.site
echo ac_cv_file__dev_ptc=no >> ./config.site
export CONFIG_SITE=config.site
./configure --host=arm-fsl-linux-gnueabi --prefix=/opt/python3.3.1 --build=x86_64-ubuntu-linux --disable-ipv6
make BLDSHARED="$TOOL_PREFIX-gcc -shared" CROSS_COMPILE=$TOOL_PREFIX- CROSS_COMPILE_TARGET=yes
sudo make install BLDSHARED="$TOOL_PREFIX-gcc -shared" CROSS_COMPILE=$TOOL_PREFIX- CROSS_COMPILE_TARGET=yes
This worked only on an i686-debian-linux cause my toolchain doesn’t want to work under x64 Ubuntu.
Awesome!
Thanks for letting me know!
Have you tried running opencv through python yet.
I’ve got usr/include/opencv in the pythonpath yet keep getting module errors. C++ efforts find opencv fine.
Unfortunately no. However, the #beagle IRC chat room on freenode and the BeagleBone mailing lists are great resources and you’d probably get an answer there.
thanks. I’ll keep looking.