Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2914)

Unified Diff: build/vs_toolchain.py

Issue 2878693002: Make the PGO profiling step work with VS2017 (Closed)
Patch Set: Address Scott's comments. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | build/win/run_pgo_profiling_benchmarks.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/vs_toolchain.py
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index 1004d9e27a455f36a860f5091d77f9e3970df576..0ff51815212da7198fc521eedaf1f45ffefe5cd6 100755
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -8,6 +8,7 @@ import json
import os
import pipes
import platform
+import re
import shutil
import stat
import subprocess
@@ -51,8 +52,8 @@ def SetEnvironmentAndGetRuntimeDllDirs():
win_sdk = toolchain_data['win8sdk']
wdk = toolchain_data['wdk']
# TODO(scottmg): The order unfortunately matters in these. They should be
- # split into separate keys for x86 and x64. (See CopyVsRuntimeDlls call
- # below). http://crbug.com/345992
+ # split into separate keys for x86 and x64. (See CopyDlls call below).
+ # http://crbug.com/345992
vs_runtime_dll_dirs = toolchain_data['runtime_dirs']
os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain
@@ -170,17 +171,6 @@ def DetectVisualStudioPath():
' not found.') % (version_as_year))
-def _VersionNumber():
- """Gets the standard version number ('120', '140', etc.) based on
- GYP_MSVS_VERSION."""
- vs_version = GetVisualStudioVersion()
- if vs_version == '2015':
- return '140'
- if vs_version == '2017':
- return '150'
- raise ValueError('Unexpected GYP_MSVS_VERSION')
-
-
def _CopyRuntimeImpl(target, source, verbose=True):
"""Copy |source| to |target| if it doesn't already exist or if it needs to be
updated (comparing last modified time as an approximate float match as for
@@ -228,6 +218,55 @@ def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, dll_pattern, suffix):
os.path.join(source_dir, 'ucrtbase' + suffix))
+def _CopyPGORuntime(target_dir, target_cpu):
+ """Copy the runtime dependencies required during a PGO build.
+ """
+ env_version = GetVisualStudioVersion()
+ # These dependencies will be in a different location depending on the version
+ # of the toolchain.
+ if env_version == '2015':
+ pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'),
+ 'VC', 'bin')
+ pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64')
+ elif env_version == '2017':
+ # In VS2017 the PGO runtime dependencies are located in
+ # {toolchain_root}/VC/Tools/MSVC/{x.y.z}/bin/Host{target_cpu}/{target_cpu}/,
+ # the {version_number} part is likely to change in case of a minor update of
+ # the toolchain so we don't hardcode this value here (except for the major
+ # number).
+ vc_tools_msvc_root = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'),
+ 'VC', 'Tools', 'MSVC')
+ pgo_runtime_root = None
+ for directory in os.listdir(vc_tools_msvc_root):
+ if not os.path.isdir(os.path.join(vc_tools_msvc_root, directory)):
+ continue
+ if re.match('14\.\d+\.\d+', directory):
+ pgo_runtime_root = os.path.join(vc_tools_msvc_root, directory, 'bin')
+ break
+ assert pgo_runtime_root
+ # There's no version of pgosweep.exe in HostX64/x86, so we use the copy
+ # from HostX86/x86.
+ pgo_x86_runtime_dir = os.path.join(pgo_runtime_root, 'HostX86', 'x86')
+ pgo_x64_runtime_dir = os.path.join(pgo_runtime_root, 'HostX64', 'x64')
+ else:
+ raise Exception('Unexpected toolchain version: %s.' % env_version)
+
+ # We need to copy 2 runtime dependencies used during the profiling step:
+ # - pgort140.dll: runtime library required to run the instrumented image.
+ # - pgosweep.exe: executable used to collect the profiling data
+ pgo_runtimes = ['pgort140.dll', 'pgosweep.exe']
+ for runtime in pgo_runtimes:
+ if target_cpu == 'x86':
+ source = os.path.join(pgo_x86_runtime_dir, runtime)
+ elif target_cpu == 'x64':
+ source = os.path.join(pgo_x64_runtime_dir, runtime)
+ else:
+ raise NotImplementedError("Unexpected target_cpu value: " + target_cpu)
+ if not os.path.exists(source):
+ raise Exception('Unable to find %s.' % source)
+ _CopyRuntimeImpl(os.path.join(target_dir, runtime), source)
+
+
def _CopyRuntime(target_dir, source_dir, target_cpu, debug):
"""Copy the VS runtime DLLs, only if the target doesn't exist, but the target
directory does exist. Handles VS 2015 and VS 2017."""
@@ -236,54 +275,6 @@ def _CopyRuntime(target_dir, source_dir, target_cpu, debug):
_CopyUCRTRuntime(target_dir, source_dir, target_cpu, '%s140' + suffix,
suffix)
- # Copy the PGO runtime library to the release directories.
- if not debug and os.environ.get('GYP_MSVS_OVERRIDE_PATH'):
- pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'),
- 'VC', 'bin')
- pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64')
- pgo_runtime_dll = 'pgort' + _VersionNumber() + '.dll'
- if target_cpu == "x86":
- source_x86 = os.path.join(pgo_x86_runtime_dir, pgo_runtime_dll)
- if os.path.exists(source_x86):
- _CopyRuntimeImpl(os.path.join(target_dir, pgo_runtime_dll), source_x86)
- elif target_cpu == "x64":
- source_x64 = os.path.join(pgo_x64_runtime_dir, pgo_runtime_dll)
- if os.path.exists(source_x64):
- _CopyRuntimeImpl(os.path.join(target_dir, pgo_runtime_dll),
- source_x64)
- else:
- raise NotImplementedError("Unexpected target_cpu value:" + target_cpu)
-
-
-def CopyVsRuntimeDlls(output_dir, runtime_dirs):
- """Copies the VS runtime DLLs from the given |runtime_dirs| to the output
- directory so that even if not system-installed, built binaries are likely to
- be able to run.
-
- This needs to be run after gyp has been run so that the expected target
- output directories are already created.
-
- This is used for the GYP build and gclient runhooks.
- """
- x86, x64 = runtime_dirs
- out_debug = os.path.join(output_dir, 'Debug')
- out_debug_nacl64 = os.path.join(output_dir, 'Debug', 'x64')
- out_release = os.path.join(output_dir, 'Release')
- out_release_nacl64 = os.path.join(output_dir, 'Release', 'x64')
- out_debug_x64 = os.path.join(output_dir, 'Debug_x64')
- out_release_x64 = os.path.join(output_dir, 'Release_x64')
-
- if os.path.exists(out_debug) and not os.path.exists(out_debug_nacl64):
- os.makedirs(out_debug_nacl64)
- if os.path.exists(out_release) and not os.path.exists(out_release_nacl64):
- os.makedirs(out_release_nacl64)
- _CopyRuntime(out_debug, x86, "x86", debug=True)
- _CopyRuntime(out_release, x86, "x86", debug=False)
- _CopyRuntime(out_debug_x64, x64, "x64", debug=True)
- _CopyRuntime(out_release_x64, x64, "x64", debug=False)
- _CopyRuntime(out_debug_nacl64, x64, "x64", debug=True)
- _CopyRuntime(out_release_nacl64, x64, "x64", debug=False)
-
def CopyDlls(target_dir, configuration, target_cpu):
"""Copy the VS runtime DLLs into the requested directory as needed.
@@ -293,8 +284,6 @@ def CopyDlls(target_dir, configuration, target_cpu):
The debug configuration gets both the debug and release DLLs; the
release config only the latter.
-
- This is used for the GN build.
"""
vs_runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
if not vs_runtime_dll_dirs:
@@ -305,6 +294,8 @@ def CopyDlls(target_dir, configuration, target_cpu):
_CopyRuntime(target_dir, runtime_dir, target_cpu, debug=False)
if configuration == 'Debug':
_CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True)
+ else:
+ _CopyPGORuntime(target_dir, target_cpu)
_CopyDebugger(target_dir, target_cpu)
« no previous file with comments | « no previous file | build/win/run_pgo_profiling_benchmarks.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698