//=====================================================================
//TITLE:
// setenv_base.cmd文件的修正
//AUTHOR:
// norains
//DATE:
// Friday 17-September-2010
//Environment:
// NULL
//=====================================================================
Porting Kit下面有针对不同编译环境的命令文件,如果使用MDK的话,那么有setenv_MDK3.1.cmd和setenv_MDK3.80a.cmd这两个文件选择。文件名末尾的是相对应的MDK版本,那如果装的是MDK 4.0,没有setenv_MDK4.0.cmd,那应该怎么办呢?其实可以选择setenv_MDK3.80a.cmd来进行替代。原因很简单,我们先查看一下setenv_MDK3.80a.cmd文档。
该文档的内容很简单,主要的语句是:setenv_base.cmd MDK3.80a PORT %*。意义很清楚,仅仅是调用了另外一个文件setenv_base.cmd而已。那么,我们接下来就是看看这个setenv_base.cmd。仔细查看一下会发现,批处理文件首先无论是3.8还是3.1,都是设置相同的环境变量:
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.1" CALL :SET_MDK_VARS
IF /I "%COMPILER_TOOL_VERSION%"=="MDK3.80a" CALL :SET_MDK_VARS
唯一的区别只是这几行:
if "%COMPILER_TOOL_VERSION%"=="MDK3.1" (
set RVCT31BIN=%MDK_TOOL_PATH%/ARM/BIN31
) ELSE (
set RVCT31BIN=%MDK_TOOL_PATH%/ARM/BIN40
)
很明显看出来,3.1和3.8的最大区别只是在于工具所处的文件夹名不同,3.1的是BIN31,而3.8的是BIN40,恰好MDK 4.0的工具也是位于BIN40,这也就是为什么可以采用setenv_MDK3.80a.cmd这个bat文件来对MDK4.0来进行设置的原因。其实如果以后MDK的工具路径有变更,而微软又没有发布相应的bat文件,那么可以在此进行更改。
不过,这个setenv_base.cmd文件微软并没有编写得非常好,如果Porting Kit的安装目录有空格的话,比如:“D:/Program Files/Microsoft .NET Micro Framework/v4.1/Porting Kit”,那么批处理命令就会执行出错,提示如下:‘D:/Program’不是内部或外部命令,也不是可运行的程序或批处理命令。
截图如下所示:
这个问题是因为微软写批处理命令没有考虑到空格的缘故,要修正错误其实很简单,将第30行的这句:
CALL %~dp0/tools/scripts/init.cmd
两端加上双引号即可,即:
"CALL %~dp0/tools/scripts/init.cmd"
当然咯,这样加上去之后,会产生一个有趣的问题。比如port kiting装在D盘,正常来说,目录应该是:
D:/Program files/port kiting/tools/scripts/init.cmd
但按如上批处理的写法,目录会变成这样:
D:/Program files/port kiting//tools/scripts/init.cmd
仔细观察的话,在tools前面会多一个斜杠。不过,系统会自动将两个斜杠当成一个对待,所以还是能正常调用批处理文件。
如果想要完美,之前的那批处理语句应该变成:
"CALL %~dp0tools/scripts/init.cmd"
不过这样虽然是完美了,但%~dp0和tools却混杂在了一起,不利于人的观看。反正多一个斜杠对系统而言都是一样的,建议还是改成之前的写法,至少我们人看着舒坦,要操心的就让机器去操心吧。
说了那么多,那这个setenv_MDK3.80a.cmd应该怎么使用呢?叶帆的文章说直接在命令行输入setenv_MDK3.80a.cmd(见http://blog.csdn.net/yefanqiu/archive/2010/01/01/5117554.aspx的第4点),但这不一定符合我们系统的要求。因为直接点击的话,那么默认的路径为c:/keil/arm,如果要MDK的路径不是安装在这个目录,那么应该是这样调用,如:
setenv_MDK3.80a.cmd d:/ Keil/ARM
看起来很简单,那是因为路径没有空格。如果MDK的安装目录带有空格,那就很郁闷了,比如路径是D:/Program Files/Keil文件夹下,如果你是直接这么调用的话:
setenv_MDK3.80a.cmd d:/Program Files/Keil/ARM
那么很遗憾,系统会提示错误:
Error - Invalid argument. Usage: setenv.cmd MDK_TOOL_PATH
Example: setenv.cmd c:/Keil/ARM
那么,我们可不可以将路径用””来括起来呢?加入我们输入的指令更改如下:
setenv_MDK3.80a.cmd "d:/Program Files/Keil/ARM"
那么还是会有错,只不过提示错误变成:
‘D:/Program’不是内部或外部命令,也不是可运行的程序或批处理命令
除此以外,还有另外一个:
此时不应有 Files/Keil/ARM ""=""
这个错误产生的原因是因为windows将括号也当成形参传递给了批处理命令。但如果不用括号,因为有空格,所以windows又会认为它是两个形参。
解决方法很简单,我们看看setenv_base.cmd文件的第22行:
SET ARG3=%3
将它更改为:
SET ARG3=%~3
该语句的意思是,如果有两侧有"的话,会自动除去;如果不存在,则维持原有的字符串。