[llvm-branch-commits] [llvm] 0f1f13f - Re-land: [lit] Support running tests on Windows without GnuWin32

Alexandre Ganea via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Dec 10 18:46:44 PST 2020


Author: Alexandre Ganea
Date: 2020-12-10T21:41:54-05:00
New Revision: 0f1f13fcb17fbc8c93d505da989a04ab5cbd9ed3

URL: https://github.com/llvm/llvm-project/commit/0f1f13fcb17fbc8c93d505da989a04ab5cbd9ed3
DIFF: https://github.com/llvm/llvm-project/commit/0f1f13fcb17fbc8c93d505da989a04ab5cbd9ed3.diff

LOG: Re-land: [lit] Support running tests on Windows without GnuWin32

Historically, we have told contributors that GnuWin32 is a pre-requisite
because our tests depend on utilities such as sed, grep, diff, and more.
However, Git on Windows includes versions of these utilities in its
installation. Furthermore, GnuWin32 has not been updated in many years.
For these reasons, it makes sense to have the ability to run llvm tests
in a way that is both:

a) Easier on the user (less stuff to install)
b) More up-to-date (The verions that ship with git are at least as
   new, if not newer, than the versions in GnuWin32.
We add support for this here by attempting to detect where Git is
installed using the Windows registry, confirming the existence of
several common Unix tools, and then adding this location to lit's PATH
environment.

Differential Revision: https://reviews.llvm.org/D84380

Added: 
    

Modified: 
    llvm/utils/lit/lit/llvm/config.py

Removed: 
    


################################################################################
diff  --git a/llvm/utils/lit/lit/llvm/config.py b/llvm/utils/lit/lit/llvm/config.py
index 498e34cae3a5..949c5e694db7 100644
--- a/llvm/utils/lit/lit/llvm/config.py
+++ b/llvm/utils/lit/lit/llvm/config.py
@@ -1,3 +1,4 @@
+import itertools
 import os
 import platform
 import re
@@ -8,6 +9,7 @@
 from lit.llvm.subst import FindTool
 from lit.llvm.subst import ToolSubst
 
+lit_path_displayed = False
 
 class LLVMConfig(object):
 
@@ -20,19 +22,26 @@ def __init__(self, lit_config, config):
         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')
@@ -117,6 +126,35 @@ def __init__(self, lit_config, config):
                 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
@@ -136,7 +174,7 @@ def norm(x):
                 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


        


More information about the llvm-branch-commits mailing list