Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ==== MIPS Cross Compiler build ==== === Commercial Version === There is a commercial free version available from Mentor Graphics. [[http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/|Sourcery CodeBench Lite Edition]] === Build from source === What we need: * [[http://www.gnu.org/software/binutils/|GNU Binutils]] * [[http://www.gnu.org/software/gcc/|GNU GCC]] * and others... From a bare ubuntu 12.04 LTS you need to add the following packages: <code> sudo apt-get install build-essential m4 texinfo libncurses5-dev bzip2 </code> Copy the script "build_mips.sh" from below to your home directory. Open a terminal window in ubuntu by starting dash and typing terminal. The click terminal which opens the terminal. To change the current directory to your home directory type <code> cd </code> To see the full path of the current directory: <code> pwd </code> List the directory contents with <code> ls -la </code> Change the file attributes of "build_mips.sh" to executable with <code> chmod a+x build_mips.sh </code> Look into the bash script with <code> less build_mips.sh </code> Extend the search path by appending "export PATH=$HOME/site/bin:$PATH" to your .profile file Log out and login again to make the PATH variable active. Check your PATH variable with <code> echo $PATH </code> You should see the <..>/site/bin as the first entry. Run the build script with <code> ./build_mips.sh </code> Here is the shell script for building the cross compiler chain. Handmade stuff so you need to adapt. The script will build to a place in your home directory. So first add this place to your PATH variable. <code bash build_mips.sh> #!/bin/bash -ev # -e => exit on error # -v => verbose output # Mips Cross Compiler # Base directory mkdir -p mips # src directory mkdir -p mips/src # build directory mkdir -p mips/build # original archives mkdir -p mips/orig # Set the destination export MYMIPS=${HOME}/site # Versions GMPVERSION="4.3.2" PPLVERSION="0.12.1" BINUTILSVERSION="2.24" MPFRVERSION="2.4.2" MPCVERSION="1.0.2" ISLVERSION="0.12.2" CLOOGVERSION="0.18.1" GCCVERSION="4.8.2" NEWLIBVERSION="1.20.0" GDBVERSION="7.5.1" ######################################## # Binutils ######################################## # Get the archives cd mips/orig if [ ! -e "binutils-${BINUTILSVERSION}.tar.bz2" ] ; then wget http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILSVERSION}.tar.bz2 fi # Unpack to source directory cd ../src if [ ! -d "binutils-${BINUTILSVERSION}" ] ; then tar -xvjf ../orig/binutils-${BINUTILSVERSION}.tar.bz2 fi cd ../build mkdir -p binutils cd binutils if [ ! -e "config.status" ] ; then ../../src/binutils-${BINUTILSVERSION}/configure --target=mipsel-none-elf \ --prefix=$MYMIPS fi if [ ! -e "${MYMIPS}/bin/mipsel-none-elf-ld" ] ; then make make install fi cd ../../.. ######################################## # GMP ######################################## # Get the archives cd mips/orig if [ ! -e "gmp-${GMPVERSION}.tar.bz2" ] ; then wget ftp://ftp.halifax.rwth-aachen.de/gnu/gmp/gmp-4.3.2.tar.bz2 fi # Unpack to source directory cd ../src if [ ! -d "gmp-${GMPVERSION}" ] ; then tar -xjvf ../orig/gmp-${GMPVERSION}.tar.bz2 fi # Build cd ../build mkdir -p gmp cd gmp if [ ! -e "config.status" ] ; then ../../src/gmp-${GMPVERSION}/configure --prefix=$MYMIPS --enable-cxx fi if [ ! -e "${MYMIPS}/lib/libgmp.a" ] ; then make make install fi cd ../../.. ######################################## # PPL ######################################## # Get the archives #cd mips/orig #if [ ! -e "ppl-${PPLVERSION}.tar.bz2" ] ; then # wget ftp://ftp.cs.unipr.it/pub/ppl/releases/${PPLVERSION}/ppl-${PPLVERSION}.tar.bz2 #fi # Unpack to source directory #cd ../src #if [ ! -d "ppl-${PPLVERSION}" ] ; then #tar -xjvf ../orig/ppl-${PPLVERSION}.tar.bz2 #fi #cd ../build #mkdir -p ppl #cd ppl #if [ ! -e "config.status" ] ; then #../../src/ppl-${PPLVERSION}/configure --prefix=$MYMIPS --with-gmp=$MYMIPS --with-sysroot=$MYMIPS #fi #if [ ! -e "${MYMIPS}/lib/libppl.a" ] ; then #make #make install #fi #cd ../../.. ###################################### # MPFR library ####################################### # Get the archives cd mips/orig if [ ! -e "mpfr-${MPFRVERSION}.tar.bz2" ] ; then wget ftp://ftp.halifax.rwth-aachen.de/gnu/mpfr/mpfr-${MPFRVERSION}.tar.bz2 fi # Unpack to source directory cd ../src if [ ! -d "mpfr-${MPFRVERSION}" ] ; then tar -xvjf ../orig/mpfr-${MPFRVERSION}.tar.bz2 fi cd ../build mkdir -p mpfr cd mpfr if [ ! -e "config.status" ] ; then ../../src/mpfr-${MPFRVERSION}/configure --prefix=$MYMIPS --with-gmp=$MYMIPS fi if [ ! -e "${MYMIPS}/lib/libmpfr.a" ] ; then make make install fi cd ../../.. ###################################### # MPC library ####################################### # Get the archives cd mips/orig if [ ! -e "mpc-${MPCVERSION}.tar.gz" ] ; then wget ftp://ftp.halifax.rwth-aachen.de/gnu/mpc/mpc-${MPCVERSION}.tar.gz fi # Unpack to source directory cd ../src if [ ! -d "mpc-${MPCVERSION}" ] ; then tar -xvzf ../orig/mpc-${MPCVERSION}.tar.gz fi cd ../build mkdir -p mpc cd mpc if [ ! -e "config.status" ] ; then ../../src/mpc-${MPCVERSION}/configure --prefix=$MYMIPS --with-gmp=$MYMIPS --with-mpfr=$MYMIPS fi if [ ! -e "${MYMIPS}/lib/libmpc.a" ] ; then make make install fi cd ../../.. ############## # ISL ############## # Get the archives cd mips/orig if [ ! -e "isl-${ISLVERSION}.tar.bz2" ] ; then wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-${ISLVERSION}.tar.bz2 fi # Unpack to source directory cd ../src if [ ! -d "isl-${ISLVERSION}" ] ; then tar -xvjf ../orig/isl-${ISLVERSION}.tar.bz2 fi cd ../build mkdir -p isl cd isl if [ ! -e "config.status" ] ; then ../../src/isl-${ISLVERSION}/configure --prefix=$MYMIPS --with-gmp-prefix=$MYMIPS fi if [ ! -e "${MYMIPS}/lib/libisl.a" ] ; then make make install fi cd ../../.. ############## # CLOOG ############## # Get the archives cd mips/orig if [ ! -e "cloog-${CLOOGVERSION}.tar.gz" ] ; then wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-${CLOOGVERSION}.tar.gz fi # Unpack to source directory cd ../src if [ ! -d "cloog-${CLOOGVERSION}" ] ; then tar -xvzf ../orig/cloog-${CLOOGVERSION}.tar.gz fi cd ../build mkdir -p cloog cd cloog if [ ! -e "config.status" ] ; then ../../src/cloog-${CLOOGVERSION}/configure --prefix=$MYMIPS --with-gmp-prefix=$MYMIPS --with-isl=system --with-isl-prefix=$MYMIPS fi if [ ! -e "${MYMIPS}/lib/libcloog-isl.a" ] ; then make make install fi cd ../../.. ######################################## # newlib ######################################## # Get the archives cd mips/orig if [ ! -e "newlib-${NEWLIBVERSION}.tar.gz" ] ; then wget ftp://sourceware.org/pub/newlib/newlib-${NEWLIBVERSION}.tar.gz fi # Unpack to source directory cd ../src if [ ! -d "newlib-${NEWLIBVERSION}" ] ; then tar -xvzf ../orig/newlib-${NEWLIBVERSION}.tar.gz fi cd ../.. ######################################## # gcc first stage ######################################## # Get the archives cd mips/orig if [ ! -e "gcc-${GCCVERSION}.tar.bz2" ] ; then wget ftp://ftp.halifax.rwth-aachen.de/gnu/gcc/gcc-${GCCVERSION}/gcc-${GCCVERSION}.tar.bz2 fi # Unpack to source directory cd ../src if [ ! -d "gcc-${GCCVERSION}" ] ; then tar -xvjf ../orig/gcc-${GCCVERSION}.tar.bz2 fi cd ../build mkdir -p gcc-stage1 cd gcc-stage1 if [ ! -e "config.status" ] ; then LDFLAGS="-Wl,-rpath,$MYMIPS/lib" \ ../../src/gcc-${GCCVERSION}/configure --target=mipsel-none-elf \ --prefix=$MYMIPS \ --with-gmp=$MYMIPS \ --with-mpfr=$MYMIPS \ --with-mpc=$MYMIPS \ --with-isl=$MYMIPS \ --with-newlib --without-headers \ --disable-shared --disable-threads --disable-libssp \ --disable-libgomp --disable-libmudflap \ --enable-languages="c" fi if [ ! -e "${MYMIPS}/bin/mipsel-none-elf-gcc" ] ; then make all-gcc make install-gcc fi cd ../../.. ######################################## # newlib ######################################## # Build cd mips/build mkdir -p newlib cd newlib if [ ! -e "config.status" ] ; then ../../src/newlib-${NEWLIBVERSION}/configure --prefix=$MYMIPS --target=mipsel-none-elf fi if [ ! -e "${MYMIPS}/mipsel-none-elf/lib/libc.a" ] ; then make make install fi cd ../../.. ######################################## # gcc second stage ######################################## cd mips/build mkdir -p gcc-stage2 cd gcc-stage2 if [ ! -e "config.status" ] ; then LDFLAGS="-Wl,-rpath,$MYMIPS/lib" \ ../../src/gcc-${GCCVERSION}/configure --target=mipsel-none-elf \ --prefix=$MYMIPS \ --with-gmp=$MYMIPS \ --with-mpfr=$MYMIPS \ --with-mpc=$MYMIPS \ --with-isl=$MYMIPS \ --with-newlib \ --disable-shared --disable-threads --disable-libssp \ --disable-libgomp --disable-libmudflap \ --enable-languages="c,c++" fi if [ ! -e "${MYMIPS}/bin/mipsel-none-elf-g++" ] ; then make all make install fi cd ../../.. ######################################## # GDB ######################################## # Get the archives cd mips/orig if [ ! -e "gdb-${GDBVERSION}.tar.bz2" ] ; then wget ftp://ftp.halifax.rwth-aachen.de/gnu/gdb/gdb-${GDBVERSION}.tar.bz2 fi # Unpack to source directory cd ../src if [ ! -d "gdb-${GDBVERSION}" ] ; then tar -xvjf ../orig/gdb-${GDBVERSION}.tar.bz2 fi cd ../build mkdir -p gdb cd gdb if [ ! -e "config.status" ] ; then ../../src/gdb-${GDBVERSION}/configure --target=mipsel-none-elf \ --enable-sim-trace \ --enable-sim-stdio \ --prefix=$MYMIPS fi if [ ! -e "${MYMIPS}/bin/mipsel-none-elf-gdb" ] ; then make make install fi cd ../../.. </code> ===== Compile and Run an example ===== Here is an example mini c code to test the compiler. <code c hello.c> /* Hello world */ #include <stdio.h> int myfunc(int a, int b){ int k; k = a + b; k += 7; k *= 6; return k; } int main(){ int i,j,m; j = 3; m = 2; for(i=0;i<5;i++){ m += myfunc(i,j); printf("m is %d\n",m); } return 0; } </code> Compile to Assembler for viewing <code> mipsel-none-elf-gcc -S hello.c </code> The output assembler code is in hello.s. Compile and link ready for simulation with instruction set simulator <code> mipsel-none-elf-gcc -o hello -Tidt.ld hello.c </code> Run the code <code> mipsel-none-elf-run hello </code> === Analyze === Produce an annoted source code showing how often lines are executed. <code> gcc -fprofile-arcs -ftest-coverage -o hello hello.c ./hello gcov hello.c </code> This produces the file hello.c.gcov showing the annotated source file. === Tracing in instruction set simulator === Run with instruction tracing in the simulator <code> mipsel-none-elf-gcc -Tidt.ld -o hello hello.c mipsel-none-elf-run --trace-insn=on --trace-file trace hello </code> ===== Test the compiler ===== <code> sudo apt-get install dejagnu </code> <code> cd cd mips/build/gcc-stage2 make check-gcc RUNTESTFLAGS=--target_board=mips-sim </code> ===== Install git and download a simple project ===== Install git and download a simple project <code> sudo apt-get install git cd mkdir projects cd projects git clone https://git.etech.fh-augsburg.de/friedrich.beckmann/myfirst.git </code> Now you have the simple project "myfirst" in your directory. === Try the MIPS Cross Compiler === Change to the src directory and compile the code with the cross compiler. <code> cd myfirst cd src mipsel-none-elf-gcc -S hello.c less hello.s </code> Now you have the compiled assembler code "hello.s". To compile to binary do: <code> mipsel-none-elf-gcc -o hello -Tidt.ld hello.c </code> Now you have the binary "hello". You can run the binary in the instruction set simulator with <code> mipsel-none-elf-run hello </code> This will run the binary with the mips instruction set simulator. You should see "Hello World". ===== Open OCD ===== [[dt_openocd]] mips_cross_compiler.txt Last modified: 2014/06/04 17:52by beckmanf