(嵌入式 实时操作系统 rtos rtems 开发环境 交叉工具链 shell脚本)
RTEMS 安装脚本
rtems_building_v10.sh
转载请注明出处:http://blog.youkuaiyun.com/zhumaill/article/details/21478895
- #!/bin/bash
- #rtems4.11在linuxmint-16-cinnamon-64bit上测试通过
- #设置
- TARGET=arm-rtemseabi4.11
- PREFIX=/opt/rtems-4.11
- BSP=stm32f4
- BASEDIR=`pwd`
- TOPDIR=my_rtems
- binutils_name=binutils-2.24.tar.bz2
- gcc_name=gcc-4.8.2.tar.bz2
- gcc_diff_name=gcc-4.8.2-rtems4.11-20131031.diff
- gdb_name=gdb-7.6.2.tar.bz2
- gdb_diff_name=gdb-7.6.2-rtems4.11-20131208.diff
- newlib_name=newlib-1.20.0.tar.gz
- newlib_diff_name=newlib-1.20.0-rtems4.11-20130325.diff
- binutils_basename=`echo $binutils_name | awk -F. 'NF-=2' OFS=.`
- gcc_basename=`echo $gcc_name | awk -F. 'NF-=2' OFS=.`
- gdb_basename=`echo $gdb_name | awk -F. 'NF-=2' OFS=.`
- newlib_basename=`echo $newlib_name | awk -F. 'NF-=2' OFS=.`
- #“按任意键继续。。。”的处理函数
- get_char()
- {
- SAVEDSTTY=`stty -g`
- stty -echo
- stty raw
- dd if=/dev/tty bs=1 count=1 2> /dev/null
- stty -raw
- stty echo
- stty $SAVEDSTTY
- }
- usage()
- {
- cat <<EOF
- -d 下载安装并创建压缩包->引导rtems->配置rtems->编译安装rtems->编译应用程序
- -e 从本地压缩包安装->引导rtems->配置rtems->编译安装rtems->编译应用程序
- -b 引导rtems->配置rtems->编译安装rtems->编译应用程序
- -c 配置rtems->编译安装rtems->编译应用程序
- -m 编译安装rtems->编译应用程序
- -a 编译应用程序
- EOF
- }
- if [ -z "$1" ]; then
- usage
- exit 1
- fi
- DOWNLOAD=no
- EXTRACT=no
- BOOTSTRAP=no
- CONFIGURE=no
- MAKERTEMS=no
- APPLICATION=no
- while getopts debcma OPT
- do
- case "$OPT" in
- d) DOWNLOAD=yes; BOOTSTRAP=yes; CONFIGURE=yes; MAKERTEMS=yes; APPLICATION=yes;;
- e) EXTRACT=yes; BOOTSTRAP=yes; CONFIGURE=yes; MAKERTEMS=yes; APPLICATION=yes;;
- b) BOOTSTRAP=yes; CONFIGURE=yes; MAKERTEMS=yes; APPLICATION=yes;;
- c) CONFIGURE=yes; MAKERTEMS=yes; APPLICATION=yes;;
- m) MAKERTEMS=yes; APPLICATION=yes;;
- a) APPLICATION=yes;;
- *) usage; exit 1;;
- esac
- done
- if [ $DOWNLOAD = 'yes' ] || [ $EXTRACT = 'yes' ]; then
- echo "创建交叉工具链安装目录"
- if [ ! -d "$PREFIX" ]; then
- sudo mkdir $PREFIX
- sudo chown $USER:$USER $PREFIX
- fi
- if [ -d "$TOPDIR" ]; then
- echo "错误:目录$TOPDIR已经存在"
- exit 1
- fi
- echo "设置环境变量"
- if [ ! -f "$HOME/.bashrc" ]; then
- touch $HOME/.bashrc
- fi
- if !(grep -q "export PATH=$PREFIX/bin:"'$PATH' $HOME/.bashrc); then
- echo export PATH=$PREFIX/bin:'$PATH' >> $HOME/.bashrc
- fi
- if !(grep -q "export RTEMS_MAKEFILE_PATH=$PREFIX/$TARGET/$BSP" $HOME/.bashrc); then
- echo export RTEMS_MAKEFILE_PATH=$PREFIX/$TARGET/$BSP >> $HOME/.bashrc
- fi
- source $HOME/.bashrc
- echo "安装依赖项"
- sudo apt-get -d update 2>&1 | tee apt-get_update.log
- if (grep -q -E '^E:|^Err|^W:' apt-get_update.log); then
- if (grep -q '/var/lib/apt/lists/lock' apt-get_update.log); then
- sudo rm /var/lib/apt/lists/* -vf
- sudo apt-get update
- if [ $? -ne 0 ]; then
- echo "更新源出现错误,请稍候重试1"
- exit 1
- fi
- else
- echo "更新源出现错误,请稍候重试2"
- exit 1
- fi
- fi
- sudo apt-get install -y autoconf automake autotools-dev build-essential git dpkg-dev g++ libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libdpkg-perl libgmp-dev libgmp3-dev libgmpxx4ldbl libltdl-dev libmpc-dev libmpfr-dev libtimedate-perl libtool texinfo flex libncurses5-dev libc6-dev
- if [ $? -ne 0 ]; then
- echo "安装依赖项出现错误,请稍候重试"
- exit 1
- fi
- #echo "按任意键继续。。。" && char=`get_char`
- if [ $DOWNLOAD = 'yes' ]; then
- echo "下载安装并创建压缩包"
- which proz > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- echo "安装多线程下载工具"
- wget -c http://dxdown1.onlinedown.net/down/prozilla-2.0.4.tar.zip
- unzip prozilla-2.0.4.tar.zip prozilla-2.0.4.tar.bz2
- tar -xf prozilla-2.0.4.tar.bz2
- cd prozilla-2.0.4
- sed -i 's/DL_Window:://' src/download_win.h
- ./configure
- make
- sudo make install
- cd ..
- fi
- which proz > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- echo "安装多线程下载工具出现错误,中止运行"
- exit 1
- fi
- if [ -d "$TOPDIR" ]; then
- echo "错误:目录$TOPDIR已经存在"
- exit 1
- fi
- mkdir $TOPDIR
- cd $TOPDIR
- down_cmd='proz -k=20 '
- host1='http://mirrors.ustc.edu.cn/gnu'
- #host2='http://mirror.bjtu.edu.cn/gnu'
- $down_cmd$host1/binutils/$binutils_name
- $down_cmd$host1/gcc/$gcc_basename/$gcc_name
- $down_cmd$host1/gdb/$gdb_name
- host1='http://www.rtems.org/ftp/pub/rtems/SOURCES/4.11'
- $down_cmd$host1/$gcc_diff_name
- $down_cmd$host1/$gdb_diff_name
- $down_cmd$host1/$newlib_name
- $down_cmd$host1/$newlib_diff_name
- git_cmd='git clone git://git.rtems.org'
- $git_cmd/examples-v2.git examples-v2
- $git_cmd/rtems.git rtems
- $git_cmd/rtems-schedsim.git rtems-schedsim
- $git_cmd/rtems-testing.git rtems-testing
- $git_cmd/rtems-addon-packages.git rtems-addon-packages
- cd ..
- echo "打包..."
- tar -zcf $TOPDIR-$(date +%Y%m%d-%H%M%S).tar.gz $TOPDIR
- else
- echo "从本地压缩包安装"
- rtems_pkg=`find . -maxdepth 1 -type f -name "$TOPDIR-????????-??????.tar.gz" | sort -r | head -1`
- if [ -z "$rtems_pkg" ]; then
- echo "错误:没有找到压缩包,中止执行"
- exit 1
- fi
- if [ -d "$TOPDIR" ]; then
- echo "错误:目录$TOPDIR已经存在"
- exit 1
- fi
- echo "解包..."
- tar -xf $rtems_pkg
- fi
- #echo "按任意键继续。。。" && char=`get_char`
- echo "编译安装交叉工具链"
- cd $BASEDIR/$TOPDIR
- tar -xf $binutils_name
- tar -xf $gcc_name
- patch -p0 < $gcc__diff_name
- tar -xf $gdb_name
- patch -p0 < $gdb_diff_name
- tar -xf $newlib_name
- patch -p0 < $newlib_diff_name
- mkdir b-binutils
- cd b-binutils
- ../$binutils_basename/configure --target=$TARGET --prefix=$PREFIX && make && make install
- cd ..
- cd $gcc_basename
- ln -s ../$newlib_basename/newlib .
- cd ..
- mkdir b-gcc
- cd b-gcc
- ../$gcc_basename/configure --target=$TARGET --with-gnu-as --with-gnu-ld --with-newlib --verbose --enable-threads --enable-obsolete --enable-languages="c,c++" --prefix=$PREFIX
- make
- if [ $? -ne 0 ]; then
- echo "编译安装交叉工具链出现错误,中止执行"
- exit 1
- fi
- #echo "按任意键继续。。。" && char=`get_char`
- make install
- cd ..
- mkdir b-gdb
- cd b-gdb
- ../$gdb_basename/configure --target=$TARGET --prefix=$PREFIX && make && make install
- cd ..
- echo "删除多余的BSP" #注释掉的行将被保留
- delbsps='
- arm/csb336
- arm/csb337
- arm/edb7312
- arm/gba
- arm/gdbarmsim
- arm/gp32
- arm/gumstix
- arm/lm3s69xx
- arm/lpc24xx
- arm/lpc32xx
- arm/nds
- arm/raspberrypi
- arm/realview-pbx-a9
- arm/rtl22xx
- arm/smdk2410
- #arm/stm32f4
- arm/xilinx-zynq
- avr
- bfin
- h8300
- i386
- lm32
- m32c
- m32r
- m68k
- mips
- moxie
- nios2
- no_cpu
- powerpc
- sh
- sparc
- sparc64
- v850
- '
- for i in $delbsps; do
- if [ -d "rtems/c/src/lib/libbsp/$i" ]; then
- rm -r rtems/c/src/lib/libbsp/$i
- fi
- if [ -d "rtems/c/src/lib/libcpu/$i" ]; then
- rm -r rtems/c/src/lib/libcpu/$i
- fi
- if [ -d "rtems/cpukit/score/cpu/$i" ]; then
- rm -r rtems/cpukit/score/cpu/$i
- fi
- ii=`echo $i | sed 's#\/#\\\/#g'`
- sed -i "/$ii/d" rtems/cpukit/configure.ac
- sed -i "/$ii/d" rtems/cpukit/score/cpu/Makefile.am
- done
- echo "删除自带的示例"
- rm -r rtems/testsuites
- rm -r rtems/c/src/ada-tests
- #echo "按任意键继续。。。" && char=`get_char`
- fi #end [ $DOWNLOAD = 'yes' ] || [ $EXTRACT = 'yes' ]
- if [ $BOOTSTRAP = 'yes' ]; then
- echo "引导rtems"
- cd $BASEDIR/$TOPDIR/rtems
- ./bootstrap -c
- ./bootstrap -p
- ./bootstrap
- if [ $? -ne 0 ]; then
- echo "引导rtems出现错误,中止执行"
- exit 1
- fi
- #echo "按任意键继续。。。" && char=`get_char`
- cd ..
- fi #end BOOTSTRAP
- if [ $CONFIGURE = 'yes' ]; then
- echo "配置rtems"
- cd $BASEDIR/$TOPDIR
- if [ -d "b-$BSP" ]; then
- rm -r b-$BSP
- fi
- mkdir b-$BSP
- cd b-$BSP
- ../rtems/configure --target=$TARGET --enable-rtemsbsp=$BSP --disable-tests --enable-posix --disable-networking --prefix=$PREFIX | tee configure.log
- if [ $? -ne 0 ]; then
- echo "配置rtems出现错误,中止执行1"
- exit 1
- fi
- if !(grep -q "'make all' will build the following BSPs" configure.log); then
- echo "配置rtems出现错误,中止执行2"
- exit 1
- fi
- echo "如果上面几行出现如下类似语句说明配置成功"
- echo "'make all' will build the following BSPs: stm32f107."
- echo "other BSPs can be built with 'make RTEMS_BSP=\"bsp1 bsp2 ...\"'"
- #echo "按任意键继续。。。" && char=`get_char`
- fi #end CONFIGURE
- if [ $MAKERTEMS = 'yes' ]; then
- echo "编译安装rtems"
- cd $BASEDIR/$TOPDIR/b-$BSP
- make clean
- make
- if [ $? -ne 0 ]; then
- echo "编译安装rtems出现错误,中止执行"
- exit 1
- fi
- #echo "按任意键继续。。。" && char=`get_char`
- make install
- fi #end MAKERTEMS
- if [ $APPLICATION = 'yes' ]; then
- echo "编译应用程序"
- cd $BASEDIR/$TOPDIR/examples-v2/hello/hello_world_c
- make clean
- make
- if [ $? -ne 0 ]; then
- echo "编译应用程序出现错误,中止执行"
- exit 1
- fi
- echo "如果上面几行出现如下类似语句说明编译成功"
- echo " text data bss dec hex filename"
- echo " 76032 1908 129160 207100 328fc o-optimize/hello.exe"
- #echo "按任意键继续。。。" && char=`get_char`
- cd o-optimize
- $TARGET-objdump -x hello.exe > hello.out
- $TARGET-objdump -d -j .start -j .vector -j .text -j .init -j .fini -j .rodata -j .ARM.exidx -j .eh_frame -j .init_array -j .fini_array -j .jcr -j .data -j .bss -j .work -j .comment -j .ARM.attributes hello.exe > hello.S
- $TARGET-objcopy -O binary hello.exe -S hello.bin
- cp hello.exe hello.out hello.S hello.bin $BASEDIR
- fi #end APPLICATION
- time=$SECONDS
- hour=$[$time/3600]
- min=$[$[$time/60]%60]
- sec=$[$time%60]