Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439084
  • 博文数量: 71
  • 博客积分: 26
  • 博客等级: 民兵
  • 技术积分: 1246
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 14:46
个人简介

linux --- 一切皆文件

文章分类

全部博文(71)

文章存档

2021年(1)

2019年(2)

2018年(4)

2017年(7)

2016年(11)

2015年(1)

2014年(2)

2013年(33)

2012年(10)

分类: LINUX

2016-03-01 00:29:59

dpdk中/home/admin/dpdk_proj/dpdk-1.8.0/tools/setup.sh脚本解析:

点击(此处)折叠或打开

  1. cd $(dirname ${BASH_SOURCE[0]})/..


解析:${BASH_SOURCE}  获取执行脚本的路径
脚本路径:/home/admin/a.sh
在/var目录下执行脚本 ../home/admin/a.sh, ${BASH_SOURCE}输出为../home/admin/a.sh
使用绝对路径/home/admin/a.sh,${BASH_SOURCE}输出为/home/admin/a.sh
           
${BASH_SOURCE[0]} :获取文件路径,包括文件名。/home/admin/a.sh
$(dirname ${BASH_SOURCE[0]}):获取给定路径的目录部分,/home/admin
$(dirname ${BASH_SOURCE[0]})/..:获取路径的上一级目录,/home

dpdk主目录如下/home/admin/dpdk_proj/dpdk-1.8.0,setup.sh脚本在/home/admin/dpdk_proj/dpdk-1.8.0/tools/setup.sh。在dpdk主目录下执行./tools/setup.sh,
$(dirname ${BASH_SOURCE[0]})/..命令获取的是tools/..目录,即/home/admin/dpdk_proj/dpdk-1.8.0。cd 到tools/..目录。


点击(此处)折叠或打开

  1. export RTE_SDK=$PWD

解析:获取DPDK SDK的根目录
当前已经到达tools/..目录,通过pwd获取目录绝对路径,/home/admin/dpdk_proj/dpdk-1.8.0。
export RTE_SDK,使得RTE_SDK成为一个环境变量,在此脚本的所有子进程中都可使用。

点击(此处)折叠或打开

  1. STEPS[1]="step1_func"
  2. STEPS[2]="step2_func"
  3. STEPS[3]="step3_func"
  4. STEPS[4]="step4_func"
  5. STEPS[5]="step5_func"

解析:用一个数组,存储5个功能函数。


点击(此处)折叠或打开

  1. step1_func()
  2. {
  3.     TITLE="Select the DPDK environment to build"
  4.     CONFIG_NUM=1
  5.     for cfg in config/defconfig_* ; do
  6.     cfg=${cfg/config\/defconfig_/}
  7.     TEXT[$CONFIG_NUM]="$cfg"
  8.     TARGETS[$CONFIG_NUM]=$cfg
  9.     FUNC[$CONFIG_NUM]="setup_target"
  10.     let "CONFIG_NUM+=1"
  11.     done
  12. }

解析:
  • 设置TITLE变量,每个函数都会去设置,标识此函数的功能。
  • CONFIG_NUM用于计数
  • 获取config目录下所有defconfig文件,每个defconfig文件对应一种编译环境
cfg的值:
config/defconfig_i686-native-linuxapp-gcc
config/defconfig_i686-native-linuxapp-icc
config/defconfig_ppc_64-power8-linuxapp-gcc
config/defconfig_x86_64-ivshmem-linuxapp-gcc
config/defconfig_x86_64-ivshmem-linuxapp-icc
config/defconfig_x86_64-native-bsdapp-clang
config/defconfig_x86_64-native-bsdapp-gcc
config/defconfig_x86_64-native-linuxapp-clang
config/defconfig_x86_64-native-linuxapp-gcc
config/defconfig_x86_64-native-linuxapp-icc

  • ${cfg/config\/defconfig_/}将for循环每个成员的config/defconfig_替换成空、
