NuttX 安装脚本


NuttX(5)
作者同类文章 X
(2014年4月12日修改)
(嵌入式 实时操作系统 rtos nuttx 开发环境 交叉工具链 shell脚本)

NuttX 安装脚本

nuttx_building_v12.sh
转载请注明出处: http://blog.csdn.net/zhumaill/article/details/22821843

已测试的 Linux 发行版:
        linuxmint-16-cinnamon-64bit/32bit
        ubuntu-13.10-amd64/i386
        debian-7.4-gnome-amd64/i386
        debian-7.4-xfce-amd64/i386(要使用 Qt Creator 或 Eclipse 需额外的设置)
        crunchbang-11-amd64/i686
[ruby] view plain copy print ?
  1. #!/bin/bash  
  2.   
  3. #nuttx7.1在linuxmint-16-cinnamon-64bit上测试通过  
  4.   
  5. #设置  
  6. BASEDIR=`pwd`  
  7. TOPDIR=my_nuttx  
  8. BOARD=shenzhou  
  9. TARGETCONFIG=shenzhou/nsh  
  10. COMMIT=nuttx-7.1  
  11.   
  12. gmp_name=gmp-5.1.3.tar.xz  
  13. mpfr_name=mpfr-3.1.2.tar.xz  
  14. mpc_name=mpc-1.0.2.tar.gz  
  15. binutils_name=binutils-2.24.tar.bz2  
  16. gcc_name=gcc-4.8.2.tar.bz2  
  17. gmp_basename=`echo $gmp_name | awk -F. 'NF-=2' OFS=.`  
  18. mpfr_basename=`echo $mpfr_name | awk -F. 'NF-=2' OFS=.`  
  19. mpc_basename=`echo $mpc_name | awk -F. 'NF-=2' OFS=.`  
  20. binutils_basename=`echo $binutils_name | awk -F. 'NF-=2' OFS=.`  
  21. gcc_basename=`echo $gcc_name | awk -F. 'NF-=2' OFS=.`  
  22.   
  23. #“按任意键继续。。。”的处理函数  
  24. get_char()  
  25. {  
  26.   SAVEDSTTY=`stty -g`  
  27.   stty -echo  
  28.   stty raw  
  29.   dd if=/dev/tty bs=1 count=1 2> /dev/null  
  30.   stty -raw  
  31.   stty echo  
  32.   stty $SAVEDSTTY  
  33. }  
  34.   
  35. usage()  
  36. {  
  37. cat <<EOF  
  38.   -d             下载安装并创建压缩包->编译nuttx  
  39.   -e             从本地压缩包安装->编译nuttx  
  40.   -m             编译nuttx  
  41.   
  42. EOF  
  43. }  
  44.   
  45. if [ -z "$1" ]; then  
  46.   usage  
  47.   exit 1  
  48. fi  
  49.   
  50. DOWNLOAD=no  
  51. EXTRACT=no  
  52. MAKE_NUTTX=no  
  53.   
  54. while getopts debcma OPT  
  55. do  
  56.   case "$OPT" in  
  57.     d) DOWNLOAD=yes; MAKE_NUTTX=yes;;  
  58.     e) EXTRACT=yes; MAKE_NUTTX=yes;;  
  59.     m) MAKE_NUTTX=yes;;  
  60.     *) usage; exit 1;;  
  61.   esac  
  62. done  
  63.   
  64.   
  65.   
  66. if [ $DOWNLOAD = 'yes' ] || [ $EXTRACT = 'yes' ]; then  
  67.   
  68. echo "安装依赖项"  
  69. sudo apt-get -d update 2>&1 | tee apt-get_update.log  
  70. if (grep -q -E '^E:|^Err|^W:' apt-get_update.log); then  
  71.   if (grep -q '/var/lib/apt/lists/lock' apt-get_update.log); then  
  72.     sudo rm -vf /var/lib/apt/lists/*  
  73.     sudo apt-get update  
  74.     if [ $? -ne 0 ]; then  
  75.       echo "更新源出现错误,请稍候重试1"  
  76.       exit 1  
  77.     fi  
  78.   else  
  79.     echo "更新源出现错误,请稍候重试2"  
  80.     exit 1  
  81.   fi  
  82. fi  
  83. sudo apt-get install -y git build-essential bison flex gcc-multilib zlib1g-dev gperf libncurses5-dev texinfo autoconf automake libtool curl gettext libgmp-dev pkg-config  
  84. if [ $? -ne 0 ]; then  
  85.   echo "安装依赖项出现错误,请稍候重试1"  
  86.   exit 1  
  87. fi  
  88. sudo apt-get install -y  libgmp3-dev libmpc-dev libmpfr-dev  #linuxmint、ubuntu不需要  
  89. if [ $? -ne 0 ]; then  
  90.   echo "安装依赖项出现错误,请稍候重试2"  
  91.   exit 1  
  92. fi  
  93. #echo "按任意键继续。。。" && char=`get_char`  
  94.   
  95.   
  96.   
  97. if [ $DOWNLOAD = 'yes' ]; then  
  98.   echo "下载安装并创建压缩包"  
  99.   which proz > /dev/null 2>&1  
  100.   if [ $? -ne 0 ]; then  
  101.   echo "安装多线程下载工具"  
  102.     wget -c http://dxdown1.onlinedown.net/down/prozilla-2.0.4.tar.zip  
  103.     unzip prozilla-2.0.4.tar.zip prozilla-2.0.4.tar.bz2  
  104.     tar -xf prozilla-2.0.4.tar.bz2  
  105.     rm prozilla-2.0.4.tar.zip prozilla-2.0.4.tar.bz2  
  106.     cd prozilla-2.0.4  
  107.     sed -i 's/DL_Window:://' src/download_win.h  
  108.     ./configure  
  109.     make  
  110.     sudo make install  
  111.     cd ..  
  112.   fi  
  113.   which proz > /dev/null 2>&1  
  114.   if [ $? -ne 0 ]; then  
  115.     echo "安装多线程下载工具出现错误,中止运行"  
  116.     exit 1  
  117.   fi  
  118.   if [ -d "$TOPDIR" ]; then  
  119.     echo "错误:目录$TOPDIR已经存在"  
  120.     exit 1  
  121.   fi  
  122.   mkdir $TOPDIR  
  123.   cd $TOPDIR  
  124.   
  125.   down_cmd='proz -k=20 '  
  126.   host1='http://mirrors.ustc.edu.cn/gnu'  
  127.   #host2='http://mirror.bjtu.edu.cn/gnu'  
  128.   $down_cmd$host1/gmp/$gmp_name  
  129.   $down_cmd$host1/mpfr/$mpfr_name  
  130.   $down_cmd$host1/mpc/$mpc_name  
  131.   $down_cmd$host1/binutils/$binutils_name  
  132.   $down_cmd$host1/gcc/$gcc_basename/$gcc_name  
  133.   
  134.   session_id=`curl http://sourceforge.net/p/nuttx/git/ci/$COMMIT/tree/  | awk -F \" '/_session_id/{for(i=1; i<=NF; i++) if($i ~ /value/) print $i+1}'`  
  135.   for ((i=1; i<=10; i++)); do  
  136.     echo "获取http下载地址第$i次尝试"  
  137.     nuttx_http_url=`curl -d "path=&_session_id=$session_id" http://sourceforge.net/p/nuttx/git/ci/$COMMIT/tarball | awk -F \' '/window.location.href/{for(i=1; i<=NF; i++) if($i ~ /nuttx-git-/) print $i}'`  
  138.     if [ -n "$nuttx_http_url" ]; then  
  139.       break  
  140.     fi  
  141.     sleep 4s  
  142.   done  
  143.   echo "nuttx_http_url=$nuttx_http_url"  
  144.   
  145.   $down_cmd$nuttx_http_url  
  146.   if [ $? -ne 0 ]; then  
  147.     echo "http下载失败,使用git下载"  
  148.     git clone -b $COMMIT git://git.code.sf.net/p/nuttx/git nuttx-code  
  149.     if [ $? -ne 0 ]; then  
  150.       echo "git下载失败,中止执行"  
  151.       exit 1  
  152.     fi  
  153.     mv nuttx-code/* .  
  154.     rm -rf nuttx-code  
  155.   else  
  156.     nuttx_http_pkg=`echo $nuttx_http_url | awk -F '/' '{print $NF}'`  
  157.     nuttx_http_dir=`echo $nuttx_http_pkg | awk -F '.' '{print $1}'`  
  158.     unzip -q $nuttx_http_pkg   
  159.     mv $nuttx_http_dir/* .  
  160.     rm -rf $nuttx_http_pkg $nuttx_http_dir  
  161.   fi  
  162.   
  163.   cd ..  
  164.   echo "打包..."  
  165.   tar -zcf $TOPDIR-$(date +%Y%m%d-%H%M%S).tar.gz $TOPDIR  
  166.                        
  167. else  
  168.   echo "从本地压缩包安装"  
  169.   nuttx_pkg=`find . -maxdepth 1 -type f -name "$TOPDIR-????????-??????.tar.gz" | sort -r | head -1`  
  170.   if [ -z "$nuttx_pkg" ]; then  
  171.     echo "错误:没有找到压缩包,中止执行"  
  172.     exit 1  
  173.   fi  
  174.   if [ -d "$TOPDIR" ]; then  
  175.     echo "错误:目录$TOPDIR已经存在"  
  176.     exit 1  
  177.   fi  
  178.   echo "解包..."  
  179.   tar -xf $nuttx_pkg  
  180. fi  
  181. #echo "按任意键继续。。。" && char=`get_char`  
  182.   
  183. echo "编译安装kconfig-frontends"  
  184. cd $BASEDIR/$TOPDIR/misc/tools/kconfig-frontends  
  185. ./bootstrap  
  186. ./configure --enable-mconf  
  187. LD_RUN_PATH=/usr/local/lib make  
  188. if [ $? -ne 0 ]; then  
  189.   echo "编译安装kconfig-frontends出现错误,中止执行"  
  190.   exit 1  
  191. fi  
  192. #echo "按任意键继续。。。" && char=`get_char`  
  193. sudo make install  
  194.   
  195. echo "编译库"  
  196. cd $BASEDIR/$TOPDIR  
  197. tar -xf $gmp_name  
  198. tar -xf $mpfr_name  
  199. tar -xf $mpc_name  
  200.   
  201. mkdir b-gmp  
  202. cd b-gmp  
  203. ../$gmp_basename/configure && make && sudo make install  
  204. cd ..  
  205. mkdir b-mpfr  
  206. cd b-mpfr  
  207. ../$mpfr_basename/configure && make && sudo make install  
  208. cd ..  
  209. mkdir b-mpc  
  210. cd b-mpc  
  211. ../$mpc_basename/configure && make && sudo make install  
  212. cd ..  
  213.   
  214. echo "nuttx配置"  
  215. cd $BASEDIR/$TOPDIR/nuttx/tools  
  216. ./configure.sh $TARGETCONFIG  
  217. if [ $? -ne 0 ]; then  
  218.   echo "nuttx配置出现错误,中止执行"  
  219.   exit 1  
  220. fi  
  221.   
  222. echo "删除多余的目录"  
  223. cd $BASEDIR/$TOPDIR/nuttx  
  224. cp -r ../nuttx ../nuttx_backup  
  225.   
  226. del_dir=`find configs -maxdepth 1 -type d`  
  227. del_dir=`echo $del_dir | sed "s,configs,,"`  
  228. del_dir=`echo $del_dir | sed "s,configs/$BOARD,,"`  
  229. for i in $del_dirdo  
  230.   echo "删除$i"  
  231.   rm -rf $i  
  232.   sed -i "s,^source \"$i/Kconfig\",# &," configs/Kconfig  
  233. done  
  234.   
  235. del_dir=`find arch -maxdepth 1 -type d`  
  236. del_dir=`echo $del_dir | sed "s,arch,,"`  
  237. retain_dir=`awk -F \" '/^CONFIG_ARCH=/{print $2}' .config`  
  238. del_dir=`echo $del_dir | sed "s,arch/$retain_dir,,"`  
  239. for i in $del_dirdo  
  240.   echo "删除$i"  
  241.   rm -rf $i  
  242.   sed -i "s,^source $i/Kconfig,# &," arch/Kconfig  
  243. done  
  244.   
  245. if [ $retain_dir="arm" ]; then  
  246.   del_dir=`find arch/arm/src -maxdepth 1 -type d`  
  247.   del_dir=`echo $del_dir | sed "s,arch/arm/src,,"`  
  248.   del_dir=`echo $del_dir | sed "s,arch/arm/src/common,,"`  
  249.   retain_dir=`awk -F \" '/^CONFIG_ARCH_FAMILY=/{print $2}' .config`  
  250.   del_dir=`echo $del_dir | sed "s,arch/arm/src/$retain_dir,,"`  
  251.   retain_dir=`awk -F \" '/^CONFIG_ARCH_CHIP=/{print $2}' .config`  
  252.   del_dir=`echo $del_dir | sed "s,arch/arm/src/$retain_dir,,"`  
  253.   for i in $del_dirdo  
  254.     echo "删除$i"  
  255.     rm -rf $i  
  256.     sed -i "s,^source $i/Kconfig,# &," arch/arm/Kconfig  
  257.   done  
  258. fi  
  259. #echo "按任意键继续。。。" && char=`get_char`  
  260.   
  261. echo "编译buildroot"  
  262. cd $BASEDIR/$TOPDIR/nuttx  
  263. sed -i 's,^CONFIG_ARMV7M_TOOLCHAIN_CODESOURCERYW=y,# CONFIG_ARMV7M_TOOLCHAIN_CODESOURCERYW is not set,' .config  
  264. sed -i 's,^# CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT is not set,CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y,' .config  
  265. make context  
  266. if [ $? -ne 0 ]; then  
  267.   echo "编译buildroot出现错误,中止执行1"  
  268.   exit 1  
  269. fi  
  270. #echo "按任意键继续。。。" && char=`get_char`  
  271.   
  272. cd $BASEDIR/$TOPDIR/misc/buildroot  
  273. sed -i 's,$(WGET) -P $(DL_DIR) $(BINUTILS_SITE)/$(BINUTILS_SOURCE),mv $(TOPDIR)/../../$(BINUTILS_SOURCE) $(DL_DIR),' toolchain/binutils/binutils.mk  
  274. sed -i 's,$(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE),mv $(TOPDIR)/../../$(GCC_SOURCE) $(DL_DIR),' toolchain/gcc/gcc-nuttx-4.x.mk  
  275. cp configs/cortexm3-eabi-defconfig-4.8.2 .config  
  276. sed -i 's,BR2_PACKAGE_NXFLAT=y,# BR2_PACKAGE_NXFLAT is not set,' .config  
  277. sed -i '/BR2_PACKAGE_GENROMFS/a# BR2_PACKAGE_KCONFIG_FRONTENDS is not set\n# BR2_NCONF_FRONTEND is not set\n# BR2_GCONF_FRONTEND is not set\n# BR2_QCONF_FRONTEND is not set' .config  
  278.   
  279. make oldconfig  
  280. if [ $? -ne 0 ]; then  
  281.   echo "编译buildroot出现错误,中止执行2"  
  282.   exit 1  
  283. fi  
  284. #echo "按任意键继续。。。" && char=`get_char`  
  285. make  
  286. if [ $? -ne 0 ]; then  
  287.   echo "编译buildroot出现错误,中止执行3"  
  288.   exit 1  
  289. fi  
  290. #echo "按任意键继续。。。" && char=`get_char`  
  291.   
  292. fi  #end [ $DOWNLOAD = 'yes' ] || [ $EXTRACT = 'yes' ]  
  293.   
  294.   
  295.   
  296. if [ $MAKE_NUTTX = 'yes' ]; then  
  297.   
  298. echo "编译nuttx"  
  299. cd $BASEDIR/$TOPDIR/nuttx  
  300. sed -i 's,^# CONFIG_RAW_BINARY is not set,CONFIG_RAW_BINARY=y,' .config  
  301. sed -i 's,^CONFIG_TASK_NAME_SIZE=0,CONFIG_TASK_NAME_SIZE=16,' .config  
  302. sed -i 's,^CONFIG_NSH_IPADDR=0x0a000002,CONFIG_NSH_IPADDR=0xc0a8020a,' .config    #192.168.2.10  
  303. sed -i 's,^CONFIG_NSH_DRIPADDR=0x0a000001,CONFIG_NSH_DRIPADDR=0xc0a80201,' .config    #192.168.2.1  
  304. if !(grep -q '  @echo "DUMP: $(BIN).out"' Makefile.unix); then  
  305.   sed -i '/pass2:/,/^$/{  
  306.     /^$/i\  @echo "DUMP: $(BIN).out"  
  307.     /^$/i\  $(Q) $(OBJDUMP) -x $(BIN) > $(HOME)/$(BIN).out  
  308.     /^$/i\  @echo "DUMP: $(BIN).S"  
  309.     /^$/i\  $(Q) $(OBJDUMP) -d -j .text -j .init_section -j .ARM.exidx -j .data -j .bss $(BIN) > $(HOME)/$(BIN).S  
  310.     /^$/i\  cp -f $(BIN) $(BIN).hex $(BIN).bin $(HOME)  
  311.   }' Makefile.unix  
  312. fi  
  313.   
  314. TOOLCHAIN_BIN=$BASEDIR/$TOPDIR/misc/buildroot/build_arm_nofpu/staging_dir/bin  
  315. TOOLS_DIR=$BASEDIR/$TOPDIR/nuttx/configs/$BOARD/tools  
  316. if !(grep -q "PATH=\"$TOOLCHAIN_BIN:$TOOLS_DIR:\$PATH\"" $HOME/.profile); then  
  317.   echo >> $HOME/.profile  
  318.   echo PATH=\"$TOOLCHAIN_BIN:$TOOLS_DIR:\$PATH\" >> $HOME/.profile  #重起生效  
  319. fi  
  320. if !(echo $PATH | grep -q "$TOOLCHAIN_BIN:$TOOLS_DIR"); then  
  321.   export PATH=$TOOLCHAIN_BIN:$TOOLS_DIR:$PATH  
  322. fi  
  323.   
  324. make  
  325.   
  326. fi  #end MAKE_NUTTX  
  327.   
  328. time=$SECONDS  
  329. hour=$[$time/3600]  
  330. min=$[$[$time/60]%60]  
  331. sec=$[$time%60]  
  332. echo "执行时间:$hour小时$min分$sec秒"  

使用上述脚本安装 NuttX 之后,在 Qt Creator 或 Eclipse 中以导入现有项目的方式新建项目,无需其它设置,点击构建按钮即可进行编译。

你可能感兴趣的:(NuttX 安装脚本)