Skip to content

Instantly share code, notes, and snippets.

@jvcleave
Last active March 21, 2016 18:51
Show Gist options
  • Select an option

  • Save jvcleave/f9916800c3534a0e77f4 to your computer and use it in GitHub Desktop.

Select an option

Save jvcleave/f9916800c3534a0e77f4 to your computer and use it in GitHub Desktop.
ARCH CROSS COMPILE FOR ARM7/RPI3
#! /bin/bash
set -e
trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
trap 'echo FAILED COMMAND: $previous_command' EXIT
#-------------------------------------------------------------------------------------------
# This script will download packages for, configure, build and install a GCC cross-compiler.
# Customize the variables (INSTALL_PATH, TARGET, etc.) to your liking before running.
# If you get an error and need to resume the script from some point in the middle,
# just delete/comment the preceding lines before running it again.
#
# See: http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler
#-------------------------------------------------------------------------------------------
export SYSROOT=/home/pi/RPI_ROOT
INSTALL_PATH=/opt/cross
TARGET=arm-linux-gnueabihf
LINUX_ARCH=arm
CONFIGURATION_OPTIONS="--disable-werror --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16"
SYSROOT_OPTIONS="--with-sysroot=$SYSROOT --with-build-sysroot=$SYSROOT"
PARALLEL_MAKE=-j4
BINUTILS_VERSION=binutils-2.26
GCC_VERSION=gcc-5.3.0
LINUX_KERNEL_VERSION=linux-4.1.18
GLIBC_VERSION=glibc-2.23
MPFR_VERSION=mpfr-3.1.3
GMP_VERSION=gmp-6.1.0
MPC_VERSION=mpc-1.0.2
ISL_VERSION=isl-0.12.2
CLOOG_VERSION=cloog-0.18.1
USE_NEWLIB=0
export PATH=$INSTALL_PATH/bin:$PATH
# Download packages
export http_proxy=$HTTP_PROXY https_proxy=$HTTP_PROXY ftp_proxy=$HTTP_PROXY
if [ ! -f $BINUTILS_VERSION.tar.gz ]; then
wget -nc https://ftp.gnu.org/gnu/binutils/$BINUTILS_VERSION.tar.gz
fi
if [ ! -f $GCC_VERSION.tar.gz ]; then
wget -nc https://ftp.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_VERSION.tar.gz
fi
if [ ! -f $LINUX_KERNEL_VERSION.tar.xz ]; then
wget -nc https://www.kernel.org/pub/linux/kernel/v4.x/$LINUX_KERNEL_VERSION.tar.xz
fi
if [ ! -f $GLIBC_VERSION.tar.xz ]; then
wget -nc https://ftp.gnu.org/gnu/glibc/$GLIBC_VERSION.tar.xz
fi
if [ ! -f $MPFR_VERSION.tar.xz ]; then
wget -nc https://ftp.gnu.org/gnu/mpfr/$MPFR_VERSION.tar.xz
fi
if [ ! -f $GMP_VERSION.tar.xz ]; then
wget -nc https://ftp.gnu.org/gnu/gmp/$GMP_VERSION.tar.xz
fi
if [ ! -f $MPC_VERSION.tar.gz ]; then
wget -nc https://ftp.gnu.org/gnu/mpc/$MPC_VERSION.tar.gz
fi
if [ ! -f $ISL_VERSION.tar.bz2 ]; then
wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$ISL_VERSION.tar.bz2
fi
if [ ! -f $CLOOG_VERSION.tar.gz ]; then
wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$CLOOG_VERSION.tar.gz
fi
# Extract everything
echo "Uncompressing toolchain source"
for f in *.tar*; do tar xf $f; done
# Make symbolic links
cd $GCC_VERSION
ln -sf `ls -1d ../mpfr-*/` mpfr
ln -sf `ls -1d ../gmp-*/` gmp
ln -sf `ls -1d ../mpc-*/` mpc
ln -sf `ls -1d ../isl-*/` isl
ln -sf `ls -1d ../cloog-*/` cloog
cd ..
# Step 1. Binutils
mkdir -p build-binutils
cd build-binutils
../$BINUTILS_VERSION/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS $SYSROOT_OPTIONS
make $PARALLEL_MAKE
make install
cd ..
# Step 2. Linux Kernel Headers
if [ $USE_NEWLIB -eq 0 ]; then
cd $LINUX_KERNEL_VERSION
make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$INSTALL_PATH/$TARGET headers_install
cd ..
fi
# Step 3. C/C++ Compilers
mkdir -p build-gcc
cd build-gcc
if [ $USE_NEWLIB -ne 0 ]; then
NEWLIB_OPTION=--with-newlib
fi
../$GCC_VERSION/configure --prefix=$INSTALL_PATH --target=$TARGET --enable-languages=c,c++ --with-float=hard --enable-multiarch --target=arm-linux-gnueabihf $CONFIGURATION_OPTIONS $SYSROOT_OPTIONS
make $PARALLEL_MAKE all-gcc
make install-gcc
cd ..
if [ $USE_NEWLIB -ne 0 ]; then
# Steps 4-6: Newlib
mkdir -p build-newlib
cd build-newlib
../newlib-master/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS
make $PARALLEL_MAKE
make install
cd ..
else
# Step 4. Standard C Library Headers and Startup Files
mkdir -p build-glibc
cd build-glibc
../$GLIBC_VERSION/configure --prefix=$INSTALL_PATH/$TARGET --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$INSTALL_PATH/$TARGET/include $CONFIGURATION_OPTIONS libc_cv_forced_unwind=yes
make install-bootstrap-headers=yes install-headers
make $PARALLEL_MAKE csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o $INSTALL_PATH/$TARGET/lib
$TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $INSTALL_PATH/$TARGET/lib/libc.so
touch $INSTALL_PATH/$TARGET/include/gnu/stubs.h
cd ..
# Step 5. Compiler Support Library
cd build-gcc
make $PARALLEL_MAKE all-target-libgcc
make install-target-libgcc
cd ..
# Step 6. Standard C Library & the rest of Glibc
cd build-glibc
make $PARALLEL_MAKE
make install
cd ..
fi
# Step 7. Standard C++ Library & the rest of GCC
cd build-gcc
make $PARALLEL_MAKE all
make install
cd ..
sed -i "s|${INSTALL_PATH}/arm-linux-gnueabihf/lib/||g" ${INSTALL_PATH}/arm-linux-gnueabihf/lib/libpthread.so
sed -i "s|${INSTALL_PATH}/arm-linux-gnueabihf/lib/||g" ${INSTALL_PATH}/arm-linux-gnueabihf/lib/libc.so
trap - EXIT
echo 'Success!'
@jvcleave
Copy link
Copy Markdown
Author