cfg值:
i686-native-linuxapp-gcc
i686-native-linuxapp-icc
ppc_64-power8-linuxapp-gcc
x86_64-ivshmem-linuxapp-gcc
x86_64-ivshmem-linuxapp-icc
x86_64-native-bsdapp-clang
x86_64-native-bsdapp-gcc
x86_64-native-linuxapp-clang
x86_64-native-linuxapp-gcc
x86_64-native-linuxapp-icc

  • 在TEXT存储每种编译环境名称
  • 在TARGETS存储每种编译环境名称,用于make时获取T参数
  • 在FUNC存放每种编译环境所对应的功能函数

点击(此处)折叠或打开

  1. QUIT=0
  2. while [ "$QUIT" == "0" ]; do
  3.     OPTION_NUM=1
  4.     for s in $(seq ${#STEPS[@]}) ; do
  5.         ${STEPS[s]}
  6.         echo "----------------------------------------------------------"
  7.         echo " Step $s: ${TITLE}"
  8.         echo "----------------------------------------------------------"
  9.         for i in $(seq ${#TEXT[@]}) ; do
  10.             echo "[$OPTION_NUM] ${TEXT[i]}"
  11.             OPTIONS[$OPTION_NUM]=${FUNC[i]}
  12.             let "OPTION_NUM+=1"
  13.         done
  14.     # Clear TEXT and FUNC arrays before next step
  15.     unset TEXT
  16.     unset FUNC
  17.     echo ""
  18.     done
  19.     echo "[$OPTION_NUM] Exit Script"
  20.     OPTIONS[$OPTION_NUM]="quit"
  21.     echo ""
  22.     echo -n "Option: "
  23.     read our_entry
  24.     echo ""
  25.     ${OPTIONS[our_entry]} ${our_entry}
  26.     echo
  27.     echo -n "Press enter to continue ..."; read
  28. done

解析:
  • $(seq ${#STEPS[@]})  :
STEPS[@]获取STEPS数组的所有成员
${#STEPS[@]}的${# array}获取成员的个数
${seq num},枚举数字,当num等于3时,${seq 3}扩展成1,2,3

  • OPTION_NUM表示所有选项的一个编号,将所有选项对应的执行函数存入到OPTIONS数组中。当选择相应的编号的选项时,则会执行OPTIONS数组对应的执行函数
  • ${OPTIONS[our_entry]} ${our_entry},传入选择的编号,并执行相应选项的函数
编译环境选项如下:
----------------------------------------------------------
 Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] i686-native-linuxapp-gcc
[2] i686-native-linuxapp-icc
[3] ppc_64-power8-linuxapp-gcc
[4] x86_64-ivshmem-linuxapp-gcc
[5] x86_64-ivshmem-linuxapp-icc
[6] x86_64-native-bsdapp-clang
[7] x86_64-native-bsdapp-gcc
[8] x86_64-native-linuxapp-clang
[9] x86_64-native-linuxapp-gcc
[10] x86_64-native-linuxapp-icc


点击(此处)折叠或打开

  1. setup_target()
  2. {
  3.     option=$1
  4.     export RTE_TARGET=${TARGETS[option]}
  5.     compiler=${RTE_TARGET##*-}
  6.     if [ "$compiler" == "icc" ] ; then
  7.         platform=${RTE_TARGET%%-*}
  8.         if [ "$platform" == "x86_64" ] ; then
  9.             setup_icc intel64
  10.         else
  11.             setup_icc ia32
  12.         fi
  13.     fi
  14.     if [ "$QUIT" == "0" ] ; then
  15.         make install T=${RTE_TARGET}
  16.     fi
  17.     echo "------------------------------------------------------------------------------"
  18.     echo " RTE_TARGET exported as $RTE_TARGET"
  19.     echo "------------------------------------------------------------------------------"
  20. }
解析:
  • export RTE_TARGET=${TARGETS[option]}获取相应的编译环境,作为make的T
  • 此处只解释编译环境使用gcc的情况,make install T=${RTE_TARGET}
假设我们选择编译环境为[1] i686-native-linuxapp-gcc:
/home/admin/dpdk_proj/dpdk-1.8.0目录下执行make install T=i686-native-linuxapp-gcc,会执行dpdk根目录的GNUmakefile

阅读(4792) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~