如何使用vcvarsall.bat设置的环境从python脚本调用CMake?

时间:2017-12-07 21:16:14

标签: python visual-studio batch-file cmake

我有一个C ++项目的python脚本,它使用CMake作为构建系统。我想使用CMake Ninja生成器而不是Visual Studio生成器。但是,Ninja生成器期望将环境设置为由Visual Studio安装提供的vcvarsall.bat批处理文件执行。

如果您手动执行所有操作很简单,因为您只需调用vcvarsall.bat文件,在设置正确的环境时获取命令提示符,然后您可以从中发出cmake -G Ninja命令那里。

尝试使用尚未在此类环境中启动的python脚本时,事情变得更加困难。如何从python以编程方式调用vcvarsall.bat文件,然后在该环境中调用cmake?

我认为唯一的方法是从python中激活一个子进程。但我无法想出一个可以完成这项工作的参数列表。

1 个答案:

答案 0 :(得分:1)

我很幸运能够找到自己问题的答案。

这是要使用的正确的python调用:

src_dir   = ... # set your source dir here
build_dir = ... # set your build dir here

# retrieve visual studio installation path using vswhere.
# See: https://github.com/Microsoft/vswhere
vswhere = os.path.join(os.environ['ProgramFiles(x86)'],
                       "Microsoft Visual Studio",
                       "Installer",
                       "vswhere.exe")

# get installation path of Visual Studio 2017
vspath = subprocess.Popen([vswhere, "-property", "installationPath", "-version", "[15,16)"],
                          stdout=subprocess.PIPE).communicate()[0].rstrip()

# build path to vcvarsall.bat file
vcvarsall = os.path.join(vspath, "VC", "Auxiliary", "Build", "vcvarsall.bat")

# vcvarsall.bat changes the current directory to the one specified
# by the environment variable %VSCMD_START_DIR%
my_env = os.environ
my_env["VSCMD_START_DIR"] = build_dir

# set up the environment and then call cmake with Ninja generator
subprocess.call('call "' + vcvarsall + '" x64 && cmake -G Ninja "' + src_dir + '"', shell=True, env=my_env)
相关问题