您的位置:首页 > 产品设计 > UI/UE

执行build -ceZ 编译驱动前的小动作1-setenv.bat

2016-05-06 22:12 1031 查看
一直很好奇双击ddk的Checked/free Build Environment跳出的cmd对话框能运行build编译驱动(其实App也行),直接用cmd运行build,却提示找不到可运行的命令。开始时,怀疑环境变量Path没有包含build所在的路径导致不能工作,可是向Path追加了build的路径,虽然可以执行build但仍然不能生成sys。

于是换个思路驱动程序所在的目录下都少不了source/makefile文件,看看这些文件里有没有隐藏什么信息:

source

TARGETNAME=echo
TARGETTYPE=DRIVER

INF_NAME=echo

SOURCES=echo.c


makefile:

!INCLUDE $(NTMAKEENV)\makefile.def


source文件貌似和路径不沾边,倒是makefile隐约跟环境变量有关,到Build Environment看看环境变量NTMAKEENV的值。先声明我把wdk7600安装在C盘根目录下。



NTMAKEENV是ddk根目录的一个子目录,看来是ddk安装时设置了一些脚本,并在双击Build Environment时include进来(个人觉得用linux中source比较贴切)。搜索%DDKROOT%/bin目录下哪个文件设置了这个变量:



如图,NTMAKEENV由setenv.bat设置。如法炮制,看看有谁引用了setenv.bat这个脚本:



然而很可惜,并没有找到谁引用了这个脚本。看来只能在Build Environment这个快捷方式上找门路了。右键快捷方式


目标中的值为"C:\Windows\System32\cmd.exe /k C:\WinDDK\7600.16385.1\bin\setenv.bat C:\WinDDK\7600.16385.1\ chk x86 WXP"

查看ms 对cmd /k的解释:

如果指定了cmd /C 或 /K,命令行开关后的命令行其余部分将作为命令行处理

按他的意思就是由cmd启动C:\WinDDK\7600.16385.1\bin\setenv.bat,并把参数C:\WinDDK\7600.16385.1\ chk x86 WXP传给它。那好,找到设置NTMAKEENV环境变量的入口了。跟到setenv.bat中看看它做了哪些事(仅罗列一些重要的环境变量):

在文件的开头有一行

set BASEDIR=%1 这里%1就是C:\WinDDK\7600.16385.1\

于是set BASEDIR=%1变成了set BASEDIR=C:\WinDDK\7600.16385.1\

命令行参数有chk x86 WXP,因此脚本依次执行

if /I "%1"=="chk" set _FreeBuild=false

...

if /I "%1"=="WXP" set DDK_TARGET_OS=WinXP

...

if /I "%DDK_TARGET_OS%"=="WinXP" goto WXP

:WXP

set _ddkspec=wxp

set _IA32bit=true

这些变量设置了编译版本,编译后二进制文件的文件结构

然后进入:checked分支,

设置优化选项,

set MSC_OPTIMIZATION=/Od /Oi

设置编译相关的变量:

set PROJECT_ROOT=%BASEDIR%\src

set PUBLIC_ROOT=%BASEDIR%

设置头文件包含路径

set Lib=%BASEDIR%\lib

set Include=%BASEDIR%\inc\api

set WPP_CONFIG_PATH=%BASEDIR%\bin\wppconfig

设置编译连接工具路径

set NTMAKEENV=%BASEDIR%\bin

set BUILD_MAKE_PROGRAM=nmake.exe

设置crt,sdk,ddk,wdk头文件路径

set CRT_INC_PATH=%BASEDIR%\inc\crt

set SDK_INC_PATH=%BASEDIR%\inc\api

set DDK_INC_PATH=%BASEDIR%\inc\ddk

set WDM_INC_PATH=%BASEDIR%\inc\ddk

设置lib库路径

set SDK_LIB_DEST=%BASEDIR%\lib\%_ddkspec% --->C:\WinDDK\7600.16385.1\lib\wxp\i386\lib\wxp\i386

set DDK_LIB_DEST=%SDK_LIB_DEST%

set CRT_LIB_PATH=%BASEDIR%\lib\crt\*

正是因为设置了这些inc/lib的路径,因此当我们执行build -cez时不仅能编译驱动程序,还能正确生成native App(有机会会写blog)/win32 App等工程

当一切环境变量设置完成setenv.bat退出,正式进入到cmd交互环境。这时的cmd环境,由于还在同一个终端中,环境变量仍然有效,因此它是一个具有编译环境的强大cmd环境!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: