【问题标题】:Calling vcvars from bash script从 bash 脚本调用 vcvars
【发布时间】:2013-03-02 08:32:44
【问题描述】:

我需要在构建不同版本的应用程序的同一 bash 脚本 (msys) 中调用 vcvars32.bat 和 vcvars64.bat。

问题是,即使我能够使用 cmd.exe 命令调用批处理文件,一旦它返回 Visual Studio 变量显然没有设置。

我无法从调用 bash 脚本的外部批处理文件(如 msys.bat)调用 vcvars,因为我需要在同一个脚本中按顺序调用它们。

那么,有没有什么方法可以调用 vcvars 以便在运行时正确设置 bash 脚本中的变量?

【问题讨论】:

  • 唯一的方法似乎是生成一个新的 .sh 文件,其中包含设置变量的代码。这就是here 的完成方式。它是为 cygwin 编写的,但看起来它也可以从 msys 中使用,只是做了一些小的改动。
  • 哪个程序需要变量?另一个批处理文件或 Windows 可执行文件?然后你可以将 vcvars*.bat 与批处理文件捆绑在一起

标签: visual-studio bash batch-file


【解决方案1】:

解决此问题的一种方法是在 vcvars 环境中运行您的命令,而不是尝试将其导出回 bash 端。这就是我们为项目选择的方法。

主要问题是vcvars*.bat 不接受在环境中执行的命令,所以需要用 cmd 做点小技巧。所以我想出了一个名为vcvars_env_run.sh 的简单Bash 脚本,它接受任意参数并将它们转发到调用vcvars64.bat 的cmd.exe。大部分工作是弄清楚如何正确转发带引号的参数,以及 &&、||、返回码等。

我已经在https://github.com/kromain/wsl-utils上传了脚本和一些示例

您可能需要稍微调整一下才能在 vcvars32.bat 和 vcvars64.bat 之间切换,但希望它对您尝试做的事情有所帮助。

【讨论】:

  • 但是使用这种方法,您是否必须等待vcvars* 脚​​本为每次调用运行?在我的系统上,每次都需要几秒钟的烦人时间。 :-/
  • 确实,这是这种方法的一个缺点,您必须等待 vcvars 本身获取源,这需要很长的时间。我希望他们可以在未来的版本中改进这一点。如果他们为 WSL 环境提供等效的脚本,那就更好了。我已经向几个 WSL 项目经理提出了这个要求,让我们看看会不会发生什么。
【解决方案2】:

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 本机进程调用子系统的限制(参数引用是启发式完成的)使得这个辅助文件是必要的。

【讨论】:

    【解决方案3】:

    您需要做的是在批处理脚本中使用命令:“call”。所以它可能看起来像:

    call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
    echo DevEnvDir set to: %DevEnvDir%
    

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

    【讨论】:

    • 不,它在 bash 中不起作用。我刚刚在 bash 中复制了从 vcvars 设置的环境变量。
    • 这个问题适用于 bash 脚本而不是 Windows 脚本。
    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 2014-06-05
    • 2017-10-21
    • 2019-10-31
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多