工作中用到了一个遗留下来的windows平台的交叉编译工具链,是已经离职的同事编译出来的。功能正常,只是工具链中很多二进制命令中包含了“/cygdrive/h/crosstool。。。”这样的绝对路径,当H盘盘符不幸的分配给光驱或者虚拟光驱的时候,编译等过程中会提示“没有媒介”这样的诡异错误,如果没有H盘或者H盘可读则没问题,没有这方面的知识储备,猜测和搜索路径有关。经过反复测试和查看二进制文件,最终才定位到是这个问题。
接下来就是怎么work around了,重新编译一个工具链自然是最好的办法,但是一方面没做过,另外之前配置好的环境也人去楼空,请人重新做一个也太耗费他人精力和时间了;请每个用户不要设置H盘为光驱,这个就更没有人性,直接pass;最后既然是windows盘符的问题,那就干脆自力更生,把二进制文件中这个h盘盘符改成c盘,虽没有根治(猜测编译时应该能去掉绝对路径依赖,因为另外一个平台的工具链二进制文件中没有绝对路径),但是可以成功绕开。
想清楚后剩下的事情就比较好办,把上次“利用shell脚本修正代码风格”的脚本借用过来即可,代码记录如下:
#!/bin/sh list_alldir(){ for file in $1/* do #echo "cur:$file" if [ -d "$file" ] then echo "dir:$file" list_alldir "$file" elif [ -f "$file" ] then #echo "file:$file" f=`basename $file` cp -R "$file" "$tmp_dir/$f" sed -i 's#/cygdrive/h/crosstool/#/cygdrive/c/crosstool/#g' "$tmp_dir/$f" if ! cmp -s "$file" "$tmp_dir/$f" then echo "!!!!++++get a file : $f ++++!!!!" d=`dirname $file` mkdir -p "$tmp_dir/$d" mv "$tmp_dir/$f" "$tmp_dir/$d/" else rm -f "$tmp_dir/$f" fi fi done } cur=`pwd` stamp=`date +%Y%m%d_%H%M%S` tmp_dir="$cur/$stamp" echo "tmp_dir:$tmp_dir" mkdir "$tmp_dir" if [ $# -gt 0 ] then list_alldir "$1" else list_alldir "." fi