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

3
我正在使用makefile(GNU Make)在命令行上使用Visual C++ Express进行编程。 为了使其工作,我必须调用Visual Studio批处理文件vsvars32.bat来设置环境。每次打开新的cmd.exe之前,在使用make之前都必须这样做。 当我尝试从我的makefile调用批处理文件时,它显然会将批处理文件执行为一个独立的进程,因此环境在之后保持不变。
所以我的问题是:是否有一种像Linux / Unix bash的内置source命令一样在cmd.exe中执行脚本的方法?当然,除了在Windows上安装bash之外。
发布自己的答案后编辑:
上面的问题不太正确,应该是这样的:
是否可能从makefile中调用改变环境的批处理文件,以便对于在makefile中调用的其他程序,更改的环境会持续存在?
原问题的答案是肯定的:您可以使用cmd.exe的内置call命令。但由于call是一个内置命令而不是真正的程序,因此它不适用于makefile,只有在从另一个批处理文件调用批处理文件时才有效。
6个回答

4

从之前的答案中整理得出:

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

call "%VS90COMNTOOLS%vsvars32.bat"
call make.exe %*

这样就可以完成任务了。 但是,在makefile中调用更改环境的批处理文件,以便更改的环境对于在makefile中调用的其他程序保持持久性似乎是不可能的。

编辑: 在多次调用vsvars32.bat导致PATH变量溢出后,我进行了以下更改:

if not "%VISUALCVARS%" == "TRUE" (
set VISUALCVARS=TRUE
call "%VS90COMNTOOLS%vsvars32.bat"
)
call make.exe %*


1

使用 'Call':

@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文件。

1

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

它们更适用于从IDE启动命令提示符,但它们也包括有关使用适当环境启动它的信息,这对您的目的可能有所帮助。


1

你如何启动你的控制台?如果你只是启动“cmd”,那么最好创建一个快捷方式来执行(%comspec% 会解析为 c:\windows\cmd.exe 或者与你系统相关的路径)

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

显然,更改路径以指向正确的安装文件夹。 总的来说,如上面的帖子所指出的,如果一个 .cmd 文件需要处理另一个 .cmd 文件而不是作为单独的进程启动它,则使用 'call' 批处理命令。


0
将GNU make封装在一个脚本(mmake.bat)中。将脚本放在某个路径中。
脚本本身应该运行vsvars32.bat,然后运行make,就像这样。
vsvars32.bat
make %*

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

1
谢谢。我曾考虑过,但是不知道 *%**。但你必须在命令前使用 call - Xenu

0

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接