RTEMS 安装脚本

(嵌入式 实时操作系统 rtos rtems 开发环境 交叉工具链 shell脚本)

RTEMS 安装脚本

rtems_building_v10.sh
转载请注明出处: http://blog.csdn.net/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]
echo "执行时间:$hour小时$min分$sec秒"

复制上述脚本或下载:http://download.csdn.net/detail/zhumaill/7154493

你可能感兴趣的:(shell脚本,开发环境,RTOS,rtems,交叉工具链)