我有一个C ++项目的python脚本,它使用CMake作为构建系统。我想使用CMake Ninja生成器而不是Visual Studio生成器。但是,Ninja生成器期望将环境设置为由Visual Studio安装提供的vcvarsall.bat
批处理文件执行。
如果您手动执行所有操作很简单,因为您只需调用vcvarsall.bat
文件,在设置正确的环境时获取命令提示符,然后您可以从中发出cmake -G Ninja
命令那里。
尝试使用尚未在此类环境中启动的python脚本时,事情变得更加困难。如何从python以编程方式调用vcvarsall.bat
文件,然后在该环境中调用cmake?
我认为唯一的方法是从python中激活一个子进程。但我无法想出一个可以完成这项工作的参数列表。
答案 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)