调用vcvars从bash脚本

7
我需要在同一个bash脚本(msys)中调用vcvars32.bat和vcvars64.bat,以构建我的应用程序的不同版本。问题是,即使我能够使用cmd.exe命令调用批处理文件,一旦它返回,Visual Studio变量显然没有设置。我不能从外部批处理文件(如msys.bat)中调用vcvars,该批处理文件调用bash脚本,因为我需要在同一个脚本中按顺序调用它们两个。那么,有没有办法调用vcvars以正确设置bash脚本中正在运行的变量?

唯一的方法似乎是生成一个新的.sh文件,其中包含设置变量的代码。这就是这里的做法。它是为cygwin编写的,但看起来也可以在msys中使用,只需要进行一些小的更改即可。 - Reinier Torenbeek
哪个程序需要变量?另一个批处理文件还是Windows可执行文件?然后您可以将vcvars*.bat与该批处理文件捆绑在一起。 - jeb
3个回答

3
一个解决方法是在vcvars环境中运行您的命令,而不是试图将其导出回bash端。这是我们项目采取的方法。
主要问题是vcvars*.bat不接受在环境中执行的命令,因此需要使用cmd进行一些技巧性操作。我编写了一个名为vcvars_env_run.sh的简单Bash脚本,它接受任意参数并将其转发到已调用vcvars64.bat的cmd.exe上。大部分工作是找出如何正确转发带引号的参数,以及像&&、||、返回代码等等的东西。
我已经将脚本和一些示例上传到https://github.com/kromain/wsl-utils 您可能需要微调一下以在vcvars32.batvcvars64.bat之间切换,但希望它对您尝试做的事情有所帮助。

但是使用这种方法,你需要等待每次调用时vcvars*脚本运行吗?在我的系统上,每次都要等待几秒钟,非常烦人。 :-/ - SO_fix_the_vote_sorting_bug
确实,这种方法的缺点是你必须等待vcvars本身被源化,这需要非常长的时间,令人非常烦恼。我希望他们在未来的版本中能够改进这一点。更好的方法是为WSL环境提供一个等效的脚本。我已经向几位WSL项目经理提出了这个请求,让我们看看是否会有任何进展。 - Romain Pokrzywka

0

POSIX shell的export -p命令会打印出所有环境变量的值,以便通过eval命令重新创建这些值。其思路是在vcvars*.bat运行后从子shell中调用此命令,并在顶层脚本中eval捕获的输出。

Cygwin环境变量设置脚本可以按以下方式获取vcvars*.bat的结果:

eval "$($(cygpath "$COMSPEC") /c vcvars_export "$vcvars_bat" "$(
                cygpath -w "$SHELL")")"

其中vcvars_bat包含相关vcvars*.bat文件的路径。您可以在x64 Native Tools Command Prompt for VS 2019.lnk文件的目标中找到此值,该文件可以使用readlink -t读取。(还要注意,vcvarsall.bat脚本允许指定要使用的编译器和SDK版本,在需要精确控制时非常有用)。

本地的vcvars_export.bat文件包含

@echo off
call %1 > nul
"%2" -c "export -p"

Cygwin 本地进程调用子系统的限制(参数引用是基于启发式算法完成的)使得这个辅助文件是必需的。

-1
你需要做的是在批处理脚本中使用命令:"call"。因此,它可能看起来像这样:
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
echo DevEnvDir set to: %DevEnvDir%

如果您不使用“call”,则在vcvars32.bat退出后,脚本将退出并且不会运行任何其他命令。


不,它不能在bash中工作。我只是在bash中复制了从vcvars设置的环境变量。 - martjno
该问题适用于Bash脚本编程,而非Windows脚本编程。 - Richard Jessop

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