身為一個open source 的阿宅,只有新toolchain就會很想試用看看,雖然Code Sourcery 每半年才release 一版,但有時候會需要做交插測試要換來要去。之前在晶心科技工作,在強力的toolchain team支援下,二三天就可以有一版新版,一直都缺少一個有方便的方法可以切換toolchain,想記錄一下用過的方法。
基本的工作環境假設是連到沒有sudo 權限的server(這樣本機看叫叫叫片的時候才不會lag)

方法一:設在 PATH 環境變數

export PATH=$HOME/tool/gnuarm/arm-2010q1/bin:$PATH

優點:這就是最常看到的方法 簡單,直覺,霸王硬上弓
缺點:但如果要在同一個shell下換來換去,你的PATH 就會一次次長大,而且每次都要按tab 補齊buildtype,就是none-eabi-ooxx之類的

方法二:用一個link指向現在要用的toolchain,PATH 一直都一樣

export PATH=$HOME/tool/gnuarm/cur/bin #寫在 bashrc
cd ~/tool/gnuarm/
ln -s arm-2010q1 cur

優點:看起來很厲害
缺點:每次都要砍掉重link,然後command cache 要你重新export PATH 後才有效,超蠢,可是我用了很久,忍耐度超高


方法三:在bashrc 裡寫一個小function alias toolchain

#很像這樣,看個人環境
function nds_setup()
{
if [ ! -z $1 && ! -z $2]; then
alias agcc "$2/bin/arm-$1-gcc;
alias agcc "$2/bin/arm-$1-gcc;
alias agcc "$2/bin/arm-$1-gcc;
alias agcc "$2/bin/arm-$1-gcc;
alias agcc "$2/bin/arm-$1-gcc;
fi
}

$nds_setup linux $HOME/tool/gnuarm/arm-2010q1

優點:感覺還不錯,
缺點:實際使用時,都會忘記buildtype(其實是三不五時就在改,不是說ARM),要ls 一下才知道,然後要打二個參數,累....,另外bash 的subshell 不吃alias,下給CROSS_COMPILE 就會爛掉

方法四:用wrapper 吃環境變數決定要選擇那個toolchain

#!/bin/bash
#arm-gcc

if [ ! -z $ARM_TOOLPATH ]; then
$ARM_TOOLPATH/bin/arm-$ARM_TOOLTYPE-gcc $*
fi

優點:指令固定,subshell 可以吃
缺點:還是要看一下buildtype,另外toolchain 裡含binutil 大概有20隻指令,如果每個都寫一隻,之後要改會死人,還是要設二個參數

方法五:比較厲害的wrapper
用有點像busybox的方式,把所有的命令都link到同一隻script,再由script去分辦要執行的程式是什麼,版本為何
優點:好像還不錯
缺點:不知

#!/bin/bash
#set -x

#I assume
# the wrapper command format is "arm-command",
# the origin toolchain name is "arm-what-ever-you-want-gcc
# the gcc must exist

toolname=`echo ${0##/*/} | cut -d '-' -f 2`;
tooltype=`ls $ARM_TOOLPATH/bin/arm-*-gcc`

if [ -z $ARM_TOOLPATH ]; then
echo '$ARM_TOOLPATH' is not set;
exit 1;
fi

if [ ! -e $tooltype ]; then
echo "Can't find tooltype";
exit 1;
fi

tooltype=${tooltype##*arm-}
tooltype=${tooltype%%-gcc}

realtool="$ARM_TOOLPATH/bin/arm-$tooltype-$toolname";

if [ -z $toolname ]; then
echo "Unknown ARM tool";
exit 1;
fi

if [ ! -x $realtool ]; then
"file is not executable"
exit 1;
fi

$realtool $*

arrow
arrow
    全站熱搜

    cmchao 發表在 痞客邦 留言(4) 人氣()