├── Dockerfile ├── README.md ├── build.opencv ├── build.sh ├── pi.cmake └── supervisord.conf /Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # Cross compiler environment for raspberry pi 3 | # 4 | # Follows this stack overflow article 5 | # http://stackoverflow.com/questions/19162072/installing-raspberry-pi-cross-compiler/19269715#19269715 6 | # 7 | FROM ubuntu:12.04 8 | MAINTAINER Michael Shamberger 9 | 10 | RUN locale-gen en_US.UTF-8 11 | RUN update-locale LANG=en_US.UTF-8 12 | 13 | # update apt sources to use hetzner mirror 14 | # RUN echo "deb ftp://mirror.hetzner.de/ubuntu/packages precise main restricted universe multiverse" > /etc/apt/sources.list 15 | 16 | # standard base 17 | RUN apt-get -qq update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q supervisor dialog net-tools lynx wget vim-tiny nano openssh-server git curl sudo 18 | ADD supervisord.conf /etc/supervisor/supervisord.conf 19 | RUN mkdir -p /var/log/supervisor 20 | RUN mkdir -p /var/run/sshd 21 | 22 | # build tools 23 | # we need to install a dummy libfuse or docker will fail 24 | RUN apt-get install libfuse2 25 | RUN cd /tmp ; apt-get download fuse 26 | RUN cd /tmp ; dpkg-deb -x fuse_* . 27 | RUN cd /tmp ; dpkg-deb -e fuse_* 28 | RUN cd /tmp ; rm fuse_*.deb 29 | RUN cd /tmp ; echo -en '#!/bin/bash\nexit 0\n' > DEBIAN/postinst 30 | RUN cd /tmp ; dpkg-deb -b . /fuse.deb 31 | RUN cd /tmp ; dpkg -i /fuse.deb 32 | RUN apt-get -qq update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q cmake make ia32-libs 33 | 34 | # raspberry pi compiler tools 35 | RUN mkdir -p /opt/rpi; cd /opt/rpi; git clone https://github.com/raspberrypi/tools.git 36 | RUN echo "export PATH=$PATH:/opt/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin" > /root/.bashrc 37 | ADD pi.cmake /opt/rpi/pi.cmake 38 | 39 | # Download cmake hello world to verify that we can compile for pi 40 | # Copy CMakeHelloWorld to your pi and test that it runs 41 | RUN cd /opt/rpi; git clone https://github.com/jameskbride/cmake-hello-world.git; cd cmake-hello-world; mkdir build 42 | RUN cd /opt/rpi/cmake-hello-world/build; cmake -D CMAKE_TOOLCHAIN_FILE=/opt/rpi/pi.cmake ../; make 43 | 44 | # Also include sample opencv build script 45 | ADD build.opencv /root/build.opencv 46 | 47 | # Exposes 48 | EXPOSE 22 49 | 50 | # run container with supervisor 51 | CMD ["/usr/bin/supervisord"] 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | raspberry pi cross compilation 2 | ------------------------------ 3 | 4 | Based on this stack overflow article 5 | http://stackoverflow.com/questions/19162072/installing-raspberry-pi-cross-compiler/19269715#19269715 6 | 7 | Test the hello world program first: 8 | cd /opt/rpi/cmake-hello-world 9 | mkdir build 10 | cd build 11 | cmake -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake ../ 12 | make 13 | scp CMakeHelloWorld pi@192.168.1.PI:/home/pi/ 14 | ssh pi@192.168.1.PI ./CMakeHelloWorld 15 | Now run the program from your PI 16 | 17 | 18 | OpenCV example 19 | ============== 20 | 21 | cd /opt 22 | git clone https://github.com/Itseez/opencv 23 | cd opencv 24 | git checkout 2.4.9 25 | cp /root/build.opencv . 26 | ./build.opencv 27 | -------------------------------------------------------------------------------- /build.opencv: -------------------------------------------------------------------------------- 1 | # To use: 2 | # Cloan the opencv repository and then set the tag you want to compile against 3 | # For example: 4 | # git clone https://github.com/Itseez/opencv 5 | # cd opencv 6 | # git checkout 2.4.9 7 | # cd .. 8 | # 9 | echo "COMMAND : build.pi - cross-compile OpenCV for RaspberryPi" 10 | 11 | if [ ! -e release.pi ]; then mkdir -p release.pi; fi 12 | 13 | pushd release.pi > /dev/null 14 | if [ -e CMakeFiles ] ; then 15 | echo "STATUS : removing existing makefiles" 16 | rm -rf CMakeCache.txt CMakeFiles CMakeFiles.txt cmake_install.cmake CPackConfig.cmake CPackSourceConfig.cmake 17 | fi 18 | 19 | echo "COMMAND : cmake -DCMAKE_TOOLCHAIN_FILE=/opt/rpi/pi.cmake ..." 20 | cmake \ 21 | -DCMAKE_TOOLCHAIN_FILE=/opt/rpi/pi.cmake \ 22 | -D BUILD_EXAMPLES=OFF \ 23 | -D BUILD_NEW_PYTHON_SUPPORT=OFF \ 24 | -D BUILD_TESTS=OFF \ 25 | -D INSTALL_C_EXAMPLES=OFF \ 26 | -D INSTALL_PYTHON_EXAMPLES=OFF \ 27 | -D WITH_1394=OFF \ 28 | -D WITH_CUDA=OFF \ 29 | -D WITH_EIGEN2=OFF \ 30 | -D WITH_EIGEN=OFF \ 31 | -D WITH_FFMPEG=OFF \ 32 | -D WITH_GSTREAMER=OFF \ 33 | -D WITH_GTK=OFF \ 34 | -D WITH_JASPER=OFF \ 35 | -D WITH_JPEG=ON \ 36 | -D WITH_OPENEXR=OFF \ 37 | -D WITH_OPENGL=ON \ 38 | -D WITH_PNG=ON \ 39 | -D WITH_PVAPI=OFF \ 40 | -D WITH_QT=OFF \ 41 | -D WITH_QT_OPENGL=OFF \ 42 | -D WITH_TBB=OFF \ 43 | -D WITH_TIFF=OFF \ 44 | -D WITH_UNICAP=OFF \ 45 | -D WITH_V4L=OFF \ 46 | -D WITH_XINE=OFF \ 47 | -D BUILD_opencv_nonfree=0 \ 48 | .. 49 | # -D ONLY_CMAKE_FIND_ROOT_PATH=ON \ 50 | if [ $? -ne 0 ]; then echo "ERROR : cmake failed"; exit -1; fi 51 | 52 | echo "COMMAND : make -j4" 53 | make -j4 54 | if [ $? -ne 0 ]; then echo "ERROR : make failed"; exit -1; fi 55 | 56 | popd > /dev/null 57 | 58 | echo "STATUS : creating release.pi/install/opencv.zip" 59 | rm -rf release.pi/install 60 | mkdir release.pi/install 61 | 62 | zip -r release.pi/install/opencv include/opencv include/opencv2 63 | 64 | mkdir release.pi/install/include 65 | cp -r release.pi/opencv2 release.pi/install/include/ 66 | 67 | pushd release.pi > /dev/null 68 | mkdir -p install/share/OpenCV 69 | cp OpenCVConfig.cmake install/share/OpenCV/OpenCVConfig.cmake 70 | cp OpenCVConfig-version.cmake install/share/OpenCV/OpenCVConfig-version.cmake 71 | popd > /dev/null 72 | 73 | function package() { 74 | pushd $1 > /dev/null 75 | shift 76 | zip -r $* 77 | popd > /dev/null 78 | } 79 | 80 | package release.pi/CMakeFiles/Export ../../../release.pi/install/opencv share 81 | package release.pi/install ../../release.pi/install/opencv share include 82 | package release.pi --symlinks ../release.pi/install/opencv lib/*so* lib/libopencv_ts.a -x *nonfree* 83 | package modules/calib3d ../../release.pi/install/opencv include 84 | package modules/contrib ../../release.pi/install/opencv include 85 | package modules/core ../../release.pi/install/opencv include 86 | package modules/features2d ../../release.pi/install/opencv include 87 | package modules/flann ../../release.pi/install/opencv include 88 | package modules/gpu ../../release.pi/install/opencv include 89 | package modules/highgui ../../release.pi/install/opencv include 90 | package modules/imgproc ../../release.pi/install/opencv include 91 | package modules/legacy ../../release.pi/install/opencv include 92 | package modules/ml ../../release.pi/install/opencv include 93 | package modules/objdetect ../../release.pi/install/opencv include 94 | package modules/ocl ../../release.pi/install/opencv include -x */cl_runtime/* */private/* 95 | package modules/photo ../../release.pi/install/opencv include 96 | package modules/stitching ../../release.pi/install/opencv include 97 | package modules/superres ../../release.pi/install/opencv include 98 | package modules/ts ../../release.pi/install/opencv include 99 | package modules/video ../../release.pi/install/opencv include 100 | package modules/videostab ../../release.pi/install/opencv include 101 | 102 | echo "-------------------------------------" 103 | echo "SUCCESS : install/opencv.zip created" 104 | echo "INSTALL : 1) transfer opencv.zip to Raspberry Pi ~/pi" 105 | echo "INSTALL : 2) cd /usr/local" 106 | echo "INSTALL : 3) sudo unzip ~/opencv.zip" 107 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | docker build -t scivm/raspberry-pi-cross-compiler . 2 | -------------------------------------------------------------------------------- /pi.cmake: -------------------------------------------------------------------------------- 1 | set( CMAKE_SYSTEM_NAME Linux ) 2 | set( CMAKE_SYSTEM_PROCESSOR arm ) 3 | set( CMAKE_C_COMPILER /opt/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc ) 4 | set( CMAKE_CXX_COMPILER /opt/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++ ) 5 | set( CMAKE_FIND_ROOT_PATH "~/targetfs ~/targetfs/usr/include/arm-linux-gnueabihf" ) 6 | 7 | -------------------------------------------------------------------------------- /supervisord.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | 4 | [program:sshd] 5 | command=/usr/sbin/sshd -D 6 | stdout_logfile=/var/log/supervisor/%(program_name)s.log 7 | stderr_logfile=/var/log/supervisor/%(program_name)s.log 8 | autorestart=true 9 | --------------------------------------------------------------------------------