==== 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: sudo apt-get install build-essential m4 texinfo libncurses5-dev bzip2 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 cd To see the full path of the current directory: pwd List the directory contents with ls -la Change the file attributes of "build_mips.sh" to executable with chmod a+x build_mips.sh Look into the bash script with less build_mips.sh 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 echo $PATH You should see the <..>/site/bin as the first entry. Run the build script with ./build_mips.sh 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. #!/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 ../../.. ===== Compile and Run an example ===== Here is an example mini c code to test the compiler. /* Hello world */ #include 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; } Compile to Assembler for viewing mipsel-none-elf-gcc -S hello.c The output assembler code is in hello.s. Compile and link ready for simulation with instruction set simulator mipsel-none-elf-gcc -o hello -Tidt.ld hello.c Run the code mipsel-none-elf-run hello === Analyze === Produce an annoted source code showing how often lines are executed. gcc -fprofile-arcs -ftest-coverage -o hello hello.c ./hello gcov hello.c This produces the file hello.c.gcov showing the annotated source file. === Tracing in instruction set simulator === Run with instruction tracing in the simulator mipsel-none-elf-gcc -Tidt.ld -o hello hello.c mipsel-none-elf-run --trace-insn=on --trace-file trace hello ===== Test the compiler ===== sudo apt-get install dejagnu cd cd mips/build/gcc-stage2 make check-gcc RUNTESTFLAGS=--target_board=mips-sim ===== Install git and download a simple project ===== Install git and download a simple project sudo apt-get install git cd mkdir projects cd projects git clone https://git.etech.fh-augsburg.de/friedrich.beckmann/myfirst.git 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. cd myfirst cd src mipsel-none-elf-gcc -S hello.c less hello.s Now you have the compiled assembler code "hello.s". To compile to binary do: mipsel-none-elf-gcc -o hello -Tidt.ld hello.c Now you have the binary "hello". You can run the binary in the instruction set simulator with mipsel-none-elf-run hello This will run the binary with the mips instruction set simulator. You should see "Hello World". ===== Open OCD ===== [[dt_openocd]]