+import itertools
import os
import platform
import re
from lit.llvm.subst import FindTool
from lit.llvm.subst import ToolSubst
+lit_path_displayed = False
class LLVMConfig(object):
self.use_lit_shell = False
# Tweak PATH for Win32 to decide to use bash.exe or not.
if sys.platform == 'win32':
- # For tests that require Windows to run.
- features.add('system-windows')
-
- # Seek sane tools in directories and set to $PATH.
- path = self.lit_config.getToolsPath(config.lit_tools_dir,
+ # Seek necessary tools in directories and set to $PATH.
+ path = None
+ lit_tools_dir = getattr(config, 'lit_tools_dir', None)
+ required_tools = ['cmp.exe', 'grep.exe', 'sed.exe', 'diff.exe', 'echo.exe']
+ path = self.lit_config.getToolsPath(lit_tools_dir,
config.environment['PATH'],
- ['cmp.exe', 'grep.exe', 'sed.exe'])
+ required_tools)
+ if path is None:
+ path = self._find_git_windows_unix_tools(required_tools)
if path is not None:
self.with_environment('PATH', path, append_path=True)
# Many tools behave strangely if these environment variables aren't set.
self.with_system_environment(['SystemDrive', 'SystemRoot', 'TEMP', 'TMP'])
self.use_lit_shell = True
+ global lit_path_displayed
+ if not self.lit_config.quiet and lit_path_displayed is False:
+ self.lit_config.note("using lit tools: {}".format(path))
+ lit_path_displayed = True
+
# Choose between lit's internal shell pipeline runner and a real shell. If
# LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override.
lit_shell_env = os.environ.get('LIT_USE_INTERNAL_SHELL')
self.with_environment(
'DYLD_INSERT_LIBRARIES', gmalloc_path_str)
+ def _find_git_windows_unix_tools(self, tools_needed):
+ assert(sys.platform == 'win32')
+ if sys.version_info.major >= 3:
+ import winreg
+ else:
+ import _winreg as winreg
+
+ # Search both the 64 and 32-bit hives, as well as HKLM + HKCU
+ masks = [0, winreg.KEY_WOW64_64KEY]
+ hives = [winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER]
+ for mask, hive in itertools.product(masks, hives):
+ try:
+ with winreg.OpenKey(hive, r"SOFTWARE\GitForWindows", 0,
+ winreg.KEY_READ | mask) as key:
+ install_root, _ = winreg.QueryValueEx(key, 'InstallPath')
+
+ if not install_root:
+ continue
+ candidate_path = os.path.join(install_root, 'usr', 'bin')
+ if not lit.util.checkToolsPath(candidate_path, tools_needed):
+ continue
+
+ # We found it, stop enumerating.
+ return lit.util.to_string(candidate_path)
+ except:
+ continue
+
+ return None
+
def with_environment(self, variable, value, append_path=False):
if append_path:
# For paths, we should be able to take a list of them and process all
paths = []
# If we are passed a list [a b c], then iterating this list forwards
- # and adding each to the beginning would result in b c a. So we
+ # and adding each to the beginning would result in c b a. So we
# need to iterate in reverse to end up with the original ordering.
for p in reversed(paths_to_add):
# Move it to the front if it already exists, otherwise insert it at the