cd /home/pi/RPI_ROOT/usr/lib
rm libEGL.so.1.0.0
rm libGL.so.1.2.0
rm libGLESv1_CM.so.1.1.0
rm libGLESv2.so.2.0.0
ln -s mesa/libEGL.so.1.0.0
ln -s mesa/libGL.so.1.2.0
ln -s mesa/libGLESv1_CM.so.1.1.0 
ln -s mesa/libGLESv2.so.2.0.0

export GST_VERSION=1.0
export RPI_ROOT=/home/pi/RPI_ROOT
export TOOLCHAIN_ROOT=/opt/cross/bin
export TOOLCHAIN_PREFIX=arm-linux-gnueabihf
export PLATFORM_VARIANT=raspberry2
export PLATFORM_OS=Linux
export PLATFORM_ARCH=armv7l

PLATFORM_CORE_EXCLUSIONS += $(OF_LIBS_PATH)/openFrameworks/app/ofAppGLFWWindow.cpp

ifeq ($(CROSS_COMPILING),1) 
    ifdef TOOLCHAIN_ROOT
        #You have specified TOOLCHAIN_ROOT with an environment variable
    else
        TOOLCHAIN_ROOT = /opt/cross/bin
    endif

    ifdef GCC_PREFIX
        #You have specified GCC_PREFIX with an environment variable
    else
        GCC_PREFIX = armv7l-unknown-linux-gnueabihf
    endif

    PLATFORM_CXX = $(TOOLCHAIN_ROOT)/$(TOOLCHAIN_PREFIX)-g++
    PLATFORM_CC = $(TOOLCHAIN_ROOT)/$(TOOLCHAIN_PREFIX)-gcc
    PLATFORM_AR = $(TOOLCHAIN_ROOT)/$(TOOLCHAIN_PREFIX)-ar
    PLATFORM_LD = $(TOOLCHAIN_ROOT)/$(TOOLCHAIN_PREFIX)-ld

    SYSROOT=$(RPI_ROOT)

    PLATFORM_CFLAGS += --sysroot=$(SYSROOT)

    PLATFORM_HEADER_SEARCH_PATHS += $(SYSROOT)/usr/local/include
    PLATFORM_HEADER_SEARCH_PATHS += $(SYSROOT)/usr/include/c++/5.3.0
    PLATFORM_HEADER_SEARCH_PATHS += $(SYSROOT)/usr/include/$(GCC_PREFIX)/c++/5.3.0
    PLATFORM_HEADER_SEARCH_PATHS += $(SYSROOT)/usr/include/c++/5.3.0/$(GCC_PREFIX)

    PLATFORM_LIBRARY_SEARCH_PATHS += $(SYSROOT)/usr/lib/$(GCC_PREFIX)
    PLATFORM_LIBRARY_SEARCH_PATHS += $(SYSROOT)/usr/local/lib
    PLATFORM_LIBRARY_SEARCH_PATHS += $(SYSROOT)/usr/lib/gcc/$(GCC_PREFIX)/5.3.0

    PLATFORM_LDFLAGS += --sysroot=$(SYSROOT) 
    PLATFORM_LDFLAGS += -Xlinker -rpath-link=$(SYSROOT)/usr/lib 
    PLATFORM_LDFLAGS += -Xlinker -rpath-link=$(SYSROOT)/usr/local/lib 
    PLATFORM_LDFLAGS += -Xlinker -rpath-link=$(SYSROOT)/usr/lib/$(GCC_PREFIX) 
    PLATFORM_LDFLAGS += -Xlinker -rpath-link=$(SYSROOT)/lib/$(GCC_PREFIX) 
    PLATFORM_LDFLAGS += -Xlinker -rpath-link=$(SYSROOT)/opt/vc/lib
    PLATFORM_LDFLAGS += -Xlinker -rpath-link=$(SYSROOT)/usr/lib/arm-linux-gnueabihf/pulseaudio

    PKG_CONFIG_LIBDIR=$(SYSROOT)/usr/lib/pkgconfig:$(SYSROOT)/usr/share/pkgconfig

endif

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment