使用make调用批处理文件并使更改持久化

时间:2009-01-16 11:16:24

标签: windows batch-file makefile

我正在使用makefile(GNU Make)在命令行上使用Visual C ++ Express进行编程。 为此,我必须调用Visual Studio批处理文件 vsvars32.bat 来设置环境。在使用make之前,每次打开新的cmd.exe时都必须这样做。 当我尝试从我的makefile调用批处理文件时,它显然执行批处理文件 一个自己的过程,因为之后的环境是相同的。

所以我的问题是:有没有办法在cmd.exe中执行脚本,就像Linux / Unix bash的内置命令一样?当然,除了在Windows上安装bash之外。

在发布自己的答案后进行修改:

上述问题不太正确,应该是这样的:

是否可以从makefile中调用更改环境的批处理文件,以便更改的环境对makefile中调用的其他程序保持不变?

原始问题的答案是肯定的:您可以使用cmd.exe的内置调用命令。但由于 call 是一个内置命令而不是真正的程序,只有当你从另一个批处理文件中调用一个批处理文件时,它才能在makefile中工作。

6 个答案:

答案 0 :(得分:4)

根据以前的答案汇编的答案:

我制作了一个名为make.bat的批处理文件,其中包含以下内容:

  

调用“%VS90COMNTOOLS%vsvars32.bat”
  调用make.exe%*

这可以胜任。 但是,在makefile中调用一个改变环境的批处理文件,以便为makefile中调用的其他程序保留更改的环境,这似乎是不可能的。

编辑:通过反复调用vsvars32.bat溢出我的PATH变量后,我做了以下更改:

  

如果不是“%VISUALCVARS%”==“TRUE”(
  设置VISUALCVARS = TRUE
  调用“%VS90COMNTOOLS%vsvars32.bat”
  )
  调用make.exe%*

答案 1 :(得分:1)

使用'致电':

@echo off
pushd.
call "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars3235.bat"
msbuild LinqSupportClassesSDKBuild.csproj /t:rebuild /p:Configuration=Release /nologo /v:q /clp:ErrorsOnly;
popd

这是我们用来构建linq提供程序的cmd文件。

答案 2 :(得分:1)

至少在我的Visual Studio安装中(尽管有些古老的VS .NET 2003),VS开始菜单组中的一个链接是打开已经设置了环境的cmd.exe实例。您可能会发现这些有用:

它们更适合从IDE启动命令提示符,但它们确实包含有关使用适当环境启动它的信息,您可能会发现它对您的目的有用。

答案 3 :(得分:1)

如何启动控制台?如果你刚刚启动'cmd',那么创建一个执行的快捷方式(%comspec%解析为c:\ windows \ cmd.exe或者系统上的任何相关内容)

%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86

显然,将路径更改为指向正确的安装文件夹。 更一般地说,正如上面的海报所指出的,如果.cmd文件需要处理另一个.cmd文件而不是将其作为单独的进程启动,请使用'call'批处理命令。

答案 4 :(得分:0)

在脚本中包装GNU make(mmake.bat)。将脚本放在某处的路径中。

脚本本身应该运行vsvars32.bat然后make,就像这样

vsvars32.bat
make %*

据我所知,从另一个脚本调用脚本是在同一个shell中完成的(类似于Bash“。”命令)。

答案 5 :(得分:0)

我找到了解决这个问题的三个方法:

1)如果批处理文件设置的环境变量是静态的(即它们始终是相同的值),请为整个用户配置文件设置这些值。右键单击“我的电脑”,单击“属性” - >“高级” - >“环境变量”。将批处理文件中的变量添加到“用户变量”或“系统变量”部分(用户变量只有您可见,系统变量才能被该计算机的所有用户看到)。

2)编写一个包装批处理文件,调用环境设置脚本,然后调用Makefile。

3)使用SETX命令(需要Windows资源工具包),而不是使用SET命令在批处理文件中设置环境变量。 SETX与SET类似,不同之处在于它对注册表中的主环境进行了更改,并将在将来启动的所有命令提示中生效(但不是当前命令提示符。)