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
           



点击(此处)折叠或打开

  1. export RTE_SDK=$PWD

解析:获取DPDK 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_/}将for循环每个成员的config/defconfig_替换成空、
  • 在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[@]})  :
  • OPTION_NUM表示所有选项的一个编号,将所有选项对应的执行函数存入到OPTIONS数组中。当选择相应的编号的选项时,则会执行OPTIONS数组对应的执行函数
  • ${OPTIONS[our_entry]} ${our_entry},传入选择的编号,并执行相应选项的函数


点击(此处)折叠或打开

  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}
/home/admin/dpdk_proj/dpdk-1.8.0目录下执行make install T=i686-native-linuxapp-gcc,会执行dpdk根目录的GNUmakefile
12-01 13:53
查看更多