diff --git a/script/create-dist.py b/script/create-dist.py index 7dff4a494b6..e0a373d94fe 100755 --- a/script/create-dist.py +++ b/script/create-dist.py @@ -14,7 +14,8 @@ if sys.platform == "win32": from lib.config import BASE_URL, PLATFORM, enable_verbose_mode, \ get_target_arch, get_zip_name, build_env from lib.util import scoped_cwd, rm_rf, get_electron_version, make_zip, \ - execute, electron_gyp, electron_features + execute, electron_gyp, electron_features, parse_version +from lib.env_util import get_vs_location ELECTRON_VERSION = get_electron_version() @@ -146,22 +147,28 @@ def copy_chrome_binary(binary): os.chmod(dest, os.stat(dest).st_mode | stat.S_IEXEC) def copy_vcruntime_binaries(): - with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"SOFTWARE\Microsoft\VisualStudio\14.0\Setup\VC", 0, - _winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) as key: - crt_dir = _winreg.QueryValueEx(key, "ProductDir")[0] - arch = get_target_arch() if arch == "ia32": arch = "x86" + subkey = r"SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\\" + with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey + arch, 0, + _winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) as key: + runtime_version = _winreg.QueryValueEx(key, "Version")[0][1:] - crt_dir += r"redist\{0}\Microsoft.VC140.CRT\\".format(arch) + version_parts = parse_version(runtime_version) + if len(version_parts) > 3: + runtime_version = '.'.join(version_parts[0:3]) + + vs_location = get_vs_location('[15.0,16.0)') + + crt_dir = os.path.join(vs_location, 'VC', 'Redist', 'MSVC', runtime_version, + arch, 'Microsoft.VC141.CRT') dlls = ["msvcp140.dll", "vcruntime140.dll"] # Note: copyfile is used to remove the read-only flag for dll in dlls: - shutil.copyfile(crt_dir + dll, os.path.join(DIST_DIR, dll)) + shutil.copyfile(os.path.join(crt_dir, dll), os.path.join(DIST_DIR, dll)) TARGET_BINARIES_EXT.append(dll) diff --git a/script/lib/env_util.py b/script/lib/env_util.py index 34b3f14c522..0b40bbfd7c2 100644 --- a/script/lib/env_util.py +++ b/script/lib/env_util.py @@ -3,6 +3,7 @@ from __future__ import print_function import itertools +import os import subprocess import sys @@ -58,31 +59,42 @@ def get_environment_from_batch_command(env_cmd, initial=None): proc.communicate() return result +def get_vs_location(vs_version): + """ + Returns the location of the VS building environment. + + The vs_version can be strings like "[15.0,16.0)", meaning 2017, but not the next version. + """ + + # vswhere can't handle spaces, like "[15.0, 16.0)" should become "[15.0,16.0)" + vs_version = vs_version.replace(" ", "") + + program_files = os.environ.get('ProgramFiles(x86)') + # Find visual studio + proc = subprocess.Popen( + program_files + "\\Microsoft Visual Studio\\Installer\\vswhere.exe " + "-property installationPath " + "-requires Microsoft.VisualStudio.Component.VC.CoreIde " + "-format value " + "-version {0}".format(vs_version), + stdout=subprocess.PIPE) + + location = proc.stdout.readline().rstrip() + return location def get_vs_env(vs_version, arch): """ Returns the env object for VS building environment. - The vs_version can be strings like "[15.0,16.0)", meaning 2017, but not the next version. + vs_version is the version of Visual Studio to use. See get_vs_location for + more details. The arch has to be one of "x86", "amd64", "arm", "x86_amd64", "x86_arm", "amd64_x86", - "amd64_arm", e.g. the args passed to vcvarsall.bat. + "amd64_arm", i.e. the args passed to vcvarsall.bat. """ - # vswhere can't handle spaces, like "[15.0, 16.0)" should become "[15.0,16.0)" - vs_version = vs_version.replace(" ", "") - - # Find visual studio - proc = subprocess.Popen( - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\vswhere.exe " - "-property installationPath " - "-requires Microsoft.VisualStudio.Component.VC.CoreIde " - "-format value " - "-version {0}".format(vs_version), - stdout=subprocess.PIPE) - - location = proc.stdout.readline().rstrip() + location = get_vs_location(vs_version) # Launch the process. vsvarsall = "{0}\\VC\\Auxiliary\\Build\\vcvarsall.bat".format(location) - return get_environment_from_batch_command([vsvarsall, arch]) \ No newline at end of file + return get_environment_from_batch_command([vsvarsall, arch